Python 将参数传递给具有组件子生成器的生成器

Python 将参数传递给具有组件子生成器的生成器,python,oop,design-patterns,builder,Python,Oop,Design Patterns,Builder,将关键字参数传递给包含组件子构建器(每个组件子构建器都使用参数集的不同部分)的构建器的合适设计是什么?是否最好传入一个关键字参数集,然后由每个子生成器解析?还是在调用父构建器时明确指定哪些参数集属于哪些子构建器更好 我知道在这种情况下“更好”可能是主观的,但我想知道这里是否有一些集体智慧可以借鉴。另外,请注意,在下面的详细信息中,我使用的是Python语言特有的功能,但是对于其他语言如何管理这种情况,我们非常感谢 详细信息-我使用的模式是BuilderA包含子生成器BuilderB()和Buil

将关键字参数传递给包含组件子构建器(每个组件子构建器都使用参数集的不同部分)的构建器的合适设计是什么?是否最好传入一个关键字参数集,然后由每个子生成器解析?还是在调用父构建器时明确指定哪些参数集属于哪些子构建器更好

我知道在这种情况下“更好”可能是主观的,但我想知道这里是否有一些集体智慧可以借鉴。另外,请注意,在下面的详细信息中,我使用的是Python语言特有的功能,但是对于其他语言如何管理这种情况,我们非常感谢

详细信息-我使用的模式是
BuilderA
包含子生成器
BuilderB()
BuilderC
。我目前的设计思想是将相同的关键字参数集传递给每个子生成器:

class BuilderA():
定义初始化(自):
self.builder_b=BuilderB()
self.builder_c=BuilderC()
def构建(自身,**构建参数):
artifact_b=self.builder_b.build(**build_参数)
工件\u c=self.builder\u c.build(**build\u参数)
# ... 做点什么来创建BuilderA的工件。。。
每个子生成器都有不同的关键字参数:

class BuilderB():
def构建(自,参数1=None,参数2=None,**忽略的参数):
# ...
类BuilderC():
def构建(自,参数3=None,参数4=None,**忽略的参数):
# ...
或者,
BuilderA
的API可以如下所示:

class BuilderA():
def build(self,builder_b_参数={},builder_c_参数={}):
artifact_b=self.builder_b.build(**builder_b_参数)
工件c=self.builder\u c.build(**builder\u c\u参数)
# ... 做点什么来创建BuilderA的工件。。。
一般来说,这些设计中的一个比另一个更容易接受吗?还是我没有考虑过其他的选择


想法-第一种设计更简洁,但防止
BuilderB
BuilderC
共享关键字名称。另外,它要求每个构建器在其构建方法声明中包含
**忽略的\u kwds
。这种方法的危险在于,如果用户拼错了关键字参数,则可能会出现意外行为而不会出错。另一方面,第二种设计使得BuilderA的界面更加繁琐,但解决了上述问题。

当然,范围很窄。不要让你的特定于工件的构建者“了解”整个世界;这肯定会反过来刺伤你

地图的地图是更好的解决方案,也更灵活。最终,您可能会发现自己处于一种奇怪的情况中,不同的子构建器需要相同抽象类或任何东西的不同实现


通过显式标记使事情更加简单

附加细节:其中一个子构建器使用另一个子构建器的输出,因此我无法在
BuilderA
之外调用这些构建器,并将工件作为参数传入。经过进一步思考,我同意。我认为我写的第一种方法更具可读性,但事实上,我认为它会增加认知负荷。(并担心我会覆盖参数。)感谢您的回复。