次のセットアップを説明する設計パターンはありますか? この設計には大きな問題がありますか?
クラスインスタンスは、「ダム」コンストラクタまたは「インテリジェント」ファクトリ メソッドのWidget
いずれかによって構築できます。Widget.__init__()
Workbench.upgrade_widget()
class Widget:
def __init__(self, abc, def, ...):
self.abc = abc
self.def = def
...
...
class Workbench:
# widget factory function, which uses data from the workbench instance
def upgrade_widget(self, widget, upgrade_info):
widget = Widget(widget.abc, widget.def, ...)
# I will modify the widget's attributes
...
self.rearrange_widget(widget, xyz) # modifies widget's internal state
...
widget.abc = ... # also modifies widget's state
...
return widget
# uses data from the workbench instance
def rearrange_widget(self, widget, xyz):
...
# this class does other stuff too
...
ウィジェットは、完全に初期化された後にそのインスタンスを変更してはならないという意味で不変です (多くのコードがこの不変条件に依存しています)。しかし、初期化中にウィジェットを変更することは非常に便利で、コードがずっときれいになることがわかりました。
私の主な関心事は、別のクラスで「不変」ウィジェットを変更することです。にのみ含まれupgrade_widget
ていた場合、渡されたウィジェットは変更されないため、そのまま使用できます。しかし、そのメソッドは、引数として受け取ったウィジェットを変更する他のWorkbench
メソッド ( ) に依存しています。rearrange_widget
この「不変」インスタンスを実際に変更できる場所を制御できなくなっているように感じますrearrange_widget
。すでに完全に初期化されているウィジェットを誰かが誤って呼び出して、災害につながる可能性があります。