2009-10-10 65 views
0

我有一個班級,它返回三個屬性。第一個屬性依賴於某個參數,第二個屬性依賴於第一個屬性,第三個屬性依賴於第二個屬性。如何設計我的班級

實現這種類型的最佳方式是什麼?對於這個類型有沒有合適的設計模式?下面我粘貼了我的代碼的兩個版本,這兩個版本都工作,我不知道哪個更好(或者我太複雜了)?

第一招:

class Initializer 
{ 
    private string lastCode; 
    private int lastPackage; 
    private int lastBox; 

    public Initializer(int machineNumber) 
    { 
     lastCode = GetLastCodeFromDatabase(machineNumber); 
     lastPackage = GetLastPackageByLastCode(lastCode); 
     lastBox = GetLastBoxByLastPackage(lastPackage); 
    } 

    public string LastCode 
    { 
     get { return lastCode; } 
    } 

    public int LastPackage 
    { 
     get { return lastPackage; } 
    } 

    public int LastBox 
    { 
     get { return lastBox; } 
    } 

    private string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

二:

class Initializer 
{ 
    public static string LastCode(int machineNumber) 
    { 
     return GetLastCodeFromDatabase(machineNumber); 
    } 

    public static int LastPackage(string lastCode) 
    { 
     return GetLastPackageByLastCode(lastCode); 
    } 

    public static int LastBox(int lastPackage) 
    { 
     return GetLastBoxByLastPackage(lastPackage); 
    } 

    private static string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private static int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private static int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

回答

2

其他答案已經回答了你的問題的機制,但也有一個設計問題,如果我沒有指出,我會失職。

如果你的第一個例子更適合數據的含義,你最好使用一個簡單的對象,它不知道它是如何存儲的,還有一個ORM將它映射到數據庫和從數據庫映射它。據推測,你將有其他代碼使用這個對象。如果你編寫期望這個類的代碼,在構造函數中查詢數據庫等,那麼將很難測試和難以重用。

如果第二個更好的匹配,你應該研究依賴注入,這樣你可以注入一個不同的數據源進行測試(或者當你從SQL後端更改爲本地數據庫等)。

1

,如果你想起來前初始化所有的變量,或只在需要時才執行它依賴。我認爲最好的方式完全取決於你期望如何使用課堂。如果您將使用這些屬性,並且該值不會改變,那麼可以執行初始化(您的第一個選項),或者執行Lazy Loading。另一方面,如果您的屬性不會被使用太多,可能是一次或兩次,或者方法返回的值會因呼叫而不同,第二個選項將是最好的。如果來自函數的值變化很大,那麼您無法真正進行初始化並獲得預期的結果。

延遲加載是兩個想法之間的一個很好的折衷方案,但只有在值不變時才能使用。當您使用Lazy Load時,如果沒有人使用這些屬性,則不必支付初始化變量的性能。

+0

在這個類的幫助下,我在啓動時設置了我的應用程序的GUI,所以它只運行一次,我需要一次獲取所有屬性。 – sventevit 2009-10-10 16:20:12

1

您的代碼的一個版本使用緩存值,而另一個版本直接從底層數據源中檢索值。首先有更好的性能,因爲往返數據源只執行一次,後者始終是最實際的數據。我認爲你的情況取決於班級的使用情況。

除此之外,我想知道爲什麼你的域模型有這樣的平面視圖。這對我來說似乎不尋常。

+0

您對'我的域名模型的平面視圖'有什麼含義?我是新來的設計模式,這就是爲什麼我問這樣的問題...... – sventevit 2009-10-10 16:21:22

+0

凱文進一步詳細了一點。你應該有兩個類:Package和Box。包裝盒上有一個IList 。像NHibernate/Entity Framework這樣的O/R-Mapper應該關注你的類的持久性。然後,您將使用內存方法來確定最新的方框。對於平面視圖,我的意思是說對於實體的某些屬性(包,盒)只有非常特定的視圖,並且當您需要更多信息時,您會很容易地遇到問題。另一件事:你應該抽象你的數據訪問層,以便能夠測試你的代碼;) – 2009-10-10 16:30:02