Five stages of object design
The design life of an object is not
limited to the time when you’re writing the program. Instead, the design
of an object appears over a sequence of stages. It’s helpful to have this
perspective because you stop expecting perfection right away; instead, you
realize that the understanding of what an object does and what it should look
like happens over time. This view also applies to the design of various types of
programs; the pattern for a particular type of program emerges through
struggling again and again with that problem (Design Patterns are covered
in Volume 2). Objects, too, have their patterns that emerge through
understanding, use, and reuse.
1. Object
discovery. This stage occurs during the
initial analysis of a program. Objects may be discovered by looking for external
factors and boundaries, duplication of elements in the system, and the smallest
conceptual units. Some objects are obvious if you already have a set of class
libraries. Commonality between classes suggesting base classes and inheritance
may appear right away, or later in the design process.
2. Object
assembly. As you’re building an
object you’ll discover the need for new members that didn’t appear
during discovery. The internal needs of the object may require other classes to
support it.
3. System
construction. Once again, more
requirements for an object may appear at this later stage. As you learn, you
evolve your objects. The need for communication and interconnection with other
objects in the system may change the needs of your classes or require new
classes. For example, you may discover the need for facilitator or helper
classes, such as a linked list, that contain little or no state information and
simply help other classes function.
4. System
extension. As you add new features to a
system you may discover that your previous design doesn’t support easy
system extension. With this new information, you can restructure parts of the
system, possibly adding new classes or class hierarchies.
5. Object
reuse. This is the
real stress test for a class. If someone tries to reuse it in an entirely new
situation, they’ll probably discover some shortcomings. As you change a
class to adapt to more new programs, the general principles of the class will
become clearer, until you have a truly reusable type. However, don’t
expect most objects from a system design to be reusable – it is perfectly
acceptable for the bulk of your objects to be system-specific. Reusable types
tend to be less common, and they must solve more general problems in order to be
reusable.