生成前的依赖注入
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。
这是我上一个问题 (
有没有办法在生成之前将依赖项传递到结构中?
我有兴趣尝试以一种易于测试的方式编写我的代码。目前,我们的代码库经常使用 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。