2010-10-25 8 views
5

मेरे पास कुछ कोड है जो ईमेल करने के लिए लोगों की एक सूची अद्यतन करता है। इस सूची को अक्सर अद्यतन किया जाता है, लोगों को कोड के वास्तविक "ईमेल भेजें" भाग से पहले जोड़ा और हटा दिया जाता है। वर्तमान में मेरा ध्यान रखने के लिए मेरा कोड इस तरह है:कमांड डिजाइन पैटर्न का उपयोग करने के बारे में सोच

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 ऑब्जेक्ट बनाउंगा जो पाठ्यक्रम से बाहर निकलते हैं।

यही समस्या है।

मैं Instructor A के लिए एक SendAllocatedInstructorEmailCommand वस्तु बना लिया है और बाद में लाइन नीचे Instructor A कोर्स (पेज पर कोई डेटा सहेज लिया गया है से पहले, या ईमेल भेजे) से पुनः आवंटित की जाती है, तो मैं SendAllocatedInstructorEmailCommand हटाने की आवश्यकता है कि मैं पहले बनाया गया

उन आदेशों की खोज करने का एक साफ तरीका क्या है जो पहले से ही Instructor A संदर्भित करते हैं, ताकि मैं उन्हें हटा सकूं? मैं अपने आदेशों पर Undo विधि का उपयोग नहीं कर सकता क्योंकि ईमेल पहले ही SendAllocatedInstructorEmailCommand के माध्यम से भेजे गए होंगे।

मैं Query विधि को CommandInvoker ऑब्जेक्ट में जोड़ने का विचार कर रहा था, लेकिन मुझे यकीन नहीं है कि यह एक खराब योजना है या नहीं।

क्या मुझे Command डिज़ाइन पैटर्न का उपयोग करना चाहिए? यह इन ईमेल कतारों के लिए वास्तव में एक अच्छा तरीका है।

चीयर्स। जैस।

+0

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। आपको 'SendAllocatedInstructorEmailCommand' को हटाने की आवश्यकता क्यों है? क्या यह कॉमैनेंड से पूछताछ से स्वतंत्र है जो पहले से ही 'प्रशिक्षक ए' का संदर्भ देता है? –

उत्तर

1

मैं कहूंगा कि आपको अपने आदेशों को रखना चाहिए, बस उन्हें किसी भी ईमेल भेजने से रोक दें।

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

:

आपका आदेशों IncludeInstructorEmail और ExcludeInstructorEmail की तरह, वे दोनों एक इंटरफ़ेस को लागू करना चाहिए, इस तरह

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

तो मुख्य भाग में कोड इस तरह होगा होना चाहिए , यह मानता है कि "बहिष्कृत एक्स, एक्स एक्स शामिल करें" जैसे आदेशों का अनुक्रम सूची में पता एक्स छोड़ देगा। यह आपके मूल कोड तर्क से अलग प्रतीत होता है, लेकिन क्या यह वास्तव में आवश्यक है?

संबंधित मुद्दे