0

クラス Aのオブジェクトaがあるとします。特定のタイプの別のオブジェクトの形式で引数を必要とするメソッドがありますが、メソッドによって実行される操作のため、引数も特定の状態である必要があります (たとえば、外部サービスをクエリしているとしますが、それは何か他のものである可能性があります)。 ) が必要です。

class A(object):
    def action(self, argument):

        return do_something(argument)

私の頭に浮かぶ最初の解決策は単純です。メソッドは入力データに条件を適用する必要があります。必要な状態をテストしてから、例外を発生させるか、状態を変更する必要があります。

class A(object):
    def action(self, argument):
        if argument.state == False:
            raise Exception()

        return do_something(argument)

class A(object):
    def action(self, argument):
        if argument.state == False:
            argument.change_state()

        return do_something(argument)

ただし、私たちが話しているインスタンスは、Aの多くのインスタンスの 1 つにすぎません。これらすべてのインスタンスは、入力データに対して同じ操作を実行する必要があります。特定の状態をテストしてから強制するか、単に例外を発生させます。必要な状態が外部呼び出し元によって既に強制されているパラメーターの共有インスタンス、クラス Bのインスタンスを使用できるようです。

class B(object):
    def action(self, argument):
        argument.change_state()
        for a in self.instances_of_A:
            yield a.action(argument)

メソッドによって実行される操作は、メソッド内の引数の必要な状態を強制しないと適切にカプセル化されないと思うので、以前の呼び出し元に移動する必要があると思います。オブジェクトaとクラス Aの他のすべてのインスタンスは、操作を実行するために必要なデータを提供するだけです。

class B(object):
    def action(self, argument):
        argument.change_state()
        for a in self.instances_of_A:
            yield  do_something(argument, a.data)

ただし、別の問題があります。操作は、別のデータを取得するためにA のインスタンスに関連する方法で解釈できる値を返します。現在、操作 do_something はクラス Aのメソッドにカプセル化する必要があるようです。

この問題を解決するにはどうすればよいですか? 現在の設計を維持し、操作によって提供される戻りコードを解釈するために使用できる戻りデータをobjectにする必要がありますか? おそらく、コマンド パターンのチェーンを使用し、クラス Aを変更して、操作を A の他のインスタンスに委任する必要がありますか? 私がそれを処理できる他の方法は何ですか?

4

0 に答える 0