14 May 2003

Is it good OO design to have data in my classes with the protected AccessModifier?

OO designers differ about whether you should make all your data private or whether they allow some to be public.

(Before I dive into this murky pool, I should point out that the meaning of the protected AccessModifier varies in subtle but important ways from language to language.)

I think the reason this topic gets so difficult is because people look at it either from the angle of in-team or cross-team development, and it's this point of view that dominates.

On one hand, if I'm writing a subsystem and decide to implement some behavior through a hierarchy, then I'm quite happy to have the subclasses have deep access into their superclasses. After all it's all my code - I'm using the subclasses to provide polymorphic behavior, not to provide modularity.

On the other, if I'm building a framework and providing hook classes that I expect to be overridden, I may want to protect data so that I can make changes in the future without breaking people's subclasses. Indeed it's more insidious than this because subclasses can easily break superclasses if you're not careful - this is referred to as the fragile base class problem.

So I don't think you can say that making data protected is always a good or bad thing. If you're intending that clients outside your control will override a certain class, then you should treat your protected features as part of your published interface, and as a result take more care. Publishing fields is a bad idea, so I wouldn't do it in that case.

But if that's not your intention, and it helps you to have access to data in subclasses you write, then it seems reasonable to me. But I'll admit my default is to make fields private and I only rarely change it to protected.

A related question is whether you should use SelfEncapsulation.