Глава 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). При этом детали реализации, не представляющие интереса для остальных моду-