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

2024-09-27 21:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我知道“更好”在这种情况下可能是主观的,但我想知道是否有一些集体智慧我可以借鉴,在这里。另外,请注意,在下面的细节中,我使用的是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的接口更麻烦,但解决了上述问题


Tags: buildselfnone参数paramdefbuilder关键字
1条回答
网友
1楼 · 发布于 2024-09-27 21:29:21

当然,狭隘的东西。不要让你的作品特定建设者“知道”整个世界;作为回报,它肯定会刺伤你

地图的地图是更好的解决方案,以及更灵活。最终,您可能会发现自己处于一种奇怪的情况,不同的子生成器需要同一抽象类的不同实现

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

相关问题 更多 >

    热门问题