7

現在、null の結果を返す可能性があるデータベースから大量のデータを受け取る Web アプリケーションに取り組んでいます。アプリケーションの循環的複雑度を通過するとき、多くの関数の重みは 10 ~ 30 の間です。ほとんどの場合、数値が大きい関数の大部分には、次のような行がたくさんあります。

If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)

これが私の質問につながります。これらの数値を下げるための最善の方法は何ですか? 現在、関数の大部分を 10 未満にすることを考えています。

4

5 に答える 5

2

Extension Methodsの使用についてはどうですか。

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)

これにより、読み取りがスムーズになり、関数の循環的な複雑さが軽減されます。

于 2008-10-15T14:12:06.140 に答える
2

最初の質問は、なぜ CC に「ハングアップ」しているのですか? これは、コードの密度を評価するツールであり、経験則では「cc 数が高すぎない」必要があります。

おそらく、これらすべての「IF」にヒットしてその数を増やしているため、nullを処理する結果セットからデータを抽出するラップ関数を呼び出すか、nullを返さないようにクエリを変更して、ifの数を減らします。

null は情報を提供するものであり、役に立たないわけではないことに注意してください。たとえば共和党か民主党か?null を使用すると、どちらの選択肢もありません。

于 2008-10-15T13:49:03.877 に答える
2

おそらく次のような関数に分解します。

//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
  if oraData.IsDBNull( fldIndex ) then
    row( fldName ) := oraData.GetString(fldIndex);
end;

もちろん、"oraData" と "row" をパラメータとして渡すことができるように、プロシージャ シグネチャを拡張できます。

于 2008-10-15T13:53:31.090 に答える
1

この質問を見ましたか?彼は似たようなことを尋ねています(しかし、私はより基本的なレベルで考えています)...しかし、それは答えがここではあまり役に立たないかもしれないことを意味します.

ここでの他の提案には間違いなく同意します。関数/手順にきちんとパッケージ化できる繰り返しステートメントがある場合は、CC を移動するだけではない限り、それが 1 つのアプローチになる可能性があります。CC が 35 の 1 つの proc から、CC が 15、10、および 10 の 3 つの proc に移行した場合、あまり多くを得たかどうかはわかりません。 (最初のステップとしては悪くありませんが、理想的には、システムのその領域の合計 CC を減らすために、より大きな範囲で何かを単純化するためです。)

于 2008-10-15T14:28:01.163 に答える
0

ifを別のユーティリティ関数にリファクタリングして、CC を減らすことができます。さまざまなデータベース タイプ (string、int など) を処理するには、いくつかの関数または型の区別に依存する関数が必要になる場合があります。

ただし、どのような解決策も、コードの保守性や可読性が低下し (つまり、他の指標が悪化する可能性があります!)、QA として、この正当化に従ってパスすることを許可すると主張します。

于 2008-10-15T13:56:59.853 に答える