2014-01-07 30 views
1

我的應用程序中有一種情況。我從服務中獲得迴應。我需要在緩存中有時在數據庫或其他媒體中轉換並保存響應。可能有一種情況,我不需要堅持響應,但只需要轉換響應並返回對象。我已經實現瞭如下設計:在合成對象中使用Null作爲標誌是否是件好事?

public class Response { } 

class MyData { } 

interface IPersistance 
{ 
    public void PersistData(MyData data); 
} 

public class DBPersitance : IPersistance 
{ 
    public void PersistData(MyData data) { } 
} 

public class CachePersitance : IPersistance 
{ 
    public void PersistData(MyData data) { } 
} 

public class MySeviceData 
{ 
    private IPersistance persistence; 

    public MySeviceData(IPersistance persistance) 
    { 
     _persistance = persistance; 
    } 

    public MyData GetServiceData(Response reponseXML) 
    { 
     MyData output = new MyData(); 

     // Here output object is filled with data from responseXML 

     // Object persistance as defined in constructor 
     if(_persistance!=null) 
      _persistance.PersistData(output); 

     return output; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyData output = new MyData(); 
     Response responseXML = new Response() ; 

     //Case 1: Cache the response 
     CachePersitance cache = new CachePersitance(); 
     MySeviceData srvData = new MySeviceData(cache); 
     output = srvData.GetServiceData(responseXML); 

     //Case 2: Write the response in Database 
     DBPersitance db = new DBPersitance(); 
     MySeviceData srvData = new MySeviceData(db); 
     output = srvData.GetServiceData(responseXML); 

     //Case 3: No need to persist. Only Convert and return the response 
     MySeviceData srvData = new MySeviceData(null); 
     output = srvData.GetServiceData(responseXML); 
    } 
} 

在上面實現,在該方案中,在那裏我只需要對象(無persiatance)轉換,我已經通過了null持久化對象。這種方法是否正確?任何人都可以爲這種需求提出更好的設計嗎?

+0

你可以添加一個參數的構造函數,而不是通過null。但這真的成爲風格和觀點的問題,這不太適合堆棧溢出。 –

+0

一個思想流派是儘可能避免'if'來檢查'null'。一個空的'IPersistance'(稱爲例如'NoPersistance')實現將起作用。如果您在默認情況下提供超載,那麼它會更平滑。 –

回答

1

一所學校的思路是儘量避免if s檢查null。我們可能同意或不同意(這將是非常意見的基礎上,國際海事組織它是好的,但暨格蘭諾索爾,null並不總是邪惡的,當它攜帶信息)。

要當你閱讀的代碼使用一個空類代替null將使明顯的意圖(持久性爲空?它意味着什麼?默認的還是沒有人嗎?如果默認之一,那麼這是什麼默認?)。

空的IPersistance(稱爲例如NoPersistance)的實施將起作用。如果這是最常見的情況,你甚至可以提供一個沒有參數的構造函數重載(如下例所示)(並且不需要明確指出,在這種情況下只需將其刪除)。

public class NoPersitance : IPersistance { 
    public void PersistData(MyData data) { 
     // Nothing to do 
    } 
} 

public class MySeviceData { 
    private IPersistance _persistance; 

    public MySeviceData(IPersistance persistance) { 
     if (persistance == null) 
      throw new ArgumentNullException("persistance"); 

     _persistance = persistance; 
    } 

    public MySeviceData() : this(new NoPersistance()) { 
    } 

    public MyData GetServiceData(Response reponseXML) { 
     Debug.Assert(_persistance != null); 

     MyData output = new MyData(); 
     // Fill your object's data 

     // Store object somewhere 
     _persistance.PersistData(output); 

     return output; 
    } 
} 

像這樣來使用(沒有參數意味着沒有持久性,可在MyServiceData構造函數重載被記錄):

MySeviceData srvData = new MySeviceData(); 
output = srvData.GetServiceData(responseXML); 

或者這樣:

MySeviceData srvData = new MySeviceData(new NoPersistance()); 
output = srvData.GetServiceData(responseXML); 
+0

感謝您的回答。爲什麼我們需要重載的構造函數? – user3169906

+0

@ user3169906它只是允許第一個示例(no parameters = no persistance)的語法作爲第二個示例(其中明確指出使用NoPersistance類)的語法的快捷方式。如果你不需要這樣的快捷方式(或者你想總是明確這個選擇),那麼你可以簡單地刪除那個過載並開心。 –

相關問題