質問

オブジェクトを受信し、検出するオブジェクトのタイプに基づいて何かを行う方法があります。

void receive(Object object) {
    if (object instanceof ObjectTypeA) {
        doSomethingA();
    }
    else {
        if (object instanceof ObjectTypeB) {
            doSomethingB();
        }
        else {
            if (object instanceof ObjectTypeC) {
                doSomethingC();
            }
            else {
                if (object instanceof ObjectTypeD) {
                    doSomethingD();
                }
                else {
                    // etc...
                }
            }
        }
    }
}

環状複雑さを減らすにはどうすればよいですか?私は回りましたが、あまりにも便利なものが見つかりませんでした。

役に立ちましたか?

解決

これにオブジェクト指向のアプローチを活用できませんか?を持っているインターフェイスを作成します doSomething() メソッドは、目的の動作を実装するサブクラスを作成しますか?その後、呼び出します object.doSomething() 適切な動作を実行しますか?

他のヒント

Cyclomaticの複雑さは、コードのグラフ構造に基づいた尺度です。具体的には、コードを介した可能なパスの数に基づいています。見る ここ 詳細については。 CCと典型的なプログラマーがコードの複雑さと見なすものとの間には相関関係がありますが、それらは同じものではありません。例えば:

  • CCはコードのセマンティクスを考慮しません。たとえば、呼び出されているこのような方法、またはアルゴリズムの数学的特性。

  • CCは、設計パターンとコーディングパターンを考慮していません。したがって、CCが複雑であると言うことは、使用されているパターンを理解している人にとっては簡単かもしれません。

CCと実際のコードの複雑さの関係は、IQと実際の知能の関係に似ていると言えます。

したがって、サイクロマティックの複雑さは、コードの複雑な部分がどこにあるかの指標として扱われるべきです...複雑さやコードの品質の真の尺度としてではありません。実際、非常に複雑なコードはそうではありません 必要な 質の悪い。多くの場合、複雑さは固有のものであり、それを取り除くことを試みることは問題を悪化させるだけです。


この特定の例では、高いCCメジャーは、典型的なプログラマに困難を引き起こすものに対応しません。ベストアンサー(IMO)は、この方法をそのまま残すことです。偽陽性としてチョークアップします。

void receive(ObjectTypeA object) {
        doSomethingA();
}

void receive(ObjectTypeB object) {
        doSomethingB();
}

void receive(ObjectTypeC object) {
        doSomethingC();
}

...

// Your final 'else' method
void receive(Object object) {
        doSomethingZ();
}

なぜ複雑さを減らす必要があるのですか?それは、有能な開発者がそれを些細な機能と見なすほど単純なパターンです。

おそらくこのように書くでしょう

    if (object instanceof ObjectTypeA) 
    {
        doSomethingA();
    }
    else if (object instanceof ObjectTypeB) 
    {
        doSomethingB();
    }
    else if (object instanceof ObjectTypeC) 
    {
        doSomethingC();
    }

「CCはXよりも少ない必要がある」という難解なニーズを満たすことである場合、維持可能なコードがCCがどれほど高くなっても受け入れられることを意味する標準が存在するという包括的な規則があります。

私がLOCから支払われたことがありましたが、「サイクロマティックな複雑さを減らす」という目標はありませんでした。

あなたのコードは「十分」です。私の目はブラケットにつまずいているので、私は少しのパフォーマンスを犠牲にして、次のことをしました(タイプA、Bなどを提供しても同じ階層にありません):

receive(Object object) {
    if (object intanceof ObjectTypeA) doSomethingA();
    if (object instanceof ObjectTypeB) doSomethingB();
    ...

または(それらが同じ階層にある場合):

receive(Object object) {
    if (object intanceof ObjectTypeA) { doSomethingA(); return; }
    if (object instanceof ObjectTypeB) { doSomethingB(); return; }
    ...

それがサイクロマティックなものを減らすかどうか、そしてそれほど気にすることができなかったかどうかはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top