Концепция объектно-ориентированной технологии

Современные виды модульности

Модуль – общетехнический термин, означающий элемент или блок, стандартным образом стыкуемый с другими модулями для построения составной конструкции. В классических языках программирования модуль – это единица компиляции и сборки, т.е. подпрограмма или головная программа. Независимая компиляция и библиотеки модулей – основа повторного их использования. В конце 70-х появились модули, в той или иной степени реализующие концепцию АТД. Таковы АТД в CLU, модуль в Модуле-2, unit в Турбо-Паскале, пакет в Аде и файл в С. Такой модуль состоит из двух частей – интерфейса и реализации. В интерфейсном разделе (заголовочный (header) файл в С) описаны видимые данные и процедуры и импортируемые извне (# include) – вся информация, достаточная для задействования модуля. В разделе реализации – тела интерфейсных процедур и инкапсулированные данные и процедуры, защищенные от случайного неправильного использования их другими частями программы. В языке С инкапсуляция внутри файла имеет место для static данных. Вопрос 3. Пример – интерфейс АТД «стек символов»:

// файл stack.h

int stack_id, size;

int Create_stack (int size); // создает стек и возвращает его идентификатор

void Push (stack_id, char); // затолкнуть символ

char Pop (stack_id); // вытолкнуть символ

Destroy_stack (stack_id); // уничтожает стек

В файле stack.с структура данных стека объявлена как static char v [size]; и закодированы все 4 интерфейсные процедуры.

Большое преимущество – возможность раздельной компиляции.h и.c файлов.

Вопрос 4.

АТД, реализованный как файл С, не дотягивает до полноценного типа данных, каким является любой стандартный (встроенный) тип:

· Необходимо самому кодировать процедуры создания и уничтожения экземпляра

· Этот тип не поддерживается компилятором в смысле контроля правильности использования

· Этот тип не передается функциям как параметр

В конце 80-х популярность завоевала методика ОО-проектирования и программиро-вания: языки Object Pascal, Eiffel, Object C, C++ и др. В этих языках класс – это также АТД, но более полноценный тип. Пример описания класса «стек символов» на С++:

class stack

{

// скрытая часть: инкапсулированные данные

int size; // размер

char* top // верх

char* bottom // дно

public: // интерфейс объектов класса stack

stack (int); // конструктор

~stack; // деструктор

void push (char);

void pop();

}

Вопрос 5.

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

ОО-технология улучшает качество ПП, а именно:

· Ясность, понятность, обозримость проекта и кода. Разрыв между понятиями предметной области и элементами программы сокращается: объекты имеют прототипы в реальности. Код может быть короче в 1.5-2 раза из-за наследования (общие свойства разделяются родственными объектами). Сокращается пространство имен: полиморфные методы имеют несколько реализаций.

· Корректность (безошибочность) - благодаря инкапсуляции и статическому контролю классов как типов объектов.

· Повторное использование библиотек классов лучше, чем библиотек подпрограмм. Вопрос 6.

ОО-технология хорошо соответствует нисходящей и инкрементальной стратегии разработки; раздельная компиляция описаний классов и их реализаций способствует раннему обнаружению ошибок сопряжения.

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

Недостаток ОО-программ - потери эффективности по времени из-за:

- динамического связывания полиморфных методов - в среднем в два раза дольше, чем обращение к обычной подпрограмме

- динамического порождения и уничтожения объектов, что дороже статического

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

ОО парадигма не ограничивается программированием приложений. Другие сферы:

1. Многооконные среды (MS Windows, X/Window для Unix): объекты - окна, методы - способы манипуляции ими, атрибуты (данные) - графические стили, наследование - дочерние окна наследуют атрибуты родительских.

2. Операционные системы (NextStep, Taligent): объекты - ресурсы ОС (такие, как память или файлы).

3. ОО базы данных (OpenODP, UniSQL) - нужны для данных со сложной структурой и неоднородных (много типов, но мало экземпляров) - мультимедиа, САПР, геоинформационные системы, базы знаний. Данные хранятся вместе с методами их семантической интерпретации, нужными для поиска и отображения (вывода).


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



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