2010-10-25 7 views
5

Ich habe einige Code, der eine Liste von Personen aktualisiert, um eine E-Mail. Diese Liste wird häufig aktualisiert, wobei Personen hinzugefügt und entfernt werden, bevor der eigentliche "send email" -Teil des Codes aufgerufen wird. Momentan ist mein Code, um sich um dieses zu kümmern, etwas in der Art:Nachdenken über die Verwendung von Command Design Pattern

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); 
    } 
} 

Es ist kompliziert und ich mag es nicht. Ich habe darüber nachgedacht, stattdessen das Command Entwurfsmuster zu implementieren. Meine Idee, was zwei Befehle zu erstellen:

  • SendAllocatedInstructorEmailCommand
  • SendDeallocatedInstructorEmailCommand

Wenn ein Lehrer zu einem Kurs zugeordnet ist, dann würde ich neu-up ein SendAllocatedInstructorEmailCommand und fügen Sie es CommandInvoker.SetCommand für den späteren Gebrauch . Ebenso würde ich ein SendDeallocatedInstructorEmailCommand Objekt für jene Ausbilder schaffen, die von einem Kurs genommen werden.

Das ist das Problem.

Wenn ich ein SendAllocatedInstructorEmailCommand Objekt für Instructor A erstellt haben und später auf der ganzen Linie ist Instructor A aus dem Kurs ausgeplant (bevor Daten auf der Seite gespeichert wurde, oder E-Mails gesendet werden), dann muss ich die SendAllocatedInstructorEmailCommand löschen, die ich früher gebaut.

Was ist eine saubere Art der Suche nach Befehlen, die bereits auf Instructor A verweisen, so dass ich sie löschen kann? Ich kann keine Undo Methode auf meinen Befehlen verwenden, da die E-Mails bereits über die SendAllocatedInstructorEmailCommand gesendet wurden.

Ich dachte über das Hinzufügen einer Art von Query Methode zu meinem CommandInvoker Objekt, aber ich bin mir nicht sicher, ob das ein schlechter Plan ist.

Sollte ich das Command Entwurfsmuster überhaupt verwenden? Es ist eine wirklich nette Art, diese E-Mails in die Warteschlange zu stellen.

Prost. Jas.

+0

Ich bin mir nicht sicher, ob ich folge. Warum müssen Sie den 'SendAllocatedInstructorEmailCommand' löschen? Ist es unabhängig von der Abfrage von Sätzen, die bereits auf "Instructor A" verweisen? –

Antwort

1

Ich würde sagen, Sie sollten Ihre Befehle behalten, nur entkoppeln sie keine E-Mails senden.

Ihre Befehle sollten wie IncludeInstructorEmail und ExcludeInstructorEmail sein, sollten sie beide eine Schnittstelle implementieren, wie dies

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

der Code im Hauptteil wie folgt dann würde:

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

Natürlich Dies setzt voraus, dass die Folge von Befehlen wie "X ausschließen, X einbeziehen" die Adresse X in der Liste belässt. Dies scheint sich von Ihrer ursprünglichen Codelogik zu unterscheiden, aber ist es wirklich erforderlich?