Возьмем метод из листинга 2.1. Нужен ли переменным более содержательный контекст? Имя функции определяет только часть контекста; алгоритм предоставляет все остальное. При чтении функции становится видно, что три переменные number, verb и pluralModifier являются компонентами сообщения guessМessage. К сожалению, контекст приходится вычислять. При первом взгляде на метод смысл переменных остается неясным.
Листинг 2.1. Переменные с неясным контекстом
>private void printGuessStatistics(char candidate, int count) {
> String number;
> String verb;
> String pluralModifier;
> if (count == 0) {
> number = "no";
> verb = "are";
> pluralModifier = "s";
> } else if (count == 1) {
> number = "1";
> verb = "is";
> pluralModifier = "";
Листинг 2.1 (продолжение)
> } else {
> number = Integer.toString(count);
> verb = "are";
> pluralModifier = "s";
> }
> String guessMessage = String.format(
> "There %s %s %s%s", verb, number, candidate, pluralModifier
> );
> print(guessMessage);
> }
Функция длинновата, а переменные используются на всем ее протяжении. Чтобы разделить функцию на меньшие смысловые фрагменты, следует создать класс GuessStatisticsMessage и сделать три переменные полями этого класса. Тем самым мы предоставим очевидный контекст для трех переменных — теперь абсолютно очевидно, что эти переменные являются частью GuessStatisticsMessage. Уточнение контекста также позволяет заметно улучшить четкость алгоритма за счет его деления на меньшие функции (листинг 2.2).
Листинг 2.2. Переменные с контекстом
>public class GuessStatisticsMessage {
> private String number;
> private String verb;
> private String pluralModifier;
> public String make(char candidate, int count) {
> createPluralDependentMessageParts(count);
> return String.format(
> "There %s %s %s%s",
> verb, number, candidate, pluralModifier );
> }
> private void createPluralDependentMessageParts(int count) {
> if (count == 0) {
> thereAreNoLetters();
> } else if (count == 1) {
> thereIsOneLetter();
> } else {
> thereAreManyLetters(count);
> }
> }
> private void thereAreManyLetters(int count) {
> number = Integer.toString(count);
> verb = "are";
> pluralModifier = "s";
> }
> private void thereIsOneLetter() {
> number = "1";
> verb = "is";
> pluralModifier = "";
> }
> private void thereAreNoLetters() {
> number = "no";
> verb = "are";
> pluralModifier = "s";
> }
>}