Объектно-ориентированное программирование

Мы используем программную абстракцию типичной игры в карты, чтобы познакомить вас с различными объектно-ориентированнымиязыками программирования, которые рассматриваются в этой книге. В следующей главе мы используем разработанный здесь классCard для написания пасьянса»косынка». КлассCard, подобно настоящим игральным картам, мало что знает о своем предполагаемом использовании и может применяться в карточной игре любого типа.

Рис. 3.2. CRC-карточкадля классаCard

 

На рис. 3.2 показанаCRC-карточка, которая описывает поведение игральной карты. Обязанности классаCard очень ограничены. В своей основе он является просто администратором данных, который хранит и возвращает значения масти и ранга, а также рисует карту.

Как мы отмечали в главе 2, CRC-карточкимного раз уточняются и перерисовываются, медленно эволюционируя от естественного языка к программному коду. Как мы помним, на следующем этапе каждый метод снабжается именем и списком аргументов. Не исключено, что описание вылезет за карточку, и тогда их придется скреплять скрепками(имеет смысл вообще отказаться от карточек, заменив ихчем-товроде отчетов).

CRC-карточка, изображенная на рис. 3.3, соответствует следующему этапу. Заметьте, что даже если обязанность состоит всего лишь в возврате значения(например, признака»картинка вверх»), мы все равно определяем функцию для посредничества в выполнении запроса. Имеются как практические, так и теоретические соображения в пользу этого. Мы вернемся к ним в главе17.

Как было предложено ранее, можно выделить и записать на оборотной сторонеCRC- карточки значения данных, которые должны содержаться в каждом экземпляре класса игральной карты. Следующий этап состоит в переводе поведения и состояния, описанных наCRC-карточке, в выполняемый код. Мы рассмотрим этот этап после того, как исследуем дихотомию между объявлением и определением.

Рис. 3.3. Уточнение CRC-карточкидля классаCard

3.4. Интерфейс и реализация

В главе 1 мы рассказали об истории объектно-ориентированного программирования, о том, что оно основывается на предшествующих идеях модульности и маскировки информации. В процессе эволюции некоторые соображения и концепции были отброшены, когда оказалось, что они расходятся с концепцией  объектно- ориентированного проектирования, но другие понятия сохранились. В частности, принципы Парнаса применимы к объектно-ориентированнойтехнологии в той же мере, как и к модульному подходу. Мы можем следующим образом перефразировать идеи Парнаса в терминах объектов:

∙Объявление класса должно обеспечивать клиента всей информацией, необходимой для успешной работы с классом, и никакой другой.

∙Методам должна быть доступна вся информация, необходимая для выполнения их обязанностей, и никакая другая.

 

Принципы Парнаса делят мир объекта на две части. Имеется внешний образ, наблюдаемый пользователем объекта, — мы будем называть это представление об объекте интерфейсом(interface), поскольку оно описывает, как объект взаимодействует с внешним миром. Обратная сторона объекта связана с его реализацией(implementation). Пользователю разрешен доступ только к тому, что описано в интерфейсной части. Реализация определяет, как достигается выполнение обязанностей, заявленных в интерфейсной части.

За исключением языка Smalltalk все языки программирования, которые мы рассматриваем, поддерживают разбиение класса на блок интерфейса и блок реализации. Мы опишем соответствующий механизм в разделах, посвященных особенностям каждого языка. Заметьте, что разделение интерфейса и реализации не является в точности инкапсуляцией данных, рассмотренной ранее. Первое является абстрактным понятием, второе— механизмом его воплощения. Другими словами, модули используются в процессе реализации объектов, принадлежащих к абстрактным типам данных, но модули сами по себе не являются абстрактными типами данных.

3.5. Классы и методы в ООП

В следующих разделах подробно описывается механизм определения классов и методов для каждого из языков программирования, которые мы рассматриваем. Обратите внимание, что некоторые объектно-ориентированныеязыки рассматривают классы как специализированную форму записей, в то время как другие языки используют иные подходы.

3.5.1. Классы и методы в языке Object Pascal