Большой switch-case (legacy code)
От: Мёртвый Даун Россия  
Дата: 06.01.17 17:59
Оценка:
Всем привет,
вопрос наверное больше архитектурно-прикладной,

достался мне в наследство один дремучий С++ проект лохматых годов. Я его потихоньку рефакторю неторопливо. И одну часть кода долго обходил стороной, пока работало и ладно. Тут задумал что пора бы уже.

Есть application level message протокол, клиент-сервер общаются посредством сообщений. Собсна всё как обычно:
1) заголовок сообщения: тэг, длина, тип
2) тело сообщения: стопицот разных параметров

И есть там один гигантский switch-case, а-ля:

Message msg;

MessageHandler handler;
...
if (handler.pickMessage(msg)) {
  switch (msg.type()) {
    case LOGON_MESSAGE_TYPE: {... /* какой-то обработчик */ }
    case LOGON_RESPONSE_MESSAGE_TYPE: {... /* какой-то обработчик */ }
    case SESSION_START_MESSAGE_TYPE: {... /* какой-то обработчик */ }
    ...
    /* тут еще стопицот case-ов */
  }
}


В принципе всё бы ничего, switch хоть и гигантский, но довольно структурирован. Но блин, вот на каждый case может быть простынка по два экрана, что совсем не удобно. Ну и разумеется архитектурно бы хотелось подшаманить этот код.

Так то никто меня не торопит, и можно потихоньку еще колбасить. Но есть какие то идиомы, приемы и методы по избавлению от гигантских switch-ей? Где почитать?

UPD: да, нет никаких дополнительных библиотек, Linux, C++.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 07.01.2017 14:09 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 06.01.2017 18:04 Мёртвый Даун . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.