私は最近、uniで循環的複雑度(McCabe)とソフトウェアの到達可能性を研究しています。今日、私の講師は2つの測定基準の間に相関関係はないと述べましたが、これは本当にそうですか?
それほど複雑ではないプログラム(私たちが見てきた少数のものから)が到達可能性の点で「より良い」結果を持っているように見えるので、私は間違いなくsome相関があると思います。
2つのメトリックを一緒に調べようとする試みを知っている人はいますか?そうでない場合は、多数のプログラムの複雑さと到達可能性の両方に関するデータを見つけるのに適した場所はどこでしょうか?
最近、私はサイクロマティック複雑度(McCabe)とソフトウェアの到達可能性を研究しています。今日、私の講師は、2つの指標の間に相関関係はないと言いましたが、これは本当ですか?
実際には、はいといいえの両方です。
まず、循環的複雑度のMcCabeメトリックは、制御フローグラフで計算されます。ここで、ソースコードを有向グラフに抽象化し、基本ブロックまたはステートメントをノードとし、それらの間の遷移を示します(通常の制御フローによる下向きまたは条件付きジャンプおよびループの場合)エッジです。ここでの循環的複雑度は、大まかに(プログラム全体に分離コードがないと見なす場合(つまり、グラフが接続されている場合))は、エッジの数とノードの数の差と見なすことができます。
CC = E - N
到達可能性の問題は、グラフ理論における一般的な問題であり、次のように表すことができます。2つのノードAとBが与えられた場合、ノードAから到達可能なノードBです。方向?したがって、コードではなく制御フローグラフに適用できるのは、やはりメトリックです。
この問題を 制御フローグラフ に適用する方法はいくつかあります。 1つの方法は、いわゆる「変数到達可能性分析」です。これは、特定の変数について、その値が特定のプログラムポイントでまだ利用可能かどうかを分析が決定することを意味します(この手法はソフトウェア分析ではスライスとも呼ばれます)。また、 マルチスレッドアプリケーション にこの用語(および一般的に到達可能性の問題)を使用している記事もいくつか見つかりました。
基本的に、CCと到達可能性の間に何らかの相関があることがわかります。CCが増加すると、ノード上のエッジの比率も増加し、エッジの方向も重要な有向グラフの場合でも、その増加を推測できます。エッジの数は、最終的にグラフで使用可能なパスの増加につながり、したがって、ノード間の直接または間接接続を介した到達可能性の増加につながります。したがって、答えはここではYesです。
一方、マルチスレッド環境での到達可能性の概念には、いわゆるスーパーグラフの分析が必要です。これはそれほど簡単なことではありません。 CCの増加(ここでは「 同期の複雑さ 」と呼ばれます)により、ソフトウェアでデッドロックが発生する可能性が高くなり、特定のノード/コードセグメントの到達可能性が低下する可能性があります。したがって、「いいえ」はここでも有効な答えです。
私は到達可能性に精通していませんが、それが実行できないコードパスの尺度である場合、循環的複雑度はその上限のようなものである必要があります。
これにはいくつかの統計があるかもしれませんが、一方が他方に依存せず、これを排除できるようにソフトウェアシステムの設計に選択肢があるため、相関関係はないと言えます。
実世界のデータに関しては、mayが強い相関関係にありますが、この相関関係を排除しないソフトウェアシステムの設計が不適切であることが原因である可能性があります。グラフ理論の知識が不足しているため、偶発的な相関関係である可能性があります。