【问题标题】:Code Analysis AvoidExcessiveComplexity - Just Setting Commands代码分析 AvoidExcessiveComplexity - 只需设置命令
【发布时间】:2012-04-28 18:38:48
【问题描述】:

我有一个 WPF 表单,上面有 16 个按钮。当我的视图模型初始化时,我需要将所有 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());
}

【问题讨论】:

    标签: c# code-analysis maintainability


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

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

      如果您希望有更多按钮,请考虑切换到带有 { button, action, enabled } 条目的表格。

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

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

      【讨论】:

      • 我确实可以控制 RelayCommand。不过我不明白,我已经在这个构造函数中使用了它:public RelayCommand(Action execute, Predicate canExecute)。您的建议与使用它有何不同?
      • 您将使用 _=>F() lambdas 为 Action 和 Predicate 将零参数函数转换为一个参数。如果你不需要这个转换代码会更紧凑 Relay(DeleteTask, IsApp) 并且没有警告。
      • 我想我明白你现在在说什么了。因为我的 Action 和 Func 不使用参数,所以去掉它们。唯一的问题是 System.Windows.Input.ICommand 指定了这个:bool CanExecute(object parameter)。 RelayCommand 为 WPF 绑定实现了 ICommand。
      • 我试图建议在新构造函数内部进行任何你需要的转换,而不是在每次调用现有构造函数时重复。
      • 好的,所以如果我创建构造函数来只执行 Action,我如何在构造函数中将其转换为 Action
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多