3

複雑なメソッドを持つブラウンフィールド アプリケーションがあります。CC は 14 です。if ステートメントは、アプリケーションの設定を確認し、適切なインライン SQL を生成します。

EG この if ステートメントは設定をチェックします。boolsettings はカスタム コードであり、複数の(ではない bool?) プロパティを持つ DTOです。

        string conditions = " AND (";

        List<string> conditionStrings = new List<string>();

        if (settings.AlwaysIncludeCommonResults && settings.SelectedCommonLabs.Count > 0)
        {
            string common = " (Table.Name in (";
            for (int i = 0; i < settings.SelectedCommonLabs.Count; i++)
            {
                common += string.Format("'{0}'", settings.SelectedCommonLabs[i]);
                if (i < settings.SelectedCommonLabs.Count - 1)
                    common += ", ";
            }
            common += ")) ";
            conditionStrings.Add(common);
        }

        if (settings.AlwaysSelectLast24HoursResults)
        {
            string last24 = " (DateDiff(hh, Table.PerformedDtm, GetDate()) < 24) ";
            conditionStrings.Add(last24);
        }

このブール論理を単純化するために何をすべきかわかりません。Null 合体?...これがこれ以上良くなるかどうかはわかりません。このパターンは、同じ方法でさらに数回表示されます。したがって、回答を数回再利用して、全体的な CC を減らし、読みやすさを向上させたいと考えています。何を指示してるんですか?

更新
最初の検証を削除することを決定した後、さらにメソッド ロジックを追加しました。

4

1 に答える 1

1

コードを少し縮小することから始めます。

   string common = " (Table.Name in (";
            for (int i = 0; i < settings.SelectedCommonLabs.Count; i++)
            {
                common += string.Format("'{0}'", settings.SelectedCommonLabs[i]);
                if (i < settings.SelectedCommonLabs.Count - 1)
                    common += ", ";
            }
            common += ")) ";
            conditionStrings.Add(common);

縮小することができます:

string common = " (Table.Name in (";
//if SelectedCommonLabs is a collection of strings, LINQ your way through it
common += string.Join(", ", settings.SelectedCommonLabs.ToList().Select(lab => string.Format("'{0}'",lab)));
common += ")) ";
conditionStrings.Add(common);

しかし、これはそもそもあまり良いコードではないことに同意します。

于 2012-05-21T14:43:56.860 に答える