Growing Object-Oriented Software, Guided by Tests (Addison-Wesley Signature Series (Beck))
by Nat Pryce
updated 13h ago
by Nat Pryce
updated 13h ago
Wherever possible, an acceptance test should exercise the system end-to-end without directly calling its internal code. An end-to-end test interacts with the system only from the outside: through its user interface, by sending messages as if from third-party systems, by invoking its web services, by parsing reports, and so on.
Justin Reidy added 4mo ago
The API of a composite object should not be more complicated than that of any of its components.
Justin Reidy added 4mo ago
Objects can break encapsulation by sharing references to mutable objects, an effect known as aliasing.
Justin Reidy added 4mo ago
When we want to mark a new domain concept in the code, we often introduce a placeholder type that wraps a single field, or maybe has no fields at all. As the code grows, we fill in more detail in the new type by adding fields and methods. With each type that we add, we’re raising the level of abstraction of the code.
Justin Reidy added 4mo ago
we should be able to describe what an object does without using any conjunctions (“and,” “or”). If we find ourselves adding clauses to the description, then the object probably should be broken up into collaborating objects, usually one for each clause.
Justin Reidy added 4mo ago
an interface describes whether two components will fit together, while a protocol describes whether they will work together.
Justin Reidy added 4mo ago
Break up an object if it becomes too large to test easily, or if its test failures become difficult to interpret. Then unit-test the new parts separately.
Justin Reidy added 4mo ago
We try to think about objects in terms of roles, responsibilities, and collaborators, as best described by Wirfs-Brock and McKean in [Wirfs-Brock03]. An object is an implementation of one or more roles; a role is a set of related responsibilities; and a responsibility is an obligation to perform a task or know information. A collaboration is an int
... See moreJustin Reidy added 4mo ago
Driving an interface from its client avoids leaking excess information about its implementers, which minimizes any implicit coupling between objects
Justin Reidy added 4mo ago