阅读了这个问题:
McCabe Cyclomatic Complexity for switch in Java
我的兴趣转向无法以这种方式解决的转换语句(?)。
实现McCabe的决定应该少于20,以保证更好的可维护性我开始怀疑Win32应用程序。
制作Win32应用程序时,可以制作按钮。现在对于这些按钮,在它们上面放置一个处理程序非常典型,处理按下它们时发送的消息通常在Win32回调函数中完成。
现在随着应用程序变得越来越大,这个switch语句变得更大(超过20)。这是否意味着Win32应用程序的可维护性会更差(Java Swing?)?
或者这是McCabe复杂性的一个例外,如果是这样,那么它实际上与其他应用程序类型的可维护性相同?
答案 0 :(得分:3)
我认为这与Win32应用程序本身没有任何关系。这与使用switch语句有关。
没有什么可以阻止您使用地图,例如,将消息映射到处理该消息的函数。
在这种情况下,就你的代码而言,没有switch语句 - 只是一个map查找,这意味着你的复杂性应该随着时间的推移保持不变。
您希望这样做的原因是,通过使用地图,您可以有效地将“开关语句”从您的代码移动到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