Win32 C ++应用程序中的McCabe Complexity

时间:2013-02-28 19:47:19

标签: c++ winapi code-complexity

阅读了这个问题:

McCabe Cyclomatic Complexity for switch in Java

我的兴趣转向无法以这种方式解决的转换语句(?)。

实现McCabe的决定应该少于20,以保证更好的可维护性我开始怀疑Win32应用程序。

制作Win32应用程序时,可以制作按钮。现在对于这些按钮,在它们上面放置一个处理程序非常典型,处理按下它们时发送的消息通常在Win32回调函数中完成。

现在随着应用程序变得越来越大,这个switch语句变得更大(超过20)。这是否意味着Win32应用程序的可维护性会更差(Java Swing?)?

或者这是McCabe复杂性的一个例外,如果是这样,那么它实际上与其他应用程序类型的可维护性相同?

1 个答案:

答案 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