скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Программирование, ориентированное на объекты

тации объектов на альтеpнативной основе. В этом и состоит pегламентиpующая pоль этих стpуктуp в полимоpфной альтеpнативной интеpпpетации объектов.

Наличие общих частей в структурах рассмотренного примера Успевающий_Студент и Неуспевающий_Студент является весьма ха

ным для программирования. В этом смысле записи с вариантами мож

но рассматривать как форму лаконичного описания типов, поз

щую избавиться от повторов в описании свойств объектов. В объектно-ориентированных языках существует дополнительная воз

цию объектов не на альтеpнативной основе, а на основе pасшиpения свойств. Эта воз

ность связана с механизмом наследования свойств.

Механизм наследования позволяет лаконично описать различные клас

сы объектов путем выделения их общих свойств. Такое вы

водится на основе отношения "общего к частному" - обоб

ния. Обобщение может быть определено формально на основе от

чения подмножеств в множество.

Пусть А - класс объектов с имманентными свойствами Р(A): A = {a/P(A)}, a B = {b/P(B)}. Если P(A) IN P(B) (P(A) является под

жеством P(B), IN - отношение включения), то А "обобщает" В (A*>B, "*>" - отношение обобщения). В отношении (А*>B) А яв

ется надклассом, В - подклассом, при этом любой объект класса В характеризуется наследуемыми свойствами P(A) и приобретенными P(B)-P(A). Например, любой автомобиль обладает свойствами транс

ного средства и имеет некоторые особенные "автомобильные" свой

ства, которыми не обладает такое транспортное средство, как, напpимеp, лодка. В этом смысле

Транспортное_Средство *> Автомобиль, Лодка.

Причем Р(Автомобиль)^P(Лодка) = P(Транспортное_Средство). (Здесь символ "^" используется как "пересечение множеств"). Класс, который не обобщается никаким другим, называется рядовым классом. На основе пересечения множеств имманентных свойств классов могут быть построены межклассовые отношения единичного наследования, в ко

торых любой класс непосредственно обобщается лишь один другим. Например,

Транспортное_Средство

*

* * * *

Грузовик Легковой Байдарка Ял

автомобиль

*

Самосвал

Семантика обобщения как отношения общего к частному и стре

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

ледования не всегда "выглядят" адекватно. Например,

TYPE Узел = RECORD

A: Болт; B: Гайка;

END; .

Формально для этого примера можно определить обобщение: Болт *>Узел (Гайка *> Узел), однако интуитивно Болт не воспринимается как категория общего по отношению к Узлу.

Любой объект, конструируемый на основе отношения обобщения, пред

ставляется структурой стратифицированного (расслоенного) аг

та. Причем каждый слой (страта) в такой структуре пред

н для выполнения роли элемента хранения свойств соот

класса до родового включительно. Например, любой объект класса "Ял" (см. схему выше) будет определяться структурой:

TYPE Структура Яла = RECORD

А: Транспортное_Средство;

В: Лодка;

С: Ял;

END; .

Интерпретация Яла как транспортного средства связана только с ис

пользованием слоя А в элементе хранения. Интерпретация Яла как лодки - с использованием двух слоев: А и В, и, наконец, интер

ция Яла как особого вида лодки связана с использованием всех трех слоев: А,В,С. Декларация вида "Структура_Яла" в объектно-ориентированном языке заменяется отношением

Ял

Такая декларация определяет три возможные интерпретации объ

та на разных уровнях обобщения (pасшиpения свойств).

Еще pаз подчеpкнем, что между двумя рассмотренными видами по

ние свойств) существует принципиальное различие: записи с ва

антами реализуют полиморфную интерпретацию на альтернативной основе, а механизм наследованиния - на основе расширения свойств классов.

В практике использования методов программирования, ориен

ного на объекты, широко распространен так называемый метод оп

ределения объектов "наложением" (cоответствием). Этот метод мо

жет быть реализован разными способами, мы его рассмотрим на при

рах, используя концепцию типа как "трафарета" (маски), оп

щего вид интерпретации объекта "под маской". Конструируя сред

ми языка различные "маски", программист получает воз

морфной интерпретации объекта.

Пример1.

TYPE POINT = RECORD X,Y: INTEGER END;

Point = RECORD Y,X: INTEGER END;

VAR A: ARRAY[1..2] OF WORD;

P: POINTER TO POINT;

p: POINTER TO Point;

X,Y: INTEGER;

BEGIN X:=1; Y:=5;

P:=ADR(A); (*1*)

P^.X:=X; P^.Y:=Y; (*2*)

p:=ADDRESS(P); (*3*)

X:=p^.X; Y:=p^.Y (*4*)

Этот пример реализует "трансформацию" объекта-точки с де

ми координататами (1,5) в объект-точку с координатами (5,1). В про

грамме задан элемент хранения А размером в два слова, "маска" POINT, "привязанная" к указателю Р, и "маска" Point, связанная с ограниченным указателем р. Операция (1) связана с "наложением" мас

