生成前的依赖注入

Dependency Injection before generation

这是我上一个问题 () 的后续问题。

有没有办法在生成之前将依赖项传递到结构中?

我有兴趣尝试以一种易于测试的方式编写我的代码。目前,我们的代码库经常使用 get_enclosing_unit() 来获取指向辅助结构的指针,例如 translator/params。这导致我们的代码库中存在大量双向依赖项。这意味着很难独立于其他结构测试片段。

这是我试图避免的例子。

pregenerate() is also {
  var translator : my_translator_s = get_enclosing_unit(some_enclosing_unit).get_translator_pointer();
};

我试图避免依赖 some_enclosing_unit 因为它与我的结构无关并且妨碍单元测试

由于 e 中缺少构造函数,我不知道如何在不使用 get_enclosing_unit() 的情况下从调用 unit/struct 传递依赖项。 "new... with" 似乎可以提供帮助,但正如我在上一个问题中了解到的那样,它不会生成基础字段并且 "gen...keeping" 在生成完成之前不会设置我生成所需的依赖项.

没有简单的答案,因为您的架构似乎已经纠缠不清了。 您对实例树中的这些双向、垂直依赖关系的怀疑是正确的。通常,应遵循上层约束 (CFA) 策略,在该策略中,您将依赖项向下传递到层次结构中,如

unit child_u {
    p_tr: translator_s;
    keep soft p_tr == NULL; // safety catch, in case you forget to constrain it
};

unit parent_u {
  tr: translator_s;
  child: child_u is instance;
  keep child.p_tr == tr;
};

另外,我建议不要单元之间有生成依赖关系。通过这种方式,您可以保持所有指向不可生成的单元的指针,并将它们连接到生成后调用的单元的 connect_pointers() 方法中(参见文档)。

extend child_u {
  !p_parent: parent_u;
}
extend parent_u {
  connect_pointers() is also {
    child.p_parent = me;
  };
};

但是当然你不能在 child 中有指向 parent 的约束。 如果您绝对需要生成的指针,请使用 keep soft <ptr> == NULL 来引发失败,以防您忘记约束它。

只是我的 2cents。