Глава 3. Объектно-ориентированные анализ и проектирование 63
class SavingsAccount ( public:
Balance currentBalance(void);
private:
TransactionRegister transactions;
В первом варианте класса SavingsAccount реализация функции currentBalance может быть совершенно тривиальной, например:
Balance SavingsAccount::currentBalance(void) {
return currentBalance;
}
Считая, ЧТО у Класса TransactionRegister ССТЬ функция-член computeBalance
(подсчет баланса), функцию currentBalance для второго варианта класса SavingsAccount можно записать так:
Balance SavingsAccount::currentBalance(void) {
transactions.computeBalance() ;
}
Прелесть в том, что для класса, обращающегося к SavingsAccount, конечный результат вне зависимости от конкретной реализации функции currentBalance один и тот же — он получает текущую сумму на счете. Инкапсуляция позволяет пользователям объекта игнорировать подробности реализации, что снижает сложность систем. То, что конечные пользователи объекта не имеют отношения к его реализации, очень выгодно, в частности, при работе над крупномасштабными программными проектами и библиотеками. Реализация класса SavingsAccount — это забота исключительно его авторов.
Модульность
Инкапсуляция позволяет скрыть от конечного пользователя детали реализации и сделать вашу систему менее сложной и более понятной. Концепция модульности (modularity) идет дальше. Теперь, когда ваши объекты определены и ненужные подробности спрятаны, попытайтесь сгруппировать объекты в логические модули, объединяющие взаимозависимые объекты и классы, а другим модулям пусть будут доступны только те детали интерфейса, которые абсолютно необходимы. Внесите эти интерфейсные части в файлы заголовков (по традиции они имеют расширение .h или -hpp). При этом детали реализации, не представляющие интереса для остальных моду-