这是我之前提问(Difference between "new" and "gen")的后续问题。
有没有办法在生成之前将依赖项传递给结构体?
我有兴趣尝试以易于测试的方式编写代码。目前,我们的代码库经常使用get_enclosing_unit()来获取指向辅助结构的指针,例如翻译器/参数。这导致我们的代码库中存在大量双向依赖关系。这意味着很难独立于其他结构测试碎片。
这是我要避免的一个例子。
pregenerate() is also {
var translator : my_translator_s = get_enclosing_unit(some_enclosing_unit).get_translator_pointer();
};
我试图避免依赖some_enclosing_unit,因为它与我的结构无关并妨碍了单元测试
由于e中缺少构造函数,我不知道如何在不使用get_enclosing_unit()的情况下从调用单元/结构中传递依赖项。 “new ... with”似乎可能有所帮助,但正如我在上一个问题中所了解的那样,它不会生成基础字段,并且“gen ... keep”不会设置我的生成所需的依赖项,直到之后一代人已经完成。
答案 0 :(得分: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点。