Как стать автором
Обновить

Комментарии 4

Интересное развитие идеи, но на мой взгляд результат чуть менее гибкий. Да, мы избавились от инстанцирования события, с другой стороны параметров события может быть не 2, а 4-5 и больше. Система с инстансами позволяет сделать это достаточно легко и прозрачно, а заодно позволяет сделать параметры по умолчанию. Например
public class TestMessage : AbstractSMessage {
    public TestMessage (int foo) : this(foo, 0) { }
    public TestMessage (int foo, int bar) {
      this.foo = foo;
      this.bar = bar;
    }
}
При этом система все еще остается прозрачной для IDE и программиста.
Истина где-то посередине.
Там, где приходится слать огромное кол-во событий, естественно, будут выигрывать методы с прямой передачей параметров, так как не требуют постоянного выделения памяти для сообщения.
С другой стороны, если надо передать более 4 параметров, то логично обернуть их в сообщение и слать его.

Не стоит рассматривать данное решение как нечто серьезное, упор идет на хаб «Ненормальное программирование». Это скорее «proof of concept» и ответ на вопрос: «Можно ли избавиться от инстанцирования объектов-сообщений, но не потерять всех плюсов статической типизации?»
Делал похожую библиотеку, если интересно можно качнуть исходники тут. Неограниченное число параметров. В процессе развития идеи пришел к следующему, есть пул потоков и их общий контекст, в который может писать кто угодно, в контексте лежит очередь поднятых событий, как только в пуле появляется свободный поток, он оповещает всех подписчиков, при это обработка события у подписчика ведется в этом же потоке. Как только очередь событий становится пустой, все потоки в пуле засыпают до появления следующего события. Такая схема была обусловлена спецификой работы. Для регистрации обработчиков событий можно указать сборку, экземпляр конкретного типа или метод. При указании сборки будут найдены помеченные типы, и созданы их экземпляры. В типе производится поиск методов отмеченных атрибутом EpistleHandler, и регистрируются как обработчики событий. Сам вызов событий производится так:
Epistle.Signal(ключ_обработчика, параметры);


Для работы библиотеке потребуется еще одна, в которой реализуется пул потоков для обработки однотипных задач.
У нас все события были через типы, Тип это уникальный статический идентификатор, в нем нет проблем енамов (разные идентификаторы в одном месте), чисел и гуидов. Выглядело как то так:

// где то
public struct StartEvent { }

// событие приемник
[EventListener(typeof(StartEvent))]
public void OnStart()
{
}

// генерация события
Dispather.SendEvent(typeof(StartEvent));
// или
Dispather.SendEvent\<StartEvent\>();
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории