在多次调用方法时使用的参数的条件:由调用者或方法强制执行?

时间:2015-11-21 22:32:15

标签: python encapsulation chain-of-responsibility

假设我有 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 的众多实例中的一个。所有这些实例应对输入数据执行相同的操作:针对特定状态测试它,然后执行它,或者只是引发异常。似乎他们可以使用参数的共享实例,其所需状态已由外部调用者强制执行, 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类 的方法中。

我该如何解决这个问题?我应该简单地保留当前设计并使对象 a 返回可用于解释操作提供的返回代码的数据吗?也许我应该使用命令链模式并修改 A类 来将操作委托给A的其他实例?我能处理的其他方法是什么?

0 个答案:

没有答案