我一直在用C#编写自己的框架,我的框架在Xna框架之上工作。在使用此框架的应用程序代码中,我经常需要包含对我的框架和Xna框架的引用。大多数情况下,这些Xna引用只包含一些结构类,如Vector2和Rectangle。因此,我尝试确保我的类的名称与Xna类的名称不冲突。当我上课时我会想出一个类似的名字但与Xna名字不一样的话,这会让我自己很烦,甚至会让自己感到困惑。 (即GamePadDevice和GamePad)
我最近有一个想法,但我不知道它是否值得。我只在整个框架中使用了一些,5或6个结构。抽象这些结构是否值得,以便我的应用程序代码只需要处理我的框架?我可以通过编写我自己的结构版本或从它们继承或者可能有人建议更好的方法来做到这一点。开销是否值得简化我的应用程序代码?
答案 0 :(得分:3)
我不知道你的框架在更换XNA层时有多深,但是如果用户不再与XNA联系,而且“只是”使用你的框架,那么如果你的框架只暴露他自己的结构会更好给客户。毕竟,您可能希望有一天从XNA切换出来并支持XNB或XNC?
如果您在框架中编写了一个可以翻译的映射器,那么您可以在以后的
中灵活地执行此操作答案 1 :(得分:0)
抽象出第三方库的一个好方法是引入所需方法的接口,并让工件完成对象的创建。特别是在你的情况下,你只使用一堆课程,在我看来,这是最好的选择。
让我们假设我们需要清理html代码,并且确实找到了一个可以为我们执行此操作的kickass库,但是我们不想坚持使用这个库 - 也许有人会在某天我们想要使用超级kickass lib
这可以实现如下(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并让工厂返回它。
希望有所帮助: - )