课堂上的模拟/操作模式

时间:2014-05-20 14:08:06

标签: python

我必须为每个命令设备操作和模拟模式的类实现。所以在所有类的每个方法中,我都要添加一个这样的if语句:

if self.mode == "operation":
    #some stuff
elif self.mode == "simulated":
    #almost nothing

我很想知道是否想要尽可能地将其写成通用程序以制作一个执行此操作的程序。

在这里,我可以创建2个类DeviceOperation和DeviceSimulated继承,或者它可能无法在Device.mode之后编写设备和交换类。

我真的不知道它是否相关。

如果您有任何评论或更好的方式来做。

1 个答案:

答案 0 :(得分:0)

嗯,很难在几乎没有上下文的设计上提供建议。但看起来你想要的是利用多态性:

class BaseDevice:
    def start(self):
        raise NotImplementedError
    def stop(self):
        raise NotImplementedError
    def pause(self):
        raise NotImplementedError
    def resume(self):
        raise NotImplementedError

class RealDevice(BaseDevice):
    def start(self):
        self.device.do_start()
    def stop(self):
        self.device.do_stop()
    def pause(self):
        self.device.do_pause()
    def resume(self):
        self.device.do_resume()

class SimuDevice(BaseDevice):
    def start(self):
        self._state = "running"
        print("started")
    def stop(self):
        self._state = "stopped"
        print("stopped")
    def pause(self):
        self._state = "paused"
        print("paused")
    def resume(self):
        self._state = "running"
        print("resumed")

这里我假设有一个device成员在" realdevice"它有一个非常简单的API,匹配RealDevice API,虽然在现实生活中很少发生。 SimuDevice虽然基本上是一个状态机,可以保持状态和打印输出发生的事情。然后为了使它成为一个更好的模拟器,你需要让它像真实的设备一样,通过增加延迟和回馈数据。

你可以用鸭子打字做同样的事情:

class RealDevice():
    def start(self):
        self.device.do_start()
    def stop(self):
        self.device.do_stop()
    def pause(self):
        self.device.do_pause()
    def resume(self):
        self.device.do_resume()

class SimuDevice():
    def start(self):
        self._state = "running"
        print("started")
    def stop(self):
        self._state = "stopped"
        print("stopped")
    def pause(self):
        self._state = "paused"
        print("paused")
    def resume(self):
        self._state = "running"
        print("resumed")

除了RealDevice和SimuDevice不从基类继承外,基本上是相同的。多态性优于鸭子类型的优势在于,您可以为您的类实现部分API,并使左侧方法失败。您还可以在母类中定义的两个类之间使用通用方法。基本上,如果您正在进行鸭子打字,并且需要在两个类中复制相同的代码,那么使用多态性会更好。

然后,在单个类中使用duck typing或polymorphism而不是简单条件的优势很多。通过将一个行为附加到一个类,而不是在一个类中混合两个行为,它使代码更易于阅读。并且它还有助于使两个类具有单独的文档。它使维护更容易,因为当有一个影响一个类的错误时,修复不会影响另一个...

然后,如果模拟设备用于测试,您可能需要查看帮助构建对象以模拟行为的mock模块。