2016-10-03 6 views
0

Я использовал шаблон проектирования команд для создания меню в моем простом приложении.Добавление дополнительных методов для одиночной команды в шаблоне команды C#

interface ICommand 
{ 
    string Description { get; } 
    void Execute(Library books, List<Book> bookList); 
    bool ValueChecker(string checkValue); 
} 

Я использую ValueChecker, чтобы проверить, если поля в моих ответах являются ИНТ только и несколько уникальны. (Я добавляю продукты в класс AddBookCommand). Было бы плохой практикой добавлять другие методы, такие как bool IsUnique или bool IsYearLessThanCurrent, для интерфейса, или я должен думать о других способах выполнения некоторых простых операций обработки ошибок в моем меню?

+3

Я думаю, что вы не должны вводить слишком много логики в свои команды. Команды должны быть глупыми. Вместо этого вы должны создать обработчики команд, которые обрабатывают вашу команду. Некоторые из них могут быть валидаторами. Затем вы настраиваете цепочку обработчиков и передаете команду в цепочку. Если он проходит валидаторы, то вы продолжаете понимать. Если это не так, вы делаете что-то еще. –

+0

@JakubRusilko не могли бы вы просветить меня небольшим образцом такого ручка? Я новичок в кодировании. – Easy

+0

Трудно дать вам исчерпывающий пример, который будет соответствовать вашему конкретному случаю, @Easy. Однако в сети много статей о командах и т. Д. Я могу порекомендовать этот сайт: https://sourcemaking.com/design_patterns. Взгляните на шаблон Command и шаблон Chain of Responsibility, описанный на этой странице. –

ответ

0

Да, вы можете, но это было бы более эффективно, если бы вы сохранили Icommand generic, насколько это возможно. Вы также можете определить IcommandBase, который сохранит все выполнение и все эти общие методы. И затем определите другую Icommand, чтобы сказать IcommandBook для специализированных для ваших объектов, таких как Books and Student.

2

Команды существуют для 1 причины = выполняют некоторую логику. Иногда разрешается добавлять логику относительно функциональности Undo или логики, которые определяют, можно ли использовать эту команду прямо сейчас или нет. Там уже определены этот интерфейс в .NET here

///<summary> 
///  An interface that allows an application author to define a method to be invoked. 
///</summary> 
public interface ICommand 
{ 
    /// <summary> 
    ///  Raised when the ability of the command to execute has changed. 
    /// </summary> 
    event EventHandler CanExecuteChanged; 

    /// <summary> 
    ///  Returns whether the command can be executed. 
    /// </summary> 
    /// <param name="parameter">A parameter that may be used in executing the command. This parameter may be ignored by some implementations.</param> 
    /// <returns>true if the command can be executed with the given parameter and current state. false otherwise.</returns> 
    bool CanExecute(object parameter); 

    /// <summary> 
    ///  Defines the method that should be executed when the command is executed. 
    /// </summary> 
    /// <param name="parameter">A parameter that may be used in executing the command. This parameter may be ignored by some implementations.</param> 
    void Execute(object parameter); 
} 

Добавление дополнительной логики для объектов здесь не хорошо. Он нарушает принцип SRP и делает код более сложным.