データを検証するときに循環的な複雑さを軽減する最良の方法は何ですか? [閉まっている]
-
03-07-2019 - |
質問
現在、nullの結果を返す可能性のあるデータベースから大量のデータを受け取るWebアプリケーションで作業しています。アプリケーションの循環的な複雑さを経験すると、多くの関数が10から30の間で重くなります。ほとんどの場合、数値が大きい関数の大部分には、次のような多くの行があります。
If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)
私の質問に私を導きますが、これらの数字を下げようとする最良の方法は何ですか?今、私は10以下の機能の大部分を持っているのを見ています。
解決
拡張メソッドの使用について。
Imports System.Runtime.CompilerServices
Module Extensions
<Extension()> _
Public Function TryGetString(ByVal row As IDataRecord, i As Integer) As String
If row.IsDBNull(i) Then
Return null
End If
Return row.GetString(i);
End Function
End Module
その後、次のように簡単に記述できます。
row("Field") = oraData.TryGetString(4)
これはスムーズに読み取り、関数の循環的な複雑さを軽減します。
他のヒント
関数に分解します。おそらく次のようなものです:
//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
if oraData.IsDBNull( fldIndex ) then
row( fldName ) := oraData.GetString(fldIndex);
end;
もちろん、プロシージャの署名を拡張して、「oraData」がおよび「行」パラメータとして渡すことができます。
最初の質問:なぜあなたは「ハング」しているのですか? CCにアップ?これは、コードの密度を評価するためのツールであり、経験則は「CC番号の高すぎない」必要があります。
おそらくすべてのこれらの「IF」をヒットしてその数を表示します-したがって、nullを処理する結果セットからデータを抽出するラップ関数を呼び出すか、クエリを変更してifの数を減らしますtはnullを返します。
nullは情報を提供し、役に立たないわけではないことに注意してください。たとえば、共和党員または民主党員ですか? nullを使用すると、どちらも選択されません。
この質問を見ましたか?彼は似たようなことを求めています(しかし、私はもっと基本的なレベルで考えています)...しかし、それはここでの答えがあまり助けにならないかもしれないことを意味します。
ここでの他の提案に間違いなく同意します:関数/手順にきちんとパッケージ化できるステートメントが繰り返される場合は、CCをシフトするだけではない限り、それは取るべき1つのアプローチかもしれません。 35のCCを持つ1つのprocから、15、10、10のCCを持つ3つのprocに移動した場合、あなたがあまりに多くを得たかどうかはわかりません(悪い最初のステップではありませんが、理想的にはできるでしょうシステムのその領域の総CCを減らすために、より大きなスコープで何かを単純化するために。)
CCを削減するために、 if を別のユーティリティ関数にリファクタリングすることができます。さまざまなデータベースタイプ(string、intなど)を処理するには、多くの関数またはタイプの区別に依存する関数が必要になる場合があります。
ただし、どのソリューションも保守性や可読性の低いコード(つまり、他のメトリックを悪化させる可能性があります!)になり、QAがこの正当化に従って合格できるようにすることを主張します。