我正在尝试使用Depenceny Injection模式。这个问题是关于“不要撒谎API”并传递给类所需的构造函数一切。
我正在重构一些旧代码,我发现在构造函数中实例化了一个对象,然后从该对象创建了另一个对象,并且它们都存储在要实例化的对象中。
这是python,但这个概念是不可知的。
class Element(object):
def __init__(self):
self._node = NodePath(...)
self._subnode = self._node.attachNewNode('blablabla')
因此,显然必须注入第一个NodePath实例,但是通过在第一个节点上调用方法attachNewNode
创建的子节点呢?是否应该注射?
这只是注入主节点:
class Element(object):
def __init__(self, node):
self._node = node
self._subnode = self._node.attachNewNode('blablabla')
这会注入两个节点:
class Element(object):
def __init__(self, node, subnode):
self._node = node
self._subnode = subnode
从可测试性来看,第二个明显更好,但如果我继续这样做,我的构造函数会变得有点麻烦,我觉得它可能不对。
提前致谢
答案 0 :(得分:1)
这取决于node
的性质,但是,如果暂时我们假设没有漏洞抽象和适当的封装,那么attachNewNode
方法looks like会产生副作用自由功能。
如果是这种情况,在构造函数中调用attachNewNode
只是一种缓存形式。从基本正确性的角度来看,你也可以不这样做,但是当你需要它时而不是在构造函数中调用。
但是,一般来说,你是shouldn't call methods on your dependencies during construction。