Cyclomatic Complexityは、与えられた関数がどれほど難しいか、またはバグを含む可能性がどれくらいあるかについての大まかな基準を提供します。私が読んだ実装では、通常、すべての基本的な制御フロー構造(if、case、while、forなど)が関数の複雑さを1増加させます。循環的複雑さは、仮想関数が呼び出す "プログラムのソースコードを通る線形に独立したパスの数"は、実行時にどの実装が呼び出されるのかのあいまいさのために、関数の循環的複雑さも増加させるはずです(呼び出しは、実行)。仮想関数呼び出しの循環的複雑さは何ですか?
しかし、同等のswitch文(問題の仮想関数を実装している階層内のすべてのクラスに対して1つのcaseキーワードを使用して、各caseキーワードに対して1つのポイントを含む)と同じ量をペナルティ化すると、仮想関数呼び出しは一般的にはプログラミングの面で優れていると考えられています。
仮想関数呼び出しの循環的複雑さにはどのようなコストが必要ですか?私は、私の推論が、循環的複雑さをメトリクスとして、あるいは仮想関数の使用やそれとは別のものとして利用することに対する議論であるかどうかはわかりません。
編集:人々の反応の後、大規模なswitch文を含むグローバル関数への呼び出しと同等の仮想関数呼び出しを考えることができるので、循環的な複雑さを増やすべきではないことに気付きました。この関数はスコアが悪くても、プログラム内には1回しか存在しませんが、各仮想関数呼び出しをswitch文で直接置き換えると、コストが何度も発生します。
あなたの質問は、基本的にプログラムが何を理解するのが難しいかを測定する「グローバルな複雑さ」と、基本的にテストを書くことがどれほど難しいかを測定する「ローカル複雑さ」の違いの大きな例を指摘しています定義されたすべてのメソッドのカバレッジソフトウェアプロジェクトが成長するにつれて、これらの複雑さの概念が収束する傾向にあると思いますが、小規模のコードベースでは、循環複雑性のような指標に基づくベストプラクティスは「グローバルな複雑さ」(すなわち仮想関数) "ローカルな複雑さ"(すなわち、 "スイッチ")。 – Peter
私は、この質問に対する答えは、switch文よりも悪いとマークされるべきであると考えています。分離されたモジュール内の多態的な呼び出しを考慮すると、本当に無制限のスイッチなので、実際にあるかもしれない)。プログラム全体の知識の観点から考えると、スイッチとして考えるべきです。このメトリックで*同等と見なすからといって、他のメトリック(多態性が勝っている望ましい効果を得るために変更する必要がある行数など)に沿ってコードの品質を評価することはできません。 –