2012-04-28 1 views
4

У меня есть форма WPF с 16 кнопками на нем. Когда моя модель представления инициализируется, мне нужно установить все 16 как объекты RelayCommand. Это все мой метод Initialize(), но это вызывает ошибку CA1502 анализа кода: AvoidExcessiveComplexity.Анализ кода AvoidExcessiveComplexity - Just Setting Commands

Это хороший случай для подавления предупреждения 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()); 
} 

ответ

3

Это ложное позитивное из-за использования анонимных методов. Правило не распознает генерируемое компилятором ветвление как сгенерированный код. См. 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 для существующих отчетов об ошибках.

1

выглядит читаемым, как это, так что подавление было бы нормально для меня (если вы не можете изменить RelayCommand).

Если вы можете управлять классом RelayCommand - добавьте конструктор RealayCommand(Action, Func<bool>), чтобы устранить дополнительное создание обертки лямбда/делегатов.

Если вы ожидаете, что другие кнопки рассмотрят возможность переключения на таблицу с помощью {button, action, enabled} записей.

EDIT: Для упрощения кода путем удаления создания делегатов на каждой линии вы можете изменить код из

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

в

new RelayCommand(MoveRowDown, TaskIsSelected); 

Добавляя новый конструктор, который устанавливает сам по себе fileds:

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

или новый конструктор, который вызывает существующий конструктор:

public RelayCommand(Action action, Func<bool> enabled) 
: this(_ => MoveRowDown(), _ => TaskIsSelected()) {} 
+0

У меня действительно есть контроль над RelayCommand. Я не понимаю, однако, я уже использую его с этим конструктором: public RelayCommand (Action execute, Predicate canExecute). Как ваше предложение отличается от этого? –

+0

Вы преобразовываете свои функции с нулевым аргументом в один аргумент один раз для Action и Predicate с _ => F() lambdas. Если вы устраните необходимость в этом коде конверсии, будет более компактным Relay (DeleteTask, IsApp) и никаким предупреждением. –

+0

Думаю, я вижу, что вы сейчас говорите. Поскольку мои Action и Func не используют параметры, удалите их. Единственная проблема заключается в том, что System.Windows.Input.ICommand указывает это: bool CanExecute (параметр объекта). И RelayCommand реализует ICommand для привязки WPF. –