Java Reference
In-Depth Information
Introducing Responsibility (Chapter 7)
SOLUTION 7.1
Some problems with the given diagram follow:
The Rocket.thrust() method returns a Rocket instead of a number or a physical
quantity.
The LiquidRocket class has a getLocation() method, although nothing in the
diagram or in the problem domain suggests that we model rockets as having a
location. Even if we did, there is no reason for liquid-fueled rockets to have a location,
whereas other Rocket objects do not.
The isLiquid() method may be an acceptable alternative to using the
instanceof operator, but then we'd expect the superclass to also have an
isLiquid() method that would return false .
CheapRockets is plural, although class names are conventionally singular.
We could model cheapness with attributes alone, so there is no justification for
creating a class just for cheap rockets. The CheapRockets class also introduces a
factoring that conflicts with factoring the rocket model as liquid or solid. For example,
it is not clear how to model a cheap liquid rocket.
The CheapRockets class implements Runnable , although this interface has
nothing to do with cheap rocket objects from the problem domain.
The model shows that Firework is a subclass of LiquidRocket , declaring that all
fireworks are liquid rockets, which is false.
The model shows a direct relation between reservations and types of firework,
although no such relation exists in the problem domain.
The Reservation class has its own copy of city , which it should get by delegation
to a Location object.
A CheapRocket is composed of Runnable objects, which is simply bizarre.
SOLUTION 7.2
The value of this challenge is not to get the right answer but rather to exercise your thinking
about what makes up a good class. Consider whether your definition addresses the following
points.
A nuts-and-bolts description of a class is, "A class is a named collection of fields that
hold data values and methods that operate on those values" (Flanagan 1999b, p. 61).
A class establishes a collection of fields: that is, it defines the attributes of an object.
The attribute types are other classes, primitive data types, such as boolean and int ,
or interfaces.
A class designer should be able to justify how a class's attributes are related.
The name of a class should reflect the meaning of the class both as a collection of
attributes and with respect to the class's behavior.
A class must support all the behaviors it defines, as well as all those in superclasses,
and all methods in interfaces that the class implements. (A decision to not support
a superclass or an interface method is occasionally justifiable.)
A class should have a justifiable relationship to its superclass.
Search WWH ::




Custom Search