我认为这与 Win32 应用程序本身没有任何关系。这与使用 switch 语句有关。
没有什么可以阻止您使用映射,例如,将消息映射到处理该消息的函数。
在这种情况下,就您的代码而言,没有 switch 语句 - 只是一个映射查找,这意味着您的复杂性应该随着时间的推移保持不变。
您想要这样做的原因是,通过使用映射,您可以有效地将“switch 语句”从代码移动到 C++ 标准库中。McCabe 的复杂性在于测量您的代码。换句话说,您的逻辑现在更简单了,复杂性分数将显示这一点。
为什么要测量您的代码?因为度量的原因是评估代码的可维护性,而您不会维护 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