Каков подходящий дизайн для передачи аргументов ключевых слов в компоновщик, который содержит вспомогательные компоновщики компонентов, каждый из которых использует отдельную часть набора параметров?Лучше ли передавать один набор параметров ключевого слова, который затем анализируется каждым подстроителем?Или лучше явно указать, какие наборы параметров принадлежат каким подструкторам при вызове родительского компоновщика?
Я знаю, что «лучше» может быть субъективным в подобных ситуациях, но мне интересно, есть ли какой-то коллективныйМудрость, из которой я могу извлечь здесь.Также обратите внимание, что в деталях ниже я использую особенность, специфичную для языка Python, но приветствуются любые мысли о том, как другие языки управляют этой ситуацией.
Подробности - я использую дизайн компоновщика шаблон, где 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 , BuilderA
может выглядеть следующим образом:
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
и BuilderC
делиться именами ключевых слов.Кроме того, он требует, чтобы каждый из их сборщиков включал **ignored_kwds
в свое объявление метода сборки.Опасность такого подхода заключается в том, что если пользователь неправильно введет аргумент ключевого слова, то может произойти непредвиденное поведение без ошибок.С другой стороны, второй дизайн делает интерфейс к BuilderA
более громоздким, но решает вышеупомянутые проблемы.