376 Глава 17. Проектные классы
Полнота характеризует соответствие предоставляемых классом серви
сов тому, что ожидают клиенты. Предположения о наборе доступных
операций клиенты будут делать исходя из имени класса. Обратимся
к примеру из реальной жизни: при покупке новой машины вполне ра
зумно ожидать, что у нее будут колеса! То же самое с классами: делать
вывод о том, какие операции должны быть доступны, клиенты будут
из имени класса и описания его семантики. Например, от класса Bank
Account (банковский счет), предоставляющего операцию withdraw(...),
будут ожидать и наличия операции deposit(...). Опятьтаки, если про
ектируется такой класс, как ProductCatalog (каталог продуктов), любой
клиент может небезосновательно ожидать, что сможет добавлять, уда
лять и вести поиск продуктов (Product) по каталогу. Такая семантика
ясно следует из имени класса. Полнота гарантирует, что классы удов
летворяют всем справедливым ожиданиям клиента.
Полный и достаточный класс предлагает пользователям такой контракт,
какой они ожидают – не больше и не меньше.
Достаточность, с другой стороны, гарантирует, что все операции клас
са полностью сосредоточены на реализации его предназначения. Класс
никогда не должен удивлять клиента. Он должен содержать только
ожидаемый набор операций, не более этого. Например, обычная ошиб
ка новичков: взять простой достаточный класс, такой как BankAccount,
и затем добавить в него операцию по обработке кредитных карт или по
управлению политиками страхования и т. д. Достаточность заключа
ется в максимально возможном сохранении простоты и узкой специа
лизированности проектного класса.
Золотое правило обеспечения полноты и достаточности: класс должен
делать то, что ожидают от него пользователи, не больше и не меньше.
17.5.2. Простота
Операции должны проектироваться таким образом, чтобы предлагать
единственный, простой, элементарный сервис. Класс не должен пред
лагать множество способов выполнения одного и того же, поскольку
это запутывает клиентов и может привести к усложнению техническо
го обслуживания и проблемам совместимости.
Простота – сервисы должны быть простыми, элементарными и уникаль
ными.
Например, если в классе BankAccount есть простая операция создания
одного депозитного вклада, в нем не должно быть более сложных опе
раций, создающих два или более депозитов. Такого же эффекта можно
добиться, повторяя простую операцию. Класс всегда должен предла
гать самый простой и самый малый набор возможных операций.