Об общении.
Все люди независимы (ну или почти)! Все люди общаются!
Всем известен обряд общения между людьми, его причины. Для получения нужной нам информации о ней можно спросить, и не обязательно конкретного человека. Спросить, так сказать, в воздух, если кто-то знает ответ — он ответит.
Об JavaScript’е и Qt.
Я люблю яваскрипт. Мне нравится его гибкость. Мне нравятся его событийная система.
Хоть я и не считаю себя С++ программистом, мне нравится Qt. Его (ее?) система сигналов/слотов.
Почему я вспомнил об языке и библиотеке? Потому что они умеют общатся, это выделяет их.
Об идее.
Все модули независимы (ну или почти)! Все модули общаются!
Как-то я подумал:, а почему бы научить общатся еще один мой любимый язык? PHP.
Представил себе систему, где все ее компоненты независимы друг от друга, более того — они не знают друг о друге.
Они общаются.
— Есть у кого значение переменной ххх?
— Да, конечно, держи.
— Может кто-то дать мне последние 10 коментариев?
— Без проблем.
Об реализации.
Поискав немного информацию по этому вопросу, нашел попытку реализации Qt в PHP — QPHP, но это не то, чего я хотел. Есть еще реализация сигналов/слотов в фреймворке ezComponents, но это тоже не то. Потому я приступил к проектированию ядра будущей библиотеки.
В моем воображении она выглядела так:

Как видно на схемке, все компоненты системы зависят только от ядра, так как все сообщения / события идут через него.
Что я решил включить в ядро:
- самое главное — класc-синглтон реализирующий само общение, он имитирует основные методы Qt (connect, disconnet, emit, isConnected), и реализирует систему исключений (сообщения на которые не надо ядру отвечать)
- сигналы и слоты было решено обернуть в класы, для контроля типов, да и вообще инкапсуляции некоторой логики
- конфигуратор — клас который загружает конфиг, я решил его включить в ядро… Это спорный вопрос, но это показалось мне правильным (конечно же с модулями он будет общатся исключительно сообщениями)
- суперклас для класов которые будут пользоватся сообщениями (он делает прозрачным запрос менеджера сообщений)
суперклас для модулей — он умеет загружать информацию о модуле, проверять зависимости, и т.п.
Код реализации ждите в скором времени.
Об использовании
Типичным использованием я вижу примерно следующее:
- <?php
- class module_test_1 extends module
- {
- public function __construct()
- {
- // согласен что выглядет немного мострообразно, но это для понимания, да и хуков никто не отменял
- $this->emit(new signal('config.getvar', array('var' => 'varname', 'callback' => array($this, 'write')));
- $this->emit(new signal('module_test_1.run'));
- }
- public function write($val)
- {
- echo "varname = $val";
- }
- }
- class module_test_2 extends module
- {
- public function __construct()
- {
- $this->connect(new slot('module_test_1.run', array($this, 'write')));
- }
- public function write()
- {
- echo "module_test_1 -> run";
- }
- }
- $test_2 = new module_test_2();
- $test_1 = new module_test_1();
______________________