有沒有什麼方法可以根據Dart中的環境標誌或目標平臺有條件地導入庫/代碼?我試圖根據目標平臺在dart:io
的ZLibDecoder/ZLibEncoder類和zlib.js之間切換。Dart包的有條件導入/代碼
有一篇文章介紹瞭如何create a unified interface,但我無法想象這種技術不會創建重複代碼和冗餘測試來測試重複代碼。 game_loop
employs 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擴展該類? – Nathanial
我打算讓其他類直接訪問或實例化'Parser',我不知道如何讓它們不直接引用ParserHtml或ParserServer來處理它。不過,也許有一些我可以使用的工廠模式。 – ALW
import parserhtml.dart,它定義了一個類Parser,它是真實的子類,並且具有html版本的工廠構造函數。對服務器版本也是這樣做的。然後代碼可以是相同的,除了它輸入的內容。 –