Chris Aston has an eminently sensible post on programming in the small (not his words[*]), Coding Against the Grain, on some coding style and taste points that have been part of my habits nearly as long as I have programmed.
He emphasizes balance and clarity and cautions against turning objects into stand-ins for global variables: the function is given its due.
To elaborate on his points, I often treat objects as small bundles of encapsulated state with public methods that tie private fields to private functions. A simple example illustrates:
class UsefulExample { private int count; public String repeatMessage(String message) { return repeatMessage(message, count); } static String repeatMessage(String message, int count) { StringBuilder builder = new StringBuilder(message); for (int i = 1; i < count; ++i) builder.append(' ').append(message); return builder.toString(); } }
This example is not very interseting, but it makes it easy to list benefits:
- Testing the functions independent of the encapsulated state is easy.
- Changing the algorithm of functions does not affect public methods.
- If the functions are common across classes, refactoring them out to a common utility class is simple.
- Design changes in the encapsulated state do not impact functions.
In effect, the I have decoupled encapsulated state within the object from implementation algorithms within the functions, and use public methods to connect them together.
This is carrying a common design pattern from "programming in the large" into "programming in the small", with the same advantages. The decoupling of state from algorithm is an old idea [PDF].
More on programming in the small
Ivan Moore has a delightful series of posts on Programming in the Small well worth reading.
No comments:
Post a Comment