我試圖用Dart在應用程序中簡潔地定義實體,遵循代碼=配置的習慣用法。由於我將定義許多實體,因此我希望儘可能使代碼儘量簡潔和易讀。使用Dart作爲DSL
在努力保持樣板接近0線有可能,我最近寫了一些像這樣的代碼:
// man.dart
part of entity_component_framework;
var _man = entity('man', (entityBuilder) {
entityBuilder.add([TopHat, CrookedTeeth]);
})
// test.dart
part of entity_component_framework;
var man = EntityBuilder.entities['man']; // null, since _man wasn't ever accessed.
的entity
方法相關聯的entityBuilder傳遞到函數的名稱(「男人」在這種情況下)。 var _man
存在,因爲只有變量分配才能在Dart中處於頂層。這似乎是將Dart用作DSL的最簡潔的方式。
雖然我不指望的一件事是懶惰的初始化。如果我從來沒有訪問過_man
--而且我也不打算這樣做,因爲entity
函數整齊地存儲了我在另一個數據結構中需要的所有相關信息 - 那麼entity
函數永遠不會運行。 This is a feature, not a bug。
那麼,在給定延遲初始化限制的情況下,使用Dart作爲DSL的最簡單方法是什麼?
我認爲你需要提供更多的上下文。我不清楚你想要做什麼。但在小圖中,你可以使它成爲(entityBuilder)=> entityBuilder.add([TopHat,CrookedTeeth]);並有add方法返回已添加的東西。然後你可以說var man = _man; –
我編輯了這個問題。基本上,我試圖使用Dart配置實體,而不是解析YAML或其他配置文件。但是,懶惰初始化阻止我使用更簡潔的樣式。 – ALW
https://gist.github.com/radicaled/8309609 - 以另一種方式說話,懶惰的初始化阻止我在不首先接觸臨時變量的情況下使用DSL(我不需要使用它,因爲我會在示例中直接使用數據存儲「potatoSack」)。 – ALW