2

这是我之前的问题( “new”和“gen”之间的区别)的后续问题。

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

我有兴趣尝试以易于测试的方式编写我的代码。目前,我们的代码库经常使用 get_enclosure_unit() 来获取指向辅助结构的指针,例如翻译器/参数。这导致我们的代码库中有很多双向依赖。这意味着很难独立于其他结构来测试片段。

这是我试图避免的一个例子。

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

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

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

4

1 回答 1

2

没有简单的答案,因为您的架构似乎已经纠缠不清。您对实例树中的这些双向垂直依赖关系持怀疑态度是正确的。一般来说,应该遵循“自上而下的约束”(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来引发失败,以防您忘记约束它。

只是我的2美分。

于 2015-07-01T13:50:20.930 回答