Базовые принципы ООП

К базовым принципам объектно-ориентированного стиля программирования относятся:

1) пакетирование или инкапсуляция;

2) наследование;

3) полиморфизм;

4) передача сообщений.

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

Процесс абстрагирования формализовать сложно, он связан с субъективным способом мышления. Абстрактное мышление присуще любому нормальному человеку. Его потеря связана с болезнью (шизофренией) – человек видит мельчайшие детали, составляющие объект, но не может соединить их в своем сознании в единый образ. Но в принципе, развить абстрактное мышление можно.

В ООП, абстрагируясь, описывают объект, представляющий полезную модель некой сущности в предметной области; рассматривают внешнее проявление объекта, с точки зрения его взаимодействия с другими объектами, и в соответствии с этим описывают его внутреннее устройство.

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

Объект характеризуется как совокупностью всех своих свойств (например, для животных – это наличие головы, ушей, глаз и т.д.) и их текущих значений (голова – большая, уши – длинные, глаза – желтые и т.д.), так и совокупностью допустимых для этого объекта действий (умение принимать пищу, сидеть, стоять, бежать и т.д.). Указанное объединение в едином объекте как «материальных» составных частей (голова, уши, хвост, лапы), так и действий, манипулирующих этими частями (действие «бежать» быстро перемещает лапы) называется инкапсуляцией.

В рамках ООП данные называются полями объекта, а алгоритмы – объектными методами.

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

Наследование

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

 
 


То при создании объектно-ориентированной иерархии принимается другой взгляд на тот же исходный объект. В объектно-ориентированной иерархии непременно отражается наследование свойств родительских (вышележащих) типов объектов дочерним (нижележащим) типам объектов.

По Гради Бучу «наследование – это такое отношение между объектами, когда один объект повторяет структуру и поведение другого».

Принцип наследования действует в жизни повсеместно и повседневно. Млекопитающие и птицы наследуют признаки живых организмов, в отличие от растений, орел и ворон наследуют общее свойство для птиц – умение летать. С другой стороны, львы, тигры, леопарды наследуют «структуру» и поведение, характерное для представителей отряда кошачьих и т.д.

Типы верхних уровней объектно-ориентированной иерархии, как правило, не имеют конкретных экземпляров объектов. Не существует, например, конкретного живого организма, который бы сам по себе назывался «млекопитающее» или «птица». Такие типы называют абстрактными. Конкретные экземпляры объектов имеют, как правило, типы самых нижних уровней ОО-иерархии: «крокодил Гена» – конкретный экземпляр объекта типа «крокодил», «кот Матроскин» – конкретный экземпляр объекта типа «кошка».

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

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

Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.

Когда вы строите новый класс, наследуя его из сущест­вующего класса, можно:

· добавить в новый класс новые компоненты-данные;

· добавить в новый класс новые компоненты-функции;

· заменить в новом классе наследуемые из старого класса компоненты-функции.

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

Полиморфизм – это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами. Например, действие «бежать» свойственно большинству животных. Однако каждое из них (лев, слон, крокодил, черепаха) выполняет это действие различным образом.

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

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

Таким образом, в нашем примере с объектами-животными действие «бежать» будет называться полиморфическим действием, а многообразие форм проявления этого действия – полиморфизмом.

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

Название Смысл
Конструктор Создает и инициализирует объект
Деструктор Освобождает объект, т.е. разрушает его
Модификатор Изменяет состояние объекта
Селектор Считывает состояние объекта без изменения этого состояния
Итератор Организует доступ ко всем частям объекта в строго определенной последовательности

Операции, выполняемые над объектом, называют методами. Методы должны быть перечислены на стадии описания объекта. Передача сообщения или воздействие на объект вызывает соответствующий метод этого объекта, который и осуществляет обработку этого сообщения (воздействия).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: