Работа над проектом, который анализирует журнал событий, а затем обновляет модель на основе свойств этих событий. Я был довольно ленив в том, чтобы "сделать это", и больше беспокоился об оптимизации, бережливом коде и правильных шаблонах проектирования. В основном эксперимент с самообучением. Меня интересует, какие шаблоны, по мнению более опытных дизайнеров, актуальны или какой тип архитектуры объектов с псевдокодированием будет лучшим, простым в обслуживании и т. Д.
В одном журнале может быть 500 000 событий, и существует около 60 типов событий, каждый из которых имеет около 7 базовых свойств, а затем имеет от 0 до 15 дополнительных свойств в зависимости от типа события. Тип события - это второе свойство в файле журнала в каждой строке.
Итак, я попробовал действительно ужасный императивный парсер, который построчно просматривает журнал, а затем построчно обрабатывает события. Затем я попробовал лексическую спецификацию, которая использует шаблон «nextEvent», который вызывается в цикле и обрабатывается. Затем я попробовал простой старый метод "parse", который никогда не возвращается и просто запускает события для зарегистрированных обратных вызовов слушателя. Я пробовал как один обратный вызов независимо от типа события, так и метод обратного вызова, специфичный для каждого типа события.
Я пробовал базовый класс "событие" с объединением всех возможных свойств. Я попытался избежать вызова «нового события» (поскольку может быть огромное количество событий, а объекты событий, как правило, недолговечны) и наличия методов обратного вызова для каждого типа с аргументами примитивного свойства. Я попытался создать подкласс для каждого из 60 типов событий с абстрактным родителем события с 7 общими базовыми свойствами.
Недавно я попытался пойти дальше и использовать шаблон Command для добавления кода обработки событий для каждого типа события. Я не уверен, что мне это нравится, и оно действительно похоже на методы обратного вызова для каждого типа, просто код находится внутри функции execute в подклассах типов по сравнению с методами обратного вызова для каждого типа
Проблема состоит в том, что большая часть логики обновления модели является общей, и большая ее часть относится к подклассу, и я только начинаю путаться во всем этом. Я надеюсь, что кто-то может, по крайней мере, указать мне направление, чтобы рассмотреть!