Я забочусь о критических приложениях в моем проекте. Он делает вещи, связанные с анализом бизнес-сообщений (унаследованный стандарт), их обработкой и последующим сохранением некоторых результатов в БД (другие приложения выбирают это). После более чем года моей работы (у меня есть и другие приложения, за которыми нужно присматривать) приложение наконец-то стало стабильным. Я ввел строгую политику TDD, и у меня 20% покрытия модульными тестами (спасибо Michael Feathers за вашу книгу!), Большинство из которых в критических частях. У меня также есть несколько фитнес-тестов в «белой коробке» (там рассматриваются все бизнес-сценарии). Я чувствую, что не могу в дальнейшем рефакторинг этого приложения, и я могу спокойно играть с ним. Он разработан так плохо, я хочу переписать его. Само приложение содержит около 20 тысяч сложных устаревших кодов C / C ++. Были и другие зависимости, но мне удалось отделить большинство из них.
Все, что у меня есть, это компилятор Sun C ++, cppunitlite, STLPort и Boost. Пожалуйста, не предлагайте другие технологии (без XML, Java и т. Д.), Так как это не вариант в моей организации.
Я хотел бы сделать это с современным C ++ (возможно, поиграть с метапрограммированием ...), TDD от начала до конца.
Есть около 30 типов сообщений, которые мне нужно проанализировать. Каждая из них состоит из 3-10 строк, большинство из них довольно похожи.
Это корень зла -> много дублирования кода.
У каждого сообщения есть класс, описывающий, как он должен быть проанализирован. Взгляните на главное дерево наследования:
MSG_A MSG_B
/ \ / \
MSG_A_NEW MSG_A_CNL MSG_B_NEW MSG_B_CNL
Оба дерева уходят намного глубже. Между MSG_A_NEW и MSG_B_NEW есть очень небольшие различия. Он должен обрабатываться одним классом, который может быть внедрен с небольшой настройкой.
Мой первоначальный план - иметь один общий класс сообщений, который будет настроен. Некоторая сущность (строитель ...?) Взглянет на сообщения и инициализирует соответствующий объект, который сможет проанализировать сообщение. Другая сущность сможет узнать, что это за линия, и эта информация будет использоваться строителем. Я планирую написать несколько парсеров, которые отвечают за разбор только одной конкретной строки. Это позволит мне повторно использовать его при разборе различных сообщений.
Есть несколько проблем, которые я изо всех сил пытаюсь решить элегантным и расширяемым способом.
Каждый тип сообщения:
имеет минимальное и максимальное число, если строки
- имеет некоторые обязательные строки
- имеет несколько дополнительных строк
- определенные строки должны быть в определенных местах (то есть дата не может быть перед типом сообщения), порядок имеет значение
Мне нужно проверить формат сообщений.
Я не уверен, достаточно ли я объяснил здесь проблему дизайна. Мой опыт проектирования очень ограничен. Я уже давно исправляю ошибки, и, наконец, у меня будет возможность сделать несколько забавных кодировок:)
Какой совет высокого уровня у вас есть для этого? Какие шаблоны дизайна вы можете определить в этом описании? Основным ограничением проекта является удобство обслуживания и расширяемость, а производительность снижается (в любом случае, у нас есть другие узкие места ...).