次の設定を記述するデザインパターンはありますか?このデザインは大きな問題を抱えていますか? 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
と呼ぶことがあります。
Python 2では常にクラスを「オブジェクト」から継承します。そうしないと、オブジェクトから継承しないクラスが古いスタイルクラスであるため、機能が不足し、誤動作を診断しにくくなる可能性があります。 – jsbueno
申し訳ありませんが、Python 3 .... – max