Changes between Version 1 and Version 2 of ru/signals


Ignore:
Timestamp:
Mar 12, 2011, 3:19:26 AM (10 years ago)
Author:
vadim.godunko
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ru/signals

    v1 v2  
    1111Не все перечисленные выше требования легко решить средствами Ada.
    1212
    13 == Первый вариант ==
     13== Вариант 1 ==
    1414
    1515=== API библиотеки поддержки ===
     
    188188
    189189Выглядит вполне приемлемо. Однако, слишком много необходимо сделать для выполнения подключения. Одна из возможных идей для рассмотрения - настройка специального пакета, принимающего тип и его подпрограмму, а уже потом использование подпрограммы Connect из него.
     190
     191== Вариант 1.1 ==
     192
     193Этот вариант является модификацией предыдущего в части объявления и подключения слотов. Настраиваемый пакет Generic_Slot в Objects.Signals настраивается на тэговый тип и подпрограмму, играющую роль слота и предоставляет подпрогаммы подключения/отключения:
     194
     195=== API поддержки ===
     196
     197{{{
     198package Objects.Signals is
     199
     200   ----------------------
     201   -- Signal_Connector --
     202   ----------------------
     203
     204   type Signal_Connector (<>) is limited private;
     205
     206   generic
     207      type T is abstract new Abstract_Object with private;
     208      with procedure Method (Self : not null access T) is abstract;
     209
     210   package Generic_Slot is
     211
     212      procedure Connect
     213       (Self   : Signal_Connector;
     214        Object : not null access T'Class);
     215
     216   end Generic_Slot;
     217
     218   ------------
     219   -- Signal --
     220   ------------
     221
     222   type Signal
     223    (Object : not null access Abstract_Object'Class) is tagged limited private;
     224
     225   not overriding procedure Emit (Self : Signal);
     226
     227   not overriding function Connector
     228    (Self : in out Signal) return Signal_Connector;
     229
     230private
     231   ...
     232end Objects.Signals;
     233}}}
     234
     235=== Пример использования ===
     236
     237По сравнения с предыдущим вариантом изменяется способ использования только для типов, содержащих слоты. Для каждого слота объявляется собственный дочерний пакет, содержащий настройку пакета Objects.Signals.Generic_Slot:
     238
     239{{{
     240with Objects.Signals;
     241
     242package Collectors.Process_Slot is
     243  new Objects.Signals.Generic_Slots (Collector, Process);
     244}}}
     245
     246Главная программа выглядит следующим образом:
     247
     248{{{
     249with Collectors.Process_Slot;
     250with Emitters;
     251
     252procedure Main is
     253   C : aliased Collectors.Collector;
     254   E : aliased Emitters.Emitter;
     255
     256begin
     257   Collectors.Process_Slot.Connect (E.Signal, C'Access);
     258   E.Test;
     259end Main;
     260}}}
     261
     262=== Выводы ===
     263
     264Больше писанины, поскольку необходимо объявлять отдельный пакет для каждого слота, но (1) меньше усилий на выполнение подключения и лучше понимание происходящего, и (2) жестко контролируется, что слот есть примитивная операция типа.