5

16 個のボタンがある WPF フォームがあります。ビュー モデルを初期化するときに、16 個すべてを RelayCommand オブジェクトとして設定する必要があります。私の Initialize() メソッドが行うことはこれだけですが、コード分析エラー CA1502:AvoidExcessiveComplexity が発生します。

これは CA 警告を抑制する良いケースですか、それとも CA 違反を引き起こさずにこれらのコマンドを設定するより洗練された方法はありますか?

[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "Simply setting the commands")]
private void Initialize()
{
    this.AddApplicationCommand      = new RelayCommand(_ => AddApplication());
    this.DeleteApplicationCommand   = new RelayCommand(_ => DeleteApplication(), _ => ApplicationIsSelected);
    this.RefreshApplicationsCommand = new RelayCommand(_ => RefreshApplications());
    this.SaveApplicationCommand     = new RelayCommand(_ => SaveApplication(), _ => ApplicationIsSelected);

    this.ForceInstallationCommand       = new RelayCommand(_ => ForceInstallation(), _ => ApplicationIsSelected);
    this.DeleteForceInstallationCommand = new RelayCommand(_ => DeleteForceInstallation(), _ => ApplicationIsSelectedAndForceExists());

    this.AddTaskCommand            = new RelayCommand(_ => AddTask(), _ => ApplicationIsSelected);
    this.EditTaskCommand           = new RelayCommand(_ => EditTask(), _ => TaskIsSelected());
    this.DeleteTaskCommand         = new RelayCommand(_ => DeleteTask(), _ => TaskIsSelected());
    this.ImportTasksCommand        = new RelayCommand(_ => ImportTasks(), _ => ApplicationIsSelected);
    this.ExportTasksCommand        = new RelayCommand(_ => ExportTasks(), _ => TaskIsSelected());
    this.ImportLegacyTasksCommand  = new RelayCommand(_ => ImportLegacyTasks(), _ => ApplicationIsSelected);            
    this.MoveTaskUpCommand         = new RelayCommand(_ => MoveRowUp(), _ => TaskIsSelected());
    this.MoveTaskDownCommand       = new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected());

    this.AddVariableGroupCommand    = new RelayCommand(_ => AddVariableGroup());
    this.RemoveVariableGroupCommand = new RelayCommand(_ => RemoveVariableGroup(), _ => VariableGroupIsSelected());
}
4

2 に答える 2

4

これは、匿名メソッドの使用による誤検出です。ルールは、コンパイラによって生成された分岐を生成されたコードとして認識しません。https://connect.microsoft.com/VisualStudio/feedback/details/555560/method-using-many-lambda-expressions-causes-high-cyclomatic-complexityおよびhttps://connect.microsoft.com/VisualStudio/feedbackを参照してください既存のバグ レポートについては、/details/295703/incorrect-cyclomatic-complexity-with-lambdasをご覧ください。

于 2012-04-28T22:40:33.277 に答える
1

そのまま読みやすいように見えるので、抑制しても問題ありません(RelayCommandを変更できないと仮定します)。

RelayCommandクラスを制御できる場合は、コンストラクターを追加RealayCommand(Action, Func<bool>)して、余分なラッパーlambda/delegatesの作成を排除します。

これ以上ボタンが必要な場合は、{ボタン、アクション、有効}エントリのあるテーブルに切り替えることを検討してください。

編集:各行のデリゲートの作成を削除してコードを簡素化するには、次のコードを変更できます

new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected());

new RelayCommand(MoveRowDown, TaskIsSelected);

ファイル自体を設定する新しいコンストラクターを追加することにより、次のようになります。

public RelayCommand(Action action, Func<bool> enabled)
{
  this._execute = _ => action();
  this._enabled = _ => enabled();
}

または既存のコンストラクターを呼び出す新しいコンストラクター:

public RelayCommand(Action action, Func<bool> enabled)
 : this(_ => MoveRowDown(), _ => TaskIsSelected()) {}
于 2012-04-28T19:02:35.947 に答える