「あなた/循環的複雑度の適切な制限は何ですか? 」を読んだ後、同僚の多くが、私たちのプロジェクトに関するこの新しいQAポリシーに非常に腹を立てていることに気付きました。
意味: 'if'、'else'、'try'、'catch' およびその他のコード ワークフロー分岐ステートメントは 10 個までです。右。「プライベート メソッドをテストしますか?」で説明したように、'、そのようなポリシーには多くの良い副作用があります。
しかし: 私たち (200 人 - 7 年間) のプロジェクトの開始時、私たちは喜んでログを記録していました (いいえ、ログに対するある種の「アスペクト指向プログラミング」アプローチにそれを簡単に委譲することはできません)。
myLogger.info("A String");
myLogger.fine("A more complicated String");
...
そして、私たちのシステムの最初のバージョンが稼働したとき、ログ (ある時点でオフになっていました) が原因ではなく、常に計算されてから渡されるログ パラメーター(文字列) が原因で、巨大なメモリの問題が発生しました。 'info()' または 'fine()' 関数を呼び出して、ロギングのレベルが 'OFF' であり、ロギングが行われていないことを発見するだけです!
そのため、QA は戻ってきて、プログラマーに条件付きログを行うように促しました。いつも。
if(myLogger.isLoggable(Level.INFO) { myLogger.info("A String");
if(myLogger.isLoggable(Level.FINE) { myLogger.fine("A more complicated String");
...
しかし現在、関数ごとに「移動できない」10 の循環的複雑度レベルが制限されているため、関数に入れるさまざまなログは負担として感じられると主張しています。 +1 循環的複雑度としてカウントされます!
そのため、関数に 8 つの「if」、「else」などがある場合、1 つの密結合された簡単に共有できないアルゴリズムと 3 つの重要なログ アクションがあります...条件付きログが実際にはそうでなくても、それらは制限に違反します。その機能の前述の複雑さの一部...
この状況にどのように対処しますか?
私のプロジェクトでは、(その「競合」による) 興味深いコーディングの進化がいくつか見られましたが、最初にあなたの考えを聞きたいだけです.
すべての回答に感謝します。
問題は「フォーマット」関連ではなく、「引数評価」
関連であると主張しなければなりません(何もしないメソッドを呼び出す直前に、非常にコストがかかる可能性のある評価)実際には aFunction() を意味し、 aFunction
() は文字列を返し、ロガーによって表示されるすべての種類のログ データを収集および計算する複雑なメソッドへの呼び出しである... またはそうでない (したがって、問題、および条件付きログを使用するため、「循環的複雑さ」の人為的な増加という実際の問題...)
私は今、あなたの何人かによって進められた '可変個引数関数' ポイントを取得します (ジョンに感謝します)。
注: java6 での簡単なテストでは、varargs 関数が呼び出される前に引数を評価することが示されているため、関数呼び出しには適用できませんが、「ログ取得オブジェクト」(または「関数ラッパー」) には適用できません。 ) は、必要な場合にのみ呼び出されます。とった。
私は今、このトピックに関する私の経験を投稿しました。
投票のために来週の火曜日までそこに残します。その後、あなたの回答の1つを選択します.
繰り返しますが、すべての提案に感謝します:)