Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

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

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

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

Преимущество модульного разбиения состоит в легкости повторного использования разработанного модуля в другой программе. В случае такой необходимости другой клиентский код может включить заголовочный файл модуля при помощи директивы #include и просто добавить файлы модуля в разрабатываемый проект без копирования. Ниже в виде стрелок представлены зависимости включения между файлами программ. Овалом выделена граница модуля. Файл реализации заполнен другим цветом, поскольку должен логически являться ”черным ящиком” для всех клиентских модулей, при этом интерфейс модуля определяется в открытом заголовочном файле::

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

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

Объектная декомпозиция

Функции и структуры, обрабатывающие понятие последовательности, фактически представляют собой единую целую систему. Структура не имеет особого смысла без обрабатывающих ее функций, а функции теряют элегантность группировки обрабатываемых данных в единые составные переменные. С++ позволяет выразить эту взаимосвязь в более явном виде, разрешая поместить связанные функции внутрь определения структуры.

Функции, определенные внутри структуры, называют ФУНКЦИЯМИ-ЧЛЕНАМИ, или МЕТОДАМИ. В свою очередь, переменные, определенные внутри структуры, называются ПЕРЕМЕННЫМИ-ЧЛЕНАМИ, или ПОЛЯМИ. Поскольку после помещения функций внутрь структуры появляется четко выраженная логическая связь между данными и кодом их обработки, названия следует упростить, убрав из них фрагменты, представляющие собой имя структуры.

Файл реализации видоизменяется следующим образом - перед именами функций ставится имя структуры и оператор разрешения области видимости.

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]