Часть полного текста документа: 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. ............ |