【发布时间】:2013-10-31 18:28:36
【问题描述】:
有没有什么方法可以根据 Dart 中的环境标志或目标平台有条件地导入库/代码?我正在尝试在 dart:io 的 ZLibDecoder / ZLibEncoder 类和基于目标平台的 zlib.js 之间切换。
有一篇文章描述了如何create a unified interface,但我无法想象这种技术不会创建重复代码和冗余测试来测试重复代码。 game_loopemploys this technique,但使用似乎不共享任何内容的单独类(GameLoopHtml 和 GameLoopIsolate)。
我的代码看起来有点像这样:
class Parser {
Layer parse(String data) {
List<int> rawBytes = /* ... */;
/* stuff you don't care about */
return new Layer(_inflateBytes(rawBytes));
}
String _inflateBytes(List<int> bytes) {
// Uses ZLibEncoder on dartvm, zlib.js in browser
}
}
我想通过使用两个独立的类来避免重复代码——ParserHtml 和 ParserServer——它们以相同的方式实现除了 _inflateBytes 之外的所有内容。
编辑:这里的具体示例:https://github.com/radicaled/citadel/blob/master/lib/tilemap/parser.dart。这是一个 TMX(Tile Map XML)解析器。
【问题讨论】:
-
如果它们实现的所有东西都相同,为什么不在提取类中实现它,然后让 ParserHtml 和 ParserServer 扩展该类?
-
我打算让其他类直接访问或实例化
Parser,但我不确定在不让它们直接引用 ParserHtml 或 ParserServer 的情况下如何处理它。不过,也许我可以使用一些工厂模式。 -
import parserhtml.dart,它定义了一个 Parser 类,它是真正的 Parser 的子类,并具有 html 版本的工厂构造函数。对服务器版本执行同样的操作。那么除了导入的代码之外,代码可以是相同的。
标签: dart dart-mirrors