代码之家  ›  专栏  ›  技术社区  ›  Chris Swierczewski

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

  •  1
  • Chris Swierczewski  · 技术社区  · 7 年前

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

    我知道在这种情况下“更好”可能是主观的,但我想知道这里是否有一些集体智慧可以借鉴。另外,请注意,在下面的详细信息中,我使用的是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):
            # ...
    

    或者 , 的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 ...
    

    一般来说,这些设计中的一个比另一个更容易接受吗?还是我没有考虑过其他的选择?

    -第一种设计更干净,但可防止 BuilderB 和 从共享关键字名称。此外,它还要求每个建设者包括 **ignored_kwds 在其构建方法声明中。这种方法的危险在于,如果用户拼错了关键字参数,则可能会出现意外行为而不会出错。另一方面,第二种设计使界面 建筑时代

    1 回复  |  直到 7 年前
        1
  •  1
  •   Zazaeil    7 年前

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