我正在尝试使用Dart遵循代码=配置的习惯用法简洁地定义应用程序中的实体。由于我将定义许多实体,因此我希望代码保持简洁,简洁和易读。
为了使样板尽可能接近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与名称(在这种情况下为“man”)相关联。之所以存在var _man
,是因为Dart中只有变量赋值可以是顶级的。这似乎是将Dart用作DSL的最简洁方法。我没有指望的一件事是延迟初始化。如果我从不访问
_man
,并且我无意这样做,因为entity
函数将我需要的所有相关信息整齐地存储在另一个数据结构中,那么就永远不会运行entity
函数。 This is a feature, not a bug。那么,鉴于延迟初始化的限制,将Dart用作DSL的最干净的方法是什么?
最佳答案
因此,正如您所指出的,Dart的一个功能是在被告知之前不会运行任何代码。因此,如果您希望发生某些事情,则需要在运行的代码中进行操作。一些可能性
将对entity()的调用放在main()函数中。我假设您不想这样做,并且可能您希望人们能够在不修改原始文件的情况下将更多文件添加到其他文件中。
如果您愿意承担镜像的开销(如果将镜像限制在该库中的话)可能不会那么多,请使用它们查找该库中的所有顶级变量并进行访问。或将它们定义为函数或 setter/getter 。但我假设您喜欢变量自动自动生成的特性。您想使用MirrorsUsed注释。
对此的一种变体是使用批注标记要初始化的事物。尽管这很相似,但是您必须遍历带注释的内容,我认为这也需要镜像。
关于dart - 将Dart用作DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983035/