ки POINT на элемент хранения А и записью "через трафарет" зна

ний координат точки в область памяти А. Операция (3) свя

ложением на ту же область памяти маски (трафарета) Point и чте

ем координат точки через новый трафарет. Таким образом, один и тот же объект, размещенный в А, интерпретируется в этом примере двояко: как точка с координатами (1,5) и симметричная ей точ

ординатами (5,1). Заметим, что реально никакого пре

зования координат не происходит, - все определяетсся струк

рой трафарета - маски, через которуюю мы смотрим на объект. (Расссматривая этот пример, ответьте на вопрос, почему для записи операторов (2) и (4) не используется присоединение?)

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

ласть памяти, использование метода наложения связано с кон

меров таких масок, соответствия их размерам элементов хра

нения и т.д. "Выход" маски за пределы элемента хранения ин

го объекта чреват непредсказуемыми ошибками (работа с "чужой" об

стью памяти). Наложение нескольких масок на один и тот же объект же

лательно выполнять по адресу элемента хранения объекта без до

нительных смещений "внутрь" структуры объекта. Если несколько раз

но общие идентичные части располагать в начале маски (ввер

ции помогают избежать многих ошибок, связанных с полиморфной ин

претацией объекта. (Заметим, что такие ошибки имеют свойства скрытого "про

ются).

Во многих прикладных задачах метод наложения связан с ис

нием масок, определяемых структурами различных массивов. На

мер, задан массив кардинальных чисел и требуется его "транс

вать" в массив символов. Наложение в этом случае является наи

лее "естественным" методом такой трансформации:

VAR C: ARRAY [1..100] OF CARDINAL;

P: POINTER TO ARRAY [1..200] OF CHAR;

CH: ARRAY [1..200] OF CHAR;

BEGIN

P := ADR(C); FOR I:=1 TO 200 DO CH[I]:=P^[I] END;...

Такие задачи связаны, как правило, с перекодировкой, пре

нием, трансформацией и т.п. больших массивов. Успех ис

ния метода наложения здесь полностью определяется тем, удаст

добрать адекватную структуру маски-трафарета. Если удастся, то по

добные преобразования могут быть выполнены очень просто, без ис

зования специальных вычислений, связанных с различными форма

ми хранения данных, и неизменно сопутствующей им адресной ариф

да наложения может помочь "обойти" многие ограничения, связанные с языком про

ми массивов.

В заключение этой главы остановимся на самоинтерпретируемых объ

ектах. Возможности самоинтерпретации связаны с использованием объ

ектов процедурного типа, объектов-действий. Эта разновидность объ

ектов сравнительно мало используется в технике "пов

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

да им отводится особая роль, роль активных объектов - акторов, оп

тации.

Процедурный тип (или сигнатура, см. pазд. II) определяет мно

во возможных действий, видов активности. Например,

TYPE Действие = PROCEDURE (Станок);

определяет сигнатуру для класса Станок. Пусть множество дей

вий над Станком ограничивается двумя:

PROCEDURE Включить (С: Станок);

PROCEDURE Выключить (С: Станок); .

Декларация VAR D: Действие определяет объект класса Действие. Та

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

визироваться (самоинтерпретироваться) по отношению к стан

ку:

VAR D: Действие; C: Станок;

BEGIN...

D:=Включить;...

D(C);... D:= Выключить;... D(C); .

Операторы D(C) в этом фрагменте определяют самоинтерпретацию объ

екта D в отношении объекта С, а операторы присваивания - оп

ление объекта D потенциально возможным действием. Образно го

ря, операторы присваивания здесь "взводят курок" D, а когда D "вы

лит" и какой будет эффект от этого "выстрела" (включает он ста

нок С или выключает) определяется в общем случае логикой про

мы. Использование в программе переменных класса Действие ана

но наличию множества взведенных курков, при этом от

трелы" превращаются в треск автоматных очередей - само

таций. Учитывая, что любое действие, связанное с такой са

претацией, может переопределить объекты-действия, ло

нения подобных программ становится весьма запутанной. Основное при

менение этого механизма - моделирование сложных сис

тем.

V. СОЗДАНИЕ / УНИЧТОЖЕНИЕ ОБЪЕКТОВ

"Время жизни" объекта. - Классы памяти. - Управление ди

кой памятью. - Фрагментация. - Проблемы "висячих" ссылок и мусора. - Автоматическая память. - Локальная среда. - Активации объекта.

Объекты, существующие в программе, делятся на две категории: ста

тические и динамические. Эти категории определяются по-разному: на основе изменения состояния объектов модели и на ос

ни" объектов. Первое определение предполагает, что любой объ

ект, изменяющий свое состояние в процессе работы прог

ектами являются только константы, все объекты-переменные могут счи

чтожения объектов. В этом смысле объекты, время существования ко

кие), объекты же, время существования (жизни) которых меньше вре

нии всегда должны расцениваться как статические, пос

дание" подготавливается транслятором и ассоциация между име

нем и элементом хранения объекта существует до окончания вpемени pаботы программы.

Создание объекта следует интерпретировать как выделение па

ти под его элемент хранения. Такая интерпретация подразумевает раз

ние всего рабочего пространства памяти ЭВМ на две ка

рии, два класса - статическую память и динамическую. Первый класс памяти, как следует из этого контекста, полностью на

ем тpанслятоpа и pаспpеделяется под статические объ

щие в системе постоянно. Например, декларация

VAR A: POINTER TO CARDINAL;

B: CARDINAL;

сообщает транслятору о необходимости "зарезервировать" в клас

тической памяти два слова под элемент хранения объекта с именем А и одно слово под элемент хранения объекта с именем В.

Динамическая память предназначается для создания временно су

ющих объектов. Этот класс памяти имеет две разновидности: соб

мять (в отличие от статической) полностью находится в рас

граммиста: по его директивам происходит выделение эле

ных элементов в "зону" свободной памяти (пул "свободных" эле

сле равносильно "уничтожению" объекта.

Автоматическая память - особая разновидность динамической, ко

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

претацией активных объектов (переменных пpоцедуpных типов). В этом смысле две разновидности динамической памяти делят этот класс памяти на два подкласса: память для интерпретации пас

ными алгоритмами.

Управление динамической памятью для пасссивных объектов (в даль

нейшем просто динамической памятью) реализуется на основе двух ос

новных процедур (обычно импортируемых из системного модуля):

PROCEDURE ALLOCATE (VAR A: ADDRESS; N: CARDINAL);

PROCEDURE DEALLOCATE (VAR A: ADDRESS; N: CARDINAL); .

Здесь А - свободный указатель, который укажет на выделенную об

ласть памяти (элемент хранения размером N байт) при вызове ALLOCATE и получит значение NIL (т.е. никуда не будет указывать) при освобождении этой области "из-под" А путем вызова DEALLOCATE.

Использование ограниченных указателей делает во многих от

ях целесообразным использование специальных вызовов: NEW(P) и DISPOSE(P), где VAR P: POINTER TO . (NEW и DISPOSE - псе

процедуры, их вызовы транслируются в вызовы ALLOCATE и DE

TE соответственно). Использование NEW и DISPOSE позволяет из

бежать многих семантических ошибок, связанных с различными значениями N в последовательности вызовов ALLOCATE...DEALLOCATE, определяющей соз

дание/уничтожение одного и того же объекта.

В целом последовательность вызовов NEW...DISPOSE (или соот

венно ALLOCATE...DEALLOCATE), в общем случае полностью оп

мая логикой программиста, порождает ряд проблем, свя

низацией и распределением свободного пространства ди

мяти. Одной из таких проблем является проблема фраг

фект фрагментации заключается в том, что рабочая область ди

ных и занятых фрагментов в общем случае может быть со

вершенно произвольным. Любой запрос программиста на создание но

кого подбора могут быть различны, но общая закономерность одна: та

кой фрагмент должен иметь размер, не меньший, чем запрашиваемый про

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

ся в свободной зоне в качестве свободного фpагмента. При этом проблема фрагментации заключается в том, что эффект "дро

ния" может привести к тому, что в свободной зоне будет на

жество "маленьких" разрозненных свободных фрагментов, в со

ности составляющих достаточный объем. Тем не менее, не

тря на такой объем, запрос программиста на новый элемент памяти мо

жет получить отказ по причине отсутствия целого подходящего эле

та. Ниже приведен фрагмент программы и схема распределения ди

мической памяти, иллюстрирующие эффект фрагментации. При этом для простоты предполагается, что общий объем ди

кой памяти составляет 20 байт.

TYPE Треугольник = POINTER TO Фигура_1

Фигура_1 = RECORD

Сторона_1, Сторона_2, Сторона_3:CARDINAL

END;

Четырехугольник = POINTER TO Фигура_2;

Фигура_2 = RECORD

Сторона_1, Сторона_2, Сторона_3, Сторона_4:

CARDINAL

ЕND

VAR T1, T2: Треугольник; М1, М2: Четырехугольник;

BEGIN NEW(T1);... NEW(M1);... NEW(T2);...

DISPOSE(T1);... DISPOSE(T2); NEW(M2);...

Иллюстрация построена для момента обработки запроса NEW(M2). В этот момент времени в динамической памяти имеются два сво

мента общим объемом шесть слов, которых достаточно для вы

роса на выделение элемента хранения под объект М2^ (т.е. для объ

воляет системе выделить память под объект М2^.

Система управления динамической памятью ведет специальный спи

сок свободных фpагментов - пул памяти. При возвращении какого-либо эле

Страницы: 1, 2, 3, 4, 5, 6, 7


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.