Думая об использовании шаблона проектирования команд - PullRequest
5 голосов
/ 25 октября 2010

У меня есть код, который обновляет список людей по электронной почте. Этот список часто обновляется, и люди добавляются и удаляются до того, как будет вызвана фактическая часть кода «отправить письмо». В настоящее время мой код позаботится об этом:

if (instructorEmailType == InstructorEmailType.AddToCourse)
{
    // If instructor not already in the list, then put them in.
    if (!this.InstructorsToEmail.ContainsKey(courseInstructor))
    {
        this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.AddToCourse);
    }
    else
    {
        // If instructor already in the list, and marked for removal, then get rid
        // of that entry from the list.
        if (this.InstructorsToEmail[courseInstructor] == InstructorEmailType.RemoveFromCourse)
        {
            this.InstructorsToEmail.Remove(courseInstructor);
        }
    }
}
else
{
    if (this.InstructorsToEmail.ContainsKey(courseInstructor))
    {
        this.InstructorsToEmail.Remove(courseInstructor);
    }
    else
    {
        this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.RemoveFromCourse);
    }
}

Это сложно, и мне это не нравится. Вместо этого я думал о реализации шаблона проектирования Command. Моя идея, что для создания двух команд:

  • SendAllocatedInstructorEmailCommand
  • SendDeallocatedInstructorEmailCommand

Когда для курса назначается преподаватель, я добавляю SendAllocatedInstructorEmailCommand и добавляю его к CommandInvoker.SetCommand для дальнейшего использования. Аналогично, я бы создал объект SendDeallocatedInstructorEmailCommand для тех инструкторов, которые прошли курс обучения.

В этом проблема.

Если я создал объект SendAllocatedInstructorEmailCommand для Instructor A, а затем вниз по строке Instructor A освобождается от курса (до сохранения каких-либо данных на странице или отправки электронных писем), то мне нужно удалите SendAllocatedInstructorEmailCommand, который я построил ранее.

Что такое чистый способ поиска команд, которые уже ссылаются на Instructor A, чтобы я мог их удалить? Я не могу использовать метод Undo в своих командах, поскольку электронные письма будут отправлены уже через SendAllocatedInstructorEmailCommand.

Я думал добавить какой-нибудь Query метод к моему CommandInvoker объекту, но я не уверен, что это плохой план.

Должен ли я вообще использовать шаблон проектирования Command? Это действительно хороший способ поставить в очередь эти письма.

Приветствия. Иак.

1 Ответ

1 голос
/ 27 октября 2010

Я бы сказал, что вы должны держать свои команды, просто отделить их от отправки любых электронных писем.

Ваши команды должны быть похожи на IncludeInstructorEmail и ExcludeInstructorEmail, они должны реализовывать один интерфейс, например

public interface ICommandOverEmailsList
{
    void ApplyToList(List<string> emailsList);
}

, тогда код в основной части будет выглядеть так:

List<string> emailsList = new List<string>();
foreach(var command in instructorEmailsCommandsQueue)
{
   command.ApplyToList(emailsList);
}
SendEmails(emailsList);

Конечно, это предполагает, что последовательность команд типа «Исключить X, Включить X» оставит адрес X в списке.Кажется, это отличается от вашей исходной логики кода, но действительно ли это требуется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...