2013-10-24 38 views
0

我覺得這個詞典裏有太多的信息:它保存着構建一個 電子郵件路徑的信息,它包含額外的參數來獲取電子郵件模板所需的其他數據。這裏是我的示例程序的簡化版本:我該如何將這個詞典重構爲一個類?

void Main() 
{ 
    //Sample Path = Root/Action/TemplateX.txt 
    //Date used in other method 
    Dictionary<string,object> emailDict = new Dictionary<string,object> 
    { 
     {"Root","Email"}, 
     {"Action", "Update"}, 
     {"TemplateName", "TemplateX.txt"}, 
     {"Date", DateTime.Now}, 

    }; 

    //Create email object 
    Email email = new Email(); 


    //Send e-mail with email dictionary 
    email.SendEmail(emailDict); 

} 

// Define other methods and classes here 
public class Email 
{ 

    public void SendEmail(Dictionary<string,object> emailDict) 
    { 
     //Build path from emailDict and use parameters from emailDict 
     //Send E-mail 
    } 

} 

我應該考慮其他重要因素嗎?

回答

3

你當然是對的 - 你有什麼需要重構。也許閱讀標準的面向對象的校長會有所幫助。我將有更多的東西像這樣的,但我需要知道更多的你打算如何使用它(市民制定者可能需要):

enum EmailAction { Update } // add any other possible actions 

public class Email 
{ 
    public string Email { get; private set; } 
    public EmailAction EmailAction { get; private set; } 
    public string TemlateName { get; private set; } 
    public DateTime DateTime { get; private set; } 

    public Email(string email, EmailAction action, string templateName, DateTime dateTime) 
    { 
     this.Email = email; 
     this.EmailAction = action; 
     this.TemlateName = templateName; 
     this.DateTime = dateTime; 
    } 

    public void Send() 
    { 
     //Build path from properties on this instance of Email 
    } 

} 

然後,你可以簡單地去:

Email newEmail = new Email("Email", EmailAction.Update, "TemplateX.txt", DateTime.Now); 

newEmail.Send(); 
+0

我想過這個之前,但如果會發生什麼,如果我需要通過一噸的參數來電子郵件。你還會考慮相同的方法,但也許將參數存儲在另一個類中,然後將該類傳遞給Email對象? – xaisoft

+0

如果還有更多的參數,我會有一個默認的構造函數,即沒有參數,並將屬性設置器公開,那麼您可以創建新的電子郵件並在調用發送之前設置所需的屬性。 – markmnl

2

這絕對是濫用Dictionary。你失去了所有類型的安全,你的價值是一個object,這讓你打開InvalidCast例外和其他一系列問題。只要把你所有的值到性能的一類:那麼

public class EmailFields 
{ 
    public string Root {get;set;} 
    public string Action {get;set;} 
    public string TemplateName {get;set;} 
    public DateTime Date {get;set;} 

    public EmailHelper 
    { 
     Date = DateTime.Now; 
    } 
} 

SendEmail方法將採取EmailFields對象作爲參數。

從這一點來說,我也可能爲ActionTemplateName製作enum

public enum Action 
{ 
    Update, 
} 
public enum Template 
{ 
    TemplateX, 
} 

然後你的屬性將

public Action EmailAction {get;set;} 
public Template TemplateName {get;set;} 
+0

好主意,有一件事是模板是字符串,我不能用字符串做一個枚舉,所以具有const的類可以罰款,例如:'const TEMPLATE_X =「templateX.txt」;'? – xaisoft