Об общении.


Все люди независимы (ну или почти)! Все люди общаются!
Всем известен обряд общения между людьми, его причины. Для получения нужной нам информации о ней можно спросить, и не обязательно конкретного человека. Спросить, так сказать, в воздух, если кто-то знает ответ — он ответит.

Об JavaScript’е и Qt.


Я люблю яваскрипт. Мне нравится его гибкость. Мне нравятся его событийная система.
Хоть я и не считаю себя С++ программистом, мне нравится Qt. Его (ее?) система сигналов/слотов.

Почему я вспомнил об языке и библиотеке? Потому что они умеют общатся, это выделяет их.

Об идее.


Все модули независимы (ну или почти)! Все модули общаются!
Как-то я подумал:, а почему бы научить общатся еще один мой любимый язык? PHP.
Представил себе систему, где все ее компоненты независимы друг от друга, более того — они не знают друг о друге.
Они общаются.
 — Есть у кого значение переменной ххх?
 — Да, конечно, держи.
 — Может кто-то дать мне последние 10 коментариев?
 — Без проблем.


Об реализации.


Поискав немного информацию по этому вопросу, нашел попытку реализации Qt в PHP — QPHP, но это не то, чего я хотел. Есть еще реализация сигналов/слотов в фреймворке ezComponents, но это тоже не то. Потому я приступил к проектированию ядра будущей библиотеки.
В моем воображении она выглядела так:
image
Как видно на схемке, все компоненты системы зависят только от ядра, так как все сообщения / события идут через него.
Что я решил включить в ядро:
  • самое главное — класc-синглтон реализирующий само общение, он имитирует основные методы Qt (connect, disconnet, emit, isConnected), и реализирует систему исключений (сообщения на которые не надо ядру отвечать)
  • сигналы и слоты было решено обернуть в класы, для контроля типов, да и вообще инкапсуляции некоторой логики
  • конфигуратор — клас который загружает конфиг, я решил его включить в ядро… Это спорный вопрос, но это показалось мне правильным (конечно же с модулями он будет общатся исключительно сообщениями)
  • суперклас для класов которые будут пользоватся сообщениями (он делает прозрачным запрос менеджера сообщений)
    суперклас для модулей — он умеет загружать информацию о модуле, проверять зависимости, и т.п.
По моему этого вполне достаточно.

Код реализации ждите в скором времени.

Об использовании


Типичным использованием я вижу примерно следующее:
  1. <?php
  2.  
  3. class module_test_1 extends module
  4. {
  5.     public function __construct()
  6.     {
  7.         // согласен что выглядет немного мострообразно, но это для понимания, да и хуков никто не отменял
  8.         $this->emit(new signal('config.getvar', array('var' => 'varname', 'callback' => array($this, 'write')));
  9.         $this->emit(new signal('module_test_1.run'));
  10.     }
  11.    
  12.     public function write($val)
  13.     {
  14.         echo "varname = $val";
  15.     }
  16. }
  17.  
  18. class module_test_2 extends module
  19. {
  20.     public function __construct()
  21.     {
  22.         $this->connect(new slot('module_test_1.run', array($this, 'write')));
  23.     }
  24.    
  25.     public function write()
  26.     {
  27.         echo "module_test_1 -> run";
  28.     }
  29. }
  30.  
  31. $test_2 = new module_test_2();
  32. $test_1 = new module_test_1();


______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru