Глава 3. Объектно-ориентированные анализ и проектирование______________61
дельфинам, и коровам, и людям? Все они теплокровные, живородящие и кормят свое потомство молоком. Распределение ролей и свойств можно наблюдать также и в недрах компьютерных программ — и целью объектно-ориентированного программирования является обнаружение этих зависимостей. В сущности в C++ объекты являются экземплярами класса, совсем как в других системах научной классификации. Однако прежде чем окунуться в объектно-ориентированную разработку, давайте рассмотрим некоторые из свойств, общие для класса "объектов".
Абстракция
В предыдущем разделе упоминалось, что цель объектно-ориентированного программирования состоит в том, чтобы увидеть в задаче абстракции (abstraction) объектов реального мира. Что за реальные объекты имелись в виду? Буквально любые, лишь бы они давали представление о функционировании ваших программ. Эти объекты могут быть материальными — ракеты, кулинарные книги, пеленки. Или они могут быть ролями — сторож, отец, художник. Они могут быть событиями — нехватка памяти, распродажа, закрывание двери. Улавливаете суть — все, что дает понятие о том, что в действительности представляет из себя ваш объект.
Давайте рассмотрим пример на C++. Будем считать, что вам нужно реализовать в программе функционирование сберегательного счета. Какие роли или свойства связаны с банковским счетом? Взглянем сначала на роли (функциональность). Счет может быть открыт с первоначальным балансом. Вдобавок к этому он должен обеспечивать механизм для приема денег на счет и возврата с него. Возможно, понадобится механизм записи изменения процентов. Наконец, вам нужна возможность закрыть счет. С точки зрения свойств банковский счет имеет сумму и проценты. Разумеется, вы можете напридумывать гораздо больше ролей и свойств, но для нашего примера этого вполне достаточно. На C++ вы можете выразить свое представление о банковском счете таким образом:
typedef float Balance;
typedef float Amount;
typedef float Rate;
class SavingsAccount { public:
SavingsAccount(Balance initialBalance);
virtual ~SavingsAccount(void);
void deposit(Amount depositAmount) ;
void withdraw(Amount withdrawalAmount) ;
void setInterestRate(Rate interestRate);
Balance currentBalance(void) ;
Rate currentInterestRate(void);