問題タブ [cyclomatic-complexity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 循環的複雑度と本質的な循環的複雑度の違いは何ですか?
循環的複雑度とは何ですか?
ただし、「本質的な循環的複雑度」と呼ばれる別の用語があります。
コードのこれら2つのメトリックの違いと類似点は何ですか?それらの典型的な許容値は何ですか?また、コードを理解するには、EssentialCyclomaticComplexityがより適切なメトリックであることも学びました。一方、実装の観点からは、循環的複雑度が最も関連性があります。もしそうなら、なぜですか?
java - プロジェクト(クラス/関数ではない)の循環的複雑度を計算する方法は?
Javaプロジェクト全体の循環的複雑度を計算するには? どの方法も複雑ですが、それらすべてを 1 つの数値メトリックに集約するにはどうすればよいですか? アイデアや既存の方法はありますか?
私はツールを探しているのではなく、アルゴリズムを探しています。
多くの1
-complexity メソッドがあり、実際にはそれほど複雑ではありませんが、コードベースにとって重要性が低いため (ほとんどの場合)、単純な平均はほとんど機能しません。
c# - 循環的複雑度31のカウント、これはどこから来たのですか?
私はExcelファイルからデータをプルするアプリケーションを開発しています(実際のデータベースにアクセスできません)。以下に示すように、Excelスプレッドシートからデータをプルする唯一の機能を持つメソッドを作成しました。 。
コード分析を実行し(Visual Studio 2012を使用していて、.NET 4.5で開発しています)、CA1502: Avoid excessive complexity
(以下にコピー)があります。ジュニア開発者(私は17歳)として、MSDNを使用してこれについて詳しく調べようとしましたが、循環的複雑度が33である理由について少し困惑しています。
CA1502
過度の複雑さを避ける
'Extraction.ExtractSMData(List<Range>)'
循環的複雑度は33です。複雑度を25に減らすために、メソッドを書き直すかリファクタリングします。
Core.Extraction.cs:104
クイックIF(condition ? if_true : if_false
、これらは何と呼ばれていますか?)を使用すると、それが悪い可能性があることがわかりますが、それでも5としてしか見ることができません。
更新:
循環的複雑度は現在33です...
コメントするentity.IncidentNumber = Row.get_Range("K1").get_Value();
と、複雑さは32になります。私は考えget_Range()
て、get_Value()
それぞれ1つでしたが、大丈夫です...
コメントアウトするentity.RepairedOnTime = Row.get_Range("W1").get_Value().ToString().ToLower() == "no" ? false : true;
と、複雑さは28になります...
get_Range()
、、get_Value()
クイック-3の場合、実行ToString()
してToLower()
カウントしますか?
java - onClick() メソッド内の循環的複雑度を減らす方法
簡単な構造を想像してみましょう:
これは、さまざまなボタンのクリックを処理する簡単なコードです。switch
しかし、ボタンの数が増えるにつれて、ブロックのサイクロマティックな複雑さが増します。メソッドの循環的な複雑さを軽減するために、このコード構造を表す別の方法はありonClick()
ますか? 前もって感謝します。
unit-testing - 複合条件と短絡による循環的複雑性
私は大学のソフトウェア品質保証コースで循環的複雑性を研究していますが、述語ステートメントまたはノードに複合条件がある場合にどのように機能するかを理解するのに苦労しています。循環的複雑性の複数の定義を見てきましたが、私のクラスで使用された主な定義は
したがって、このようなプログラム グラフの場合、循環的複雑度は 2 になります。
また、次のように与えられる循環的複雑度の定義も見てきました。
これは、上記のグラフでも機能します。ただし、述語ノードには複合条件があります。そして、自動短絡のための言語とシステムのセットアップを検討します。私には、左下のグラフをグラフに拡張する必要があるように思われます。以下のような場合、実際のソース コードでは if 文が 1 つしかない場合でも、サイクロマティック複雑度は 3 になりますか、それとも V(G) = 2 のままですか? .
循環的複雑度について私が目にする定義のほとんどは述語ノードについて話しているため、混乱を招きます。これが当てはまらない場合、ショートサーキット動作はパフォーマンスを向上させますが、実際に考慮した場合、サイクロマティックの複雑さを高めているようです。ソースコードが与えられた場合、循環的複雑度を計算する前に、すべての条件を左側のグラフのように独自のノードに分割する必要がありますか?
java - メソッドの複雑さの計算の背後にある原則は何ですか?
Sonar Metrics の複雑さのページから、次のメソッドの複雑さは 5 です。
これは、ツールが複雑さを計算する方法です。
複雑さを増すキーワード: if、for、while、case、catch、throw、return (メソッドの最後のステートメントではない)、&&、||、?
ifブロックとwhileブロックがメソッドの複雑さを増すのはなぜですか? メソッドの複雑さのこのメトリック計算の背後にある直感は何ですか?
java - 複数の出口点を持つコードの循環的複雑度
パスワードを検証する次のメソッドがあります。
循環的複雑度の数値に焦点を当てましょう:その値は何ですか?
メトリクス1.3.6は7だと言っていますが、7つの独立したパスを見つけることはできません。5つしか見つかりません。そして、ウィキペディアはあまり役に立ちませんでした。この式をどのように使用すると思いますπ - s + 2
か?
2つif
の出口点、1つfor
および3つの出口点がありますが、行き詰まっています。入口点を数える必要がありますか?if
2つの条件があるので、最初に2回カウントする必要がありますか?
編集:
さて、Cyclomatic Numberが7であることがわかりました。これは、7つの独立したパスがあることを意味します。したがって、コードの100%をカバーする場合、7つの異なるテストケースを見つけることができるはずです。
さて、まだ最後のものが見つかりません!私はこれらを見つけました:
- 有効:asdf1234
- 短すぎる:asdf123
- 長すぎる:asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
- 無効な文字:asdf * 123
- 全桁:12345678
- 数字なし:asdfghjk
- wtf ???
javascript - 論理的に類似したコードの循環的複雑度
次の3つの関数を考えてみましょう。これらはすべて同じように動作し、異なるコードを使用して同じことを実現します(例はJavaScriptで記述されており、JavaScriptに適用される回答に特に関心がありますが、この質問は実際にはどの関数にも当てはまります。同様の構造を持つ言語):
JSComplexityツールは、3つの関数すべての複雑度が4であると報告します。これは、フォールスルーステートメントと同様に、演算子が||
独立したブランチとして扱われることを意味します。case
JSHintは演算子を気にしていないようですが||
、フォールスルーcase
ステートメントを同じように処理します。条件演算子が完全に間違っているようです。
循環的複雑度を計算する場合、フォールスルーcase
ステートメントと論理「または」演算子を独立したブランチとして扱う必要がありますか?三元条件についてはどうですか(これはもっと簡単だと思います。この場合、JSHintは明らかに間違っています)。上記の3つの関数はすべて、同じ循環的複雑度を持つ必要がありますか?
architecture - ファサード/サービスアーキテクチャ
質問をする前に、アプリケーションがどのように構築されているかを説明する必要があります。
サービス層でejbを使用するいくつかのWebアプリケーションを実行します。私は短い例でコミュニケーションを説明しようとします:
- JSF Bean(PersonHandler)がファサードを呼び出して、「Person」オブジェクトを削除します
- ファサードはさまざまなサービスを使用できますが、他のファサードを使用することはできません。この場合、PersonFacadeはPersonService(個人を削除するため)とNotificationService(電子メールを送信するため)を使用します。また、トランザクションはファサードロジックによって制御されます。電子メールは、トランザクションが正常にコミットされた場合にのみ送信する必要があります。
- サービスは、別のサービスまたはファサードへの参照を持つことはできません。これの代わりに、PersonServiceにはPersonDao(永続ロジック)への参照のみがあります。
このアーキテクチャは非常に一般的だと思います。これが私の質問です。
PersonFacadeのdeleteメソッドには、複製しない非常に重要なコードがあります。人を削除するたびに、このコードを実行する必要があります。別のファサードロジックでは、まったく同じコードが必要ですが、ファサード<->ファサード通信は許可されていません。
この問題の最善の解決策は何ですか?
これが私の現在の解決策ですが、私はそれに満足していません。削除ロジックを処理するejbを使用して新しいejbモジュールを作成しました。両方のファサードモジュールは新しいモジュールに依存しているため、すべてが機能し、「ファサードは他のファサードを使用しない」という契約を破ることはありません。毎回これを使用すると、異なる場所で同じコードが必要になると、モジュールが爆発し、モジュールが混乱します。現在、250を超えるejb/jarモジュールがあります。