2009-09-17 28 views
2

我一直在爲C#編寫自己的框架,我的框架在Xna框架之上工作。在使用此框架的應用程序代碼中,我經常必須包含對我的框架和Xna框架的引用。大多數時候,那些Xna引用只包含一些像Vector2和Rectangle這樣的結構類。因此,我嘗試並確保我的類的名稱不會與名稱的Xna類衝突。當我有了類似的名字,但與XNA類似的名字不一樣時,這會讓人感到厭煩,甚至會感到困惑。 (即GamePadDevice和GamePad)抽象化API

我已經有一個想法,但我不知道它是否值得。在我的框架中,我只使用了幾個,五個或六個結構。將這些結構抽象出來是否值得,以便我的應用程序代碼只需要處理我的框架?我可以通過編寫我自己的結構版本或從它們繼承來做到這一點,或者也許有人可以提出更好的方法。是否值得簡化我的應用程序代碼?

回答

3

我不知道你的框架在替換XNA層上有多深,但是如果用戶再也沒有與XNA聯繫過,並且「只是」使用你的框架,那麼如果你的框架只公開他自己的框架會更好對客戶構成結果。畢竟,您可能希望有一天離開XNA並支持XNB或XNC?

如果你寫在你的框架映射器,轉換,你將有靈活性,後來做

+0

你能詳細說說一下Mapper嗎?你是指轉換器類嗎? – smack0007 2009-09-17 09:45:10

+0

映射器基本上是將X的類型轉換爲Y類型的東西。因此,在您的場景中,它將在例如您自己的Vector2和XNA Vector2之間進行轉換。 – 2009-09-17 11:20:59

+0

是的......將XNA數據映射到你的結構和背後的東西。 – 2009-09-17 11:42:54

0

的一個好方法抽象出第三方庫的介紹你需要方法的接口,讓對象創建由工廠完成。特別是在你的情況下,你只需要使用一堆課程,在我看來,這是最好的選擇。我們假設我們需要清理html代碼,並且找到了一個可以爲我們做這件事的kickass庫,但是我們不想堅持這個庫 - 也許有人會在某天將某個超級kickass文件重新發布,我們希望使用。

這可能如下(在Java代碼中)來實現

先在接口定義:

public interface HtmlSanitizer { 
     String sanitizeHtml(String html); 
} 

然後,我們創建了我們的接口,基於我們kickass消毒

public class MyKickassHtmlSanitizer implements HtmlSanitizer { 
    private com.foolib.kickass.html.Sanitizer delegate; 

    public MyKickassHtmlSanitizer() { 
     this.delegate= new com.foolib.kickass.html.Sanitizer(); 
    } 

    public String sanitizeHtml(String html) { 
    return delegate.kickassSanitizeHtml(html); 
    } 
} 
的具體實現

現在製造我們的消毒劑的工廠

public class HtmlSanitizerFactory { 
     private static final HtmlSanitizerFactory instance = new HtmlSanitizerFactory(); 

     private HtmlSanitizerFactory() {} 

     public static HtmlSanitizerFactory get() { return instance;} 
     public HtmlSanitizer getSanitizer() { 
      return new MyKickassHtmlSanitizer(); 
     } 
} 

來獲得實例簡單地使用:

HtmlSanitizerFactory.get().getSanitizer(); 

雖然工廠可以提供靜態方法還是不行,可以是單身或沒有。關於味道和用例的問題。

現在,您對libs kickass sanitizer的依賴減少到一個點,並且改變實現,只需引入一個SuperKickassHtmlSanitizer並讓工廠返回它。

希望對你有所幫助:-)