0

この質問を読んだ後:

Java でのスイッチの McCabe Cyclomatic Complexity

私の興味は、そのような方法 (?) では解決できない switch ステートメントに向けられました。

より優れた保守性を保証するために McCabe の決定は 20 未満にする必要があることに気づき、私は Win32 アプリケーションについて疑問に思うようになりました。

Win32 アプリケーションを作成する場合、ボタンを作成できます。これらのボタンに関しては、ハンドラーを配置するのが非常に一般的であり、ボタンが押されたときに送信されるメッセージの処理は、多くの場合、Win32 コールバック関数で行われます。

アプリケーションが大きくなるにつれて、この switch-statement は大きくなります (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 に答える