2009-04-19 71 views
2

我有一點點類設計問題。我將概述我正在考慮的三種模式。類設計:公共構造函數或私有靜態工廠和COM對象

實施例1:

Class MyObject 
{ 
    public MyObject(IWrapper wrapper,string name) 
    {//set properties.} 

    public Void Declare() 
    { 
     //Some COM stuff with IWrapper 
    } 
} 

使用

MyObject testobj = new MyObject(fakewrapper,"test"); 
testobj.Declare(); 

實施例2:

Class MyObject 
{ 
    public MyObject(IWrapper wrapper,string name) 
    { //set properties.} 

    public MyObject Declare() 
    { 
     //Some COM stuff with IWrapper 
     return this; 
    } 
} 

使用

MyObject testobj = new MyObject(fakewrapper,"Test"); 
testobj = testobj.Declare(); 

示例3:使用私有構造

Class MyObject 
{ 
    private MyObject(IWrapper wrapper,string name) 
    {//set properties.} 

    public static MyObject Declare(IWrapper wrapper,string name) 
    { 
     //Some COM stuff with IWrapper 
     return new MyObject(wrapper,name); 
    } 
} 

使用

MyObject testobj = MyObject.Declare(fakewrapper,"Test"); 

我的主要問題是; 你認爲哪一個更好的設計?
它是不好的做法隱藏的構造函數贊成靜態工廠方法?

我也試圖使這個儘可能可測試。 我似乎無法彌補我的想法的唯一原因是因爲MyObject類是COM應用程序中另一個對象的包裝。

的問題是,這個對象在COM應用程序,它是什麼聲明方法的任何其他方法之前做可​​以調用聲明,但如果我隱藏構造函數,然後添加更多的工作交給申報方法我認爲這會使課程的其餘部分難以測試,因爲我必須先通過Declare方法。

乾杯。

回答

1

選項3看起來像你的班級對我來說最乾淨的API。如果直到調用Declare才能真正使用MyObject,那麼將新的和Declare包裝到工廠方法中是有道理的,以確保您的類的用戶在不首先調用Declare的情況下不嘗試使用MyObject。工廠方法也可以幫助保養。

幫助可測試性的一種方法可能是將Declare操作包裝在類中的可插入「IDeclarer」接口中。您的生產應用程序將使用調用COM應用程序的IDeclarer的實現,而您的測試代碼可以插入模擬IDeclarer。也許這樣的事情(你可能需要調整...):

class MyObject 
{ 
    public IDeclarer Declarer { get; set; } 

    private MyObject(IWrapper wrapper,string name) 
    { 
     // set properties 
    } 

    public static MyObject Declare(IWrapper wrapper,string name) 
    { 
     //Some COM stuff with IWrapper 
     MyObject newMyObject = new MyObject(wrapper,name); 
     return Declarer.Declare(newMyObject); 
    } 
} 

public interface IDeclarer 
{ 
    MyObject Declare(MyObject obj); 
} 

public class ComDeclarer : IDeclarer 
{ 
    public MyObject Declare(MyObject obj) 
    { 
     // do COM work 
     return comObj; 
    } 
} 

public class TestDeclarer : IDeclarer 
{ 
    public MyObject Declare(MyObject obj) 
    { 
     // do nothing... or whatever 
     return testObj; 
    } 
} 
相關問題