代码分析避免了过度的复杂性 - 只需设置命令

本文关键字:复杂性 命令 设置 代码 | 更新日期: 2023-09-27 18:32:39

我有一个带有 16 个按钮的 WPF 表单。当我的视图模型初始化时,我需要将所有 16 个对象设置为 RelayCommand 对象。这就是我的 Initialize() 方法所做的一切,但这会导致代码分析错误 CA1502:避免过度复杂性。

这是禁止显示 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());
}

代码分析避免了过度的复杂性 - 只需设置命令

由于使用了匿名方法,这是一个误报。 该规则不会将编译器生成的分支识别为生成的代码。 有关现有错误报告,请参阅 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。

看起来

可读,所以抑制对我来说是可以的(假设你不能改变 RelayCommand)。

如果可以控制 RelayCommand 类 - 添加构造函数RealayCommand(Action, Func<bool>)以消除额外的包装器 lambda/委托创建。

如果您希望有更多按钮,请考虑切换到带有 { 按钮、操作、已启用 } 条目的表。

编辑:要通过删除每行上的委托创建来简化代码,您可以从

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()) {}