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

Главная/

Программирование, базы данных. /

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

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


Copyright © 2005—2007 «RefStore.Ru»