Прочитав этот вопрос:
McCabe Cyclomatic Complexity для переключения в Java
Мой интерес был направлен на заявления о смене, которые не могут быть решены таким образом (?).
Понимая, что решения McCabe должны быть менее 20, чтобы гарантировать лучшую поддержку, я начал задумываться о приложениях Win32.
При создании приложения Win32 можно создавать кнопки. Теперь, что касается этих кнопок, наложение на них обработчика довольно типично, а обработка сообщения, которое они отправляют при нажатии, часто выполняется в функции обратного вызова Win32.
Теперь, когда приложение становится больше, этот оператор switch становится больше (больше 20). Означает ли это, что удобство сопровождения хуже для приложений Win32, чем для других (Java Swing?)?
Или это исключение из сложности McCabe, и если да, то каким образом это на самом деле соответствует уровню удобства поддержки других типов приложений?
Я не думаю, что это как-то связано с приложениями Win32. Это все связано с использованием операторов switch.
Ничто не мешает вам использовать карту, например, которая отображает сообщение на функцию, которая работает с этим сообщением.
В этом случае, что касается вашего кода, нет оператора switch — просто поиск по карте, что означает, что ваша сложность должна оставаться постоянной с течением времени.
Причина, по которой вы этого хотите, заключается в том, что, используя карту, вы эффективно перемещаете «оператор переключателя» из ваш код в стандартную библиотеку C ++. Сложность МакКейба заключается в измерении вашего кода. Другими словами, ваша логика теперь стала проще, и показатель сложности покажет это.
Почему он измеряет ваш код? Потому что причина для метрик состоит в том, чтобы оценить возможность сопровождения кода, и вы не собираетесь поддерживать стандарт C ++
библиотека.
Вот очень простой пример:
#include <iostream>
#include <map>
#include <functional>
typedef std::map<int,std::function<void()>> ProcessMessageMap;
void print_hi() { std::cout<<"hi"<<std::endl; }
void print_bye() { std::cout<<"bye"<<std::endl; }
enum Message { SAY_HI = 0, SAY_BYE, DONT_DO_ANYTHING } messages;
void process_message( const ProcessMessageMap &m, Message msg )
{
auto i = m.find(msg);
if(i != m.end())
{
(i->second)();
}
}
void setup_map( ProcessMessageMap &m )
{
m[SAY_HI] = std::bind(print_hi);
m[SAY_BYE] = std::bind(print_bye);
}
int main()
{
ProcessMessageMap msg_map;
setup_map( msg_map );
process_message( msg_map, SAY_HI );
process_message( msg_map, SAY_BYE );
return 0;
}
Вы можете увидеть результат здесь: http://ideone.com/bq7HgT
Других решений пока нет …