将参数传递给带有组件子构建器的构建器

时间:2019-01-31 18:59:56

标签: python oop design-patterns builder

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

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

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

class BuilderA():
    def __init__(self):
        self.builder_b = BuilderB()
        self.builder_c = BuilderC()

    def build(self, **build_parameters):
        artifact_b = self.builder_b.build(**build_parameters)
        artifact_c = self.builder_c.build(**build_parameters)
        # ... do something to create BuilderA's artifact ...

每个子构建器都有不同的关键字参数:

class BuilderB():
    def build(self, param_1=None, param_2=None, **ignored_kwds):
        # ...

class BuilderC():
    def build(self, param_3=None, param_4=None, **ignored_kwds):
        # ...

或者BuilderA的API可能如下所示:

class BuilderA():

    def build(self, builder_b_parameters={}, builder_c_parameters={}):
        artifact_b = self.builder_b.build(**builder_b_parameters)
        artifact_c = self.builder_c.build(**builder_c_parameters)
        # ... do something to create BuilderA's artifact ...

这些设计中的一种通常比另一种更可接受吗?还是我没有考虑过其他选择?

思路-第一种设计更简洁,但阻止BuilderBBuilderC共享关键字名称。另外,它要求他们的每个生成器在其生成方法声明中都包含**ignored_kwds。这种方法的危险在于,如果用户拼错了关键字参数,则可能会出现意外行为而不会出错。另一方面,第二种设计使到BuilderA的界面更加麻烦,但解决了上述问题。

1 个答案:

答案 0 :(得分:1)

当然,狭窄的东西。不要让特定于工件的构建器“了解”整个世界。它肯定会刺你的回报。

Maps地图是更好的解决方案,并且更加灵活。最终,您可能会发现自己处于一种奇怪的情况下,即differnet子生成器需要相同抽象类或类似对象的不同实现。

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