Абстрагирование и инкапсуляция



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

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

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

Задача абстрагирования: выбор необходимого и достаточного набора свойств.

Протокол– полный набор операций взаимодействия объекта с другим объектом.

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

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

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

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

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

Степени ограничения доступа, которые поддерживает С++

- public – определяет интерфейсную часть (абсолютно доступно);

- protected – определяет часть доступную для потомков класса;

- private – определяет полностью закрытую часть.

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

В UML абстрактный класс обозначается курсивом.

 

Модульность программных систем

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

Модульность - это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями. Связи между модулями - это их представления друг о друге.

В C++ модулями являются раздельно компилируемые файлы. Для C++ традиционным является помещение интерфейсной части модулей в отдельные файлы с расширением .h (так называемые файлы-заголовки). Реализация, то есть текст модуля, хранится в файлах с расширением .сpp. Связь между файлами объявляется директивой макропроцессора #include.

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

Конечной целью декомпозиции программы на модули является снижение затрат на программирование за счет независимой разработки и тестирования. Структура модуля должна быть достаточно простой для восприятия; реализация каждого модуля не должна зависеть от реализации других модулей; должны быть приняты меры для облегчения процесса внесения изменений там, где они наиболее вероятны. На практике перекомпиляция тела модуля не является трудоемкой операцией: заново компилируется только данный модуль, и программа перекомпонуется. Перекомпиляция интерфейсной части модуля, напротив, более трудоемка. В строго типизированных языках приходится перекомпилировать интерфейс и тело самого измененного модуля, затем все модули, связанные с данным, модули, связанные с ними, и так далее по цепочке. В итоге для очень больших программ могут потребоваться многие часы на перекомпиляцию, что явно нежелательно. Постепенный перенос описаний из реализации в интерфейсную часть гораздо менее опасен, чем "вычищение" избыточного интерфейсного кода.

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

Модульность - это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.

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

Выводы:

Модульность - разделение про­граммного материала на фрагменты с целью уменьшения его сложности.

Модуль состоит: реализация, интерфейс. Изнутри модуля можем видеть только интерфейс­ную часть другого модуля.

Отношение между модулями - отно­шение компиляционной зависимости, отношение импорта-экспорта.

 


Дата добавления: 2018-06-01; просмотров: 559; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!