|
|
|
Advertisement
|
Summary
In this installment of the Design Techniques column, brush up on how -- and why -- to divide a class's functionality among its methods. I demonstrate how to maximize method cohesion while keeping the total number of methods to a manageable level.
In last month's Design Techniques column, I told half of the method design story: minimizing method coupling. In this month's installment, I'll reveal the other half of the story: maximizing method cohesion.
As with last month's column, "Designing fields and methods," the principles discussed may be familiar to many readers, as they apply to just about any programming language. But given the vast quantity of code I have encountered in my career that didn't benefit from these basic principles, I feel it is an important public service to address the basics in the early installments of this column. In addition, I have attempted in this article to show how the basic principles apply in particular to the Java programming language.
Cohesion
Methods do things. On a low level, they do things such as accept data
as input, operate on that data, and deliver data as output. On a higher
level, they do things such as "clone this object," "print this string
to the standard output," "add this element to the end of this vector,"
and "add this much coffee to this cup object."
Minimizing coupling (the topic of last month's article) requires you to look at methods on a low level. Coupling looks at how the inputs and outputs of a method connect it to other parts of the program. By contrast, maximizing cohesion requires that you look at methods on a high level. Cohesion looks at the degree to which a method accomplishes one conceptual task. The more a method is focused on accomplishing a single conceptual task, the more cohesive that method is.
Why maximize cohesion?
The more cohesive you make your methods, the more flexible (easy to
understand and change) your code will be. Cohesive methods help make
your code more flexible in two ways:
int convertOzToMl(int
ounces), which converts ounces to milliliters, is easier to
comprehend at first glance than a method named int convert(int
fromUnits, int toUnits, int fromAmount). At first glance, you
could guess that the convert() method may be able
to convert ounces to milliliters, but even if that were so, you would
need to do more digging to find out what fromUnits value
represents ounces and what toUnits value represents
milliliters. The convertOzToMl() method is more cohesive
than the convert() method because it does just one thing,
and its name indicates what that thing is.
|
Sponsored Links
|