2015-12-07 78 views
-1

我使用遊戲引擎Unity,但這不應該有所作爲。 目前我的Armory類正在調用記錄器,我已經通過將異常處理try catch放入不同的類來解耦它,這樣好嗎還是有辦法更好地解耦記錄?C#解耦合類記錄

public class Armoury : MonoBehaviour 
{ 
    private Logging logger; 

    public void Buy(int unitId) 
    { 
     logger.OutOfRange("unitId not present in list", unitId, PurchasbleUnits); 

     //Do other stuff 
    } 
} 

public class Logging 
{ 
    public void OutOfRange(string error, int id, IList list) 
    { 
     try 
     { 
      list.Contains(id); 
     } 
     catch (Exception ex) 
     { 
      Debug.Log(ex + " Custom: " + error); 
     } 
    } 
} 
+1

@JamesHogle對於Codereview.se也是太假設了。我們不喜歡'//做其他事情'這樣的東西 – Caridorc

+0

當你問這是否'很好'時,你是否在尋找意見,看看你在做什麼是有道理的?因爲,不,它不。這應該是一個簡單的'如果',它的方式是錯綜複雜的。 – slumtrimpet

回答

4

你沒有減少耦合。你所做的通過提取Logging類,是減少責任Armoury類的數量 - 這是很好的 - 但不是足夠好,以減少耦合。

public class Armoury : MonoBehaviour 
{ 
    private Logging logger; 

    public void Buy(int unitId) 
    { 
     logger.OutOfRange("unitId not present in list", unitId, PurchasbleUnits); 

     //Do other stuff 
    } 
} 

爲了減少Armoury類和具體實現Logging類之間的耦合,您需要引入一個接口,並對依賴,而不是依賴於具體實現的:

private readonly ILogger; 

public Armoury(ILogger logger) 
{ 
    _logger = logger; 
} 

通過依賴於一個抽象,你不再依賴於具體的執行​​,並通過注入到構造函數中,您現在可以從外部控制依賴關係

現在,接口不應該被設計改變 - 而現在​​會是這個樣子:

public interface ILogger 
{ 
    void OutOfRange(string error, int id, IList list); 
} 

...這不是一個記錄器通常不會(人們所期望的一樣Info(string)方法,Warn(string)Error(string,Exception)),並且每當您需要新的東西尋找時,該接口將發生變化 - 實現方法是泄漏到抽象中,這是另一種設計氣味。至於實現,我懷疑這是否按預期工作,最後我檢查IEnumerable<T>.Contains()返回一個布爾值,並且您將丟棄返回值...不確定您是否會捕獲該catch塊中的ArgumentNullException以外的任何內容(請參閱MSDN) 。


我強烈建議你把你的實際的,完整的,工作代碼Code Review了卓有成效的同行評審,一旦你得到你的代碼按預期方式工作。