0

读过这个问题:

用于 Java 中 switch 的 McCabe 循环复杂度

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

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

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

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

或者这是 McCabe 复杂性的一个例外,如果是这样,那么这实际上以何种方式与其他应用程序类型的可维护性相提并论?

4

1 回答 1

3

我认为这与 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

于 2013-02-28T20:06:06.407 回答