Основные принципы и этапы объектно-ориентированного
В теории программирования ООП определяется как технология создания сложного программного обеспечения, которая основана на представлении программы в виде совокупности программных объектов, каждый из которых является экземпляров определенного типа (класса), а классы образуют иерархию с наследованием свойств [2].
Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений (рис. 1.6).
О сновное достоинство ООП – сокращение количества межмодульных вызовов и уменьшение объемов информации, передаваемой между модулями, по сравнению с модульным программированием. Это достигается за счет более полной локализации данных и интегрирования их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных частей (объектов) программы.
Данные Данные Данные Данные
Подпрограммы с Подпрограммы с
локальными данными локальными данными
Рис. 1.6. Архитектура программы при ООП
Кроме того, объектный подход предлагает новые технологические средства разработки, такие, как наследование, полиморфизм, композиция, наполнение, позволяющие конструировать сложные классы из сравнительно простых. В результате существенно увеличивается показатель повторного использования кодов, появляется возможность создания библиотек классов для различных применений, и разработчикам предоставляются дополнительные возможности создания систем повышенной сложности.
Основной недостаток ООП – некоторое снижение быстродействия за счет более сложной организации программной системы.
В основу ООП положены принципы абстрагирования, ограничения доступа, модульности, иерархичности, типизации, параллелизма, устойчивости.
Рассмотрим, что представляет собой каждый принцип.
Абстрагирование — процесс выделения абстракций в предметной области задачи. Абстракция – совокупность существенных характеристик некоторого объекта, которые отличают его со всех других видов объектов и, таким образом, четко определяют особенности данного объекта с точки зрения дальнейшего рассмотрения и анализа решаемой задачи. В соответствии с определением применяемая абстракция реального предмета существенно зависит от решаемой задачи: в одном случае нас будет интересовать форма предмета, в другой – вес, в третьем – материалы, из которых он сделан, в четвертом — закон движения предмета и т.д. ООП предполагает объединение всех свойств абстракции (как касающихся состояния анализируемого, так и определяющих его поведение) в единую программную единицу – некий абстрактный тип (класс).
Ограничение доступа — сокрытие отдельных элементов реализации абстракции, не затрагивающих существенных характеристик ее как целого.
Необходимость ограничения доступа предполагает разграничение двух частей в описании абстракции:
- интерфейс – совокупность доступных извне элементов реализации абстракции (характеристики состояния и поведения);
- реализация – совокупность недоступных извне элементов реализации абстракции (внутренняя организация абстракции и механизмы реализации ее поведения).
Ограничение доступа в ООП позволяет разработчику, во-первых, выполнять конструирование системы поэтапно, не отвлекаясь на особенности построения используемых абстракций, во-вторых – легко модифицировать реализацию отдельных объектов, что в правильно организованной системе не потребует изменения других объектов.
Сочетание объединения всех свойств объекта, определяющих его состояние и поведение, в единую абстракцию и ограничение доступа к реализации этих свойств получило название инкапсуляции.
Модульность – принцип разработки программной системы, предполагающий реализацию ее в виде отдельных частей (модулей). При выполнении декомпозиции системы на модули желательно объединять логически связанные части, по возможности обеспечивая сокращение количества внешних связей между модулями. Принцип унаследован от модульного программирования, следование ему упрощает проектирование и отладку программы.
Иерархия – это ранжированная или упорядоченная система абстракций. Принцип иерархичности предполагает использование иерархий при разработке программных систем.
В ООП используется два вида иерархии.
Иерархия “целое/часть” – показывает, что некоторые абстракции включены в рассматриваемую абстракцию как ее части, например, лампа состоит из цоколя, нити накаливания и колбы. Этот вариант иерархии используется в процессе разбиения системы на части на разных этапах проектирования (на логическом уровне – при декомпозиции предметной области на объекты, на физическом уровне – при декомпозиции системы на модули и при выделении отдельных процессов в мультипроцессорной системе).
Иерархия “общее/частное” – показывает, что некоторая абстракция является частным случаем другой абстракции, например, “обеденный стол – конкретный вид стола”, а “столы – конкретный вид мебели”. Используется при разработке структуры классов, когда сложные классы строятся на базе простых путем добавления к ним новых характеристик и, возможно, уточнения имеющихся.
Типизация – ограничение, накладываемое на свойства объектов и препятствующее взаимозаменяемости абстракций различных типов (или сильно сужающее возможность такой замены). В языках с жесткой типизацией для каждого программного объекта (переменной, подпрограммы, параметра и т.д.) объявляется тип, который определяет множество операций над соответствующим программным объектом. Рассматриваемые далее языки программирования на основе Паскаля используют строгую, а на основе С – среднюю степень типизации.
Примечание. Интересно, что в языке C++ строгость типизации возрастает по сравнению с C, хотя ограничения типизации в этом языке можно почти полностью подавить.
Использование принципа типизации обеспечивает:
- раннее обнаружение ошибок, связанных с недопустимыми операциями над программными объектами (ошибки обнаруживаются на этапе компиляции программы при проверке допустимости выполнения данной операции над программным объектом);
- упрощение документирования;
- возможность генерации более эффективного кода.
Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции – раннее связывание) и динамически (тип объекта определяется только во время выполнения программы – позднее связывание). Реализация позднего связывания в языке программирования позволяет создавать переменные — указатели на объекты, принадлежащие различным классам (полиморфные объекты), что существенно расширяет возможности языка.
Параллелизм – свойство нескольких абстракций одновременно находиться в активном состоянии, т.е. выполнять некоторые операции.
Существует целый ряд задач, решение которых требует наличия одновременного выполнения некоторых последовательностей действий. К таким задачам, например, относятся задачи автоматического управления несколькими процессами.
Реальный параллелизм достигается только при реализации задач такого типа на многопроцессорных системах, когда имеется возможность выполнения каждого процесса отдельным процессором. Системы с одним процессором имитируют параллелизм за счет разделения времени процессора между различными процессами. В зависимости от типа используемой операционной системы (одно- или мультипрограммной) разделение времени может выполняться либо разрабатываемой системой (как в MS DOS), либо непосредственно операционной системой (как в системах Windows).
Объектно-ориентированные языки программирования. Язык считается объектно- ориентированным, если в нем реализованы первые четыре из рассмотренных семи принципов.
В теории программирования. Они отличаются тем, что не поддерживают наследования свойств в иерархии абстракций, например, Ада – объектный язык, а C++ и объектные версии Паскаля – объектно-ориентированные языки.
Этапы разработки программных систем с использованием ООП. Процесс разработки программного обеспечения с использованием ООП включает четыре этапа: анализ и уточнение спецификаций, проектирование, реализация, модификация. Рассмотрим их подробнее.
Анализ и уточнение спецификаций. Цель этапа – максимально полное описание задачи. На этом этапе выполняют анализ предметной области задачи, объектную декомпозицию разрабатываемой системы и определяют важнейшие особенности поведения объектов (описание абстракций). По результатам анализа разрабатывают диаграмму объектов программного продукта, на которой показывают основные абстракции (объекты) предметной области и сообщения, передаваемые между ними. Все выявленные абстракции и отношения между ними описывают.
Проектирование. Различают:
- логическое проектирование, при котором принимаемые решения практически не зависят от условий эксплуатации (операционной системы и используемого оборудования);
- физическое проектирование, при котором приходится принимать во внимание указанные факторы.
Логическое проектирование заключается в разработке структуры классов: определяются поля для хранения составляющих состояния объектов и алгоритмы методов, реализующих аспекты поведения объектов. При этом используются специальные приемы разработки классов (наследование, композиция, наполнение, полиморфизм и т.д.). Результатом является иерархия или диаграмма классов, отражающая взаимосвязи классов, и описание структуры каждого класса.
Физическое проектирование включает объединение реализацией классов в модули, выбор схемы их подключения (статическая или динамическая компоновка), определение способов взаимодействия с оборудованием, с операционной системой и/или другим программным обеспечением (например, базами данных, сетевыми программами), обеспечение синхронизации процессов для систем параллельной обработки и т.д.
Реализация системы. Это процесс поэтапной реализации и подключения классов к проекту.
При этом начинают с создания основной программы или проекта будущего программного продукта. Затем реализуют и подключают классы так, чтобы создать грубый, но, по возможности, работающий прототип будущей системы. Например, таким прототипом может служить система, в которой реализован только интерфейс с пользователем (передача сообщений в отсутствующую пока часть системы не выполняется). Интерфейс тестируют и отлаживают. Полученный в результате работоспособный прототип продукта может быть показан заказчику для уточнения требований.
На следующих этапах к системе подключают классы, например, связанные с реализацией некоторого пункта меню. Полученный вариант системы также тестируют и отлаживают. Процесс продолжают до реализации всех возможностей системы.
Использование поэтапной реализации существенно упрощает тестирование и отладку программного продукта.
Модификация. Это процесс добавления новых функциональных возможностей или изменение существующих свойств системы. Как правило, изменения затрагивают реализацию класса, оставляя без изменения его интерфейс, что при использовании ООП обычно обходится без особых неприятностей, так как процесс изменений затрагивает локальную область. Изменение интерфейса – также не очень сложная задача, но ее решение может повлечь за собой необходимость согласования процессов взаимодействия объектов, что потребует изменений в других классах программы. Однако сокращение количества параметров в интерфейсной части по сравнению с модульным программированием существенно облегчает и этот процесс.
Простота модификации позволяет сравнительно легко адаптировать программные системы к изменяющимся условиям эксплуатации, что увеличивает время жизни систем, на разработку которых затрачиваются огромные временные и материальные ресурсы.
Существенным также является то, что при использовании ООП объект или группа объектов могут разрабатываться отдельно, и, следовательно, их проектирование может находиться на различных этапах. Например, интерфейсные классы уже реализованы, а структура классов предметной области еще только уточняется. Обычно проектирование начинается, когда какой-либо фрагмент предметной области достаточно полно описан в процессе анализа.
Рассмотрение основных приемов объектного подхода начнем с объектной декомпозиции.