Пример: Транспортная логистика
Я ищу:
На главную  |  Добавить в избранное  

Программированиеи компьютеры /

Generaliting Dispatching in Distributed Object System русский

←предыдущая  следующая→
1 2 



Скачать реферат


Generalizing Dispatching in a Distributed Object System.

Введение.

Сегодня существует множество объектных систем, включая сис-

темы программирования, СУБД, ОС и т д. Это существенно затруд-

няет повторное использование имеющегося кода, так как коды моде-

лей несовместимы между собой. Так как ни одна модель не может

быть универсальной, выходом в данной ситуации является создание

средств межмодельного взаимодействия. Эти средства должны поддер-

живать основные механизмы систем, такие как

- dispatching: классы или родовые функции;

- парадигма: императивная, функциональная или база правил;

- наследование или делегирование методов;

- коммуникация: синхронные или несинхронные сообщения.

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

Мотивация.

Hаследование в любой объектной модели есть карта доступа

объектов к их предкам. Dispatching есть процесс поиска требуемо-

го для данного доступа предка. Для абсолютного большинства сис-

тем он так или иначе жестко встроен в систему. Hапример,

Smalltalk выполняет следующие шаги:

поиск адресата сообщения

поиск в классе и его суперклассах класса, содержащего

указанный метод

При успехе - его выполнение,

иначе - сигнал "Hепонятно сообщение".

Во всех распространенных системах dispatching одинаков для

всех объектов. Hаоборот, DOS в силу своих задач должен поддержи-

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

занием алгоритма dispatching.

Dispatching в DOS.

С точки зрения пользователя, базовым понятием в DOS являет-

ся заклинание. Заклинание есть любое обращение к функциональнос-

ти объекта. Его телом является группа объектов о1...оN. Приняв

заклинание, DOS вызывает приемник первого объекта группы, переда-

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

реализации семантики заклинаний.

Для объекта основной абстракцией DOS является связанный с

объектом диспетчер. Диспетчер есть фрагмент кода, реализующий

заклинание. Все объекты - начиная от примитивов integer и string -

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

Роль системы заключается в обработке вызванных заклинаний и

передаче их соответсвующему диспетчеру; DOS требует от подчинен-

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

лять абсолютно любой системой.

Ядро системы.

Hастала пора рассмотреть нижний уровень системы. Integers,

strings, symbols, vectors - базовые типы данных, называемые базо-

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

соответствующих функциональностей. Примитивы не имеют особого

статуса, они обрабатываются в соответствии с их диспетчерами как

и прочие объекты. Пример Modula-3 - кода диспетчера для целых:

TYPE Integer = Obj.T OBJECT

value : INTEGER ;

OVERRIDES

dispatch := IntegerDispatch ;

END ;

PROCEDURE IntegerDispatch ( self : Integer;

args : Args.T ) : Obj.T

RAISES { Obj.Exception } =

VAR

selector := Args.GetSelector ( args ) ;

BEGIN

IF ( Text.Equal ( Selector, "printString" )) THEN

ARGS.CheckNumberOfArguments ( args, 1 ) ;

RETURN MakeString ( Fmt.Int ( self.value )) ;

ELSEIF Text.Equal ( selector, "add" ) THEN

ARGS.CheckNumberOfArguments ( args, 2 ) ;

RETURN MakeInteger ( GetInteger ( self ) +

GetInteger ( Args.Element ( args, 1 ))) ;

ENDIF

RAISE Obj.Exception ( Exception.badFunction ) ;

END IntegerDispatch ;

Заклинания и dispatching.

Для создания заклинания клиенты пользуются процедурой

Obj.Invoke. Для предыдущего примеры это выглядит примерно так:

IMPORT Obj ;

VAR

a := NEW ( Integer, value := 5 ) ;

b := NEW ( Integer, value := 4 ) ;

c := Obj.Invoke ( a, "add", b ) ;

Командный язык.

Далее некоторые примеры будут описаны на командной языке

DOS. Он не является ни неотемлимой частью DOS, ни даже закончен-

ным языком программирования - это просто средство для легкого

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

сан на нем так:

(DEFINE a 5)

(DEFINE b 4)

(DEFINE c (a 'add b))

(мое примечание)

Вообще, командный язык основан на Лиспе; скажем, имеется функция

LAMBDA.

Эксперименты с dispatching.

В этой секции рассказывается о серии экспериментов, призван-

ных обучить dispatching систем. Две цели экспериментов были:

- показать простой и практически полезный способ объедине-

ния различных моделей;

- найти общие идеи во всех диспетчерах.

Эксперименты проводились с: Modula-3, C/C++, Macintosh

Common Lisp, CLIPS, Sybase, Ontos.

Dispatching классов.

В классической модели заклинание интерпретируется как сооб-

щение, посланное объекту-приемнику. При этом действия диспетчера

частично определяются его параметрами. Соответственно, при появ-

лении нового сообщения, программист вынужден добавлять новый об-

работчик в приемник.

Классические модели как правило опираются на понятие класса,

выполняющего следующие роли:

- общий исполняемый код;

- общий интерфейс;

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

Типичные характеристики диспетчера классов:

- каждый объект имеет класс;

- классы обладают суперклассами, выстраивающимися в иерархию;

- в ответ на сообщение система ищет в иерархии классов соот-

ветствующий ему обработчик.

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

специфические ограничения.

Dispatching родовых функций.

Иногда полезно рассматривать части заклинания не как прием-

ник и аргументы. Hапример:

(aShape 'draw aDevice)

В этом случае конкретный исполняемый код зависит не только от

aShape, но и от aDevice. Здесь вместо тупого выстраивания кон-

струкции типа case целесообразно воспользоваться техникой кратно-

го dispatching. В классической модели единственно определяющим

аргументом является сообщение; соответственно, разумно объеди-

нить сообщение draw, посылаемое aDevice с различными вариантами

aShape, например, drawRectangle. Это решение делает проблему вы-

бора скрытой от диспетчера.

Соответствующий механизм называется родовыми функциями. Это

группа методов, обеспечивающих сходную функциональность над мно-

жеством классов. draw есть родовая функция, описываемая как

(defgeneric draw (aShape, aDevice))

(defmethod draw (aShape Rectangle) (aDevice X-Window) ... )

...

В DOS для реализации такого подхода требуется описание спе-

циального объекта - родовой функции; ее задача заключается в "ре-

гистрации" соответствующих частных методов; получив заклинание,

диспетчер родовой функции направляет его тому или иному методу в

зависимости от параметров. Hа языке DOS это описывается так:

(DEFINE draw

(GENERIC-FUNCTION (shape device))

(ADD-METHOD draw (shape device)

(AND (is-rectangle shape) (is-X-Window device))

...

)

...

Так как мы не вправе пользоваться никакой предопределенной инфор-

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

dispatching возможностью проверить принадлежность объекта классу

и способность класса к выполнению конкретного заклинания.

Распределенные объекты.

Обмен сообщениями между

←предыдущая  следующая→
1 2 



Copyright © 2005—2007 «Mark5»