状态模式替代箭头型代码

所谓“箭头型代码”是指大量嵌套条件导致的过深的程序层次,由于Python天然依赖缩进区分层级,所以最直接的体现就是一个缩进极夸张的语句块,导致屏幕宽度“不够用了”。

箭头型最大的毒害还不在于必须拖动横向滚动条才能检查代码(这点按照PEP8的处理方式完全可以避免),而在于过深的嵌套层次导致代码逻辑骤然复杂,看到最内层代码都不知道哪些条件下会执行这些语句,导致代码的可读性、可维护性降低。

这时引入状态模式来一定程度上替代“箭头型代码”就非常必要了。所谓状态模式是指当一个对象内在状态改变时允许改变其行为,但看起来对象本身像是改变了类。状态模式通过将一系列复杂的逻辑判断转移到不同状态的类中来简化逻辑判断。

简单来看个例子:

from state import curr, switch, stateful, State, behavior
@stateful
class Me(object):
    class WorkDay(State):
        default = True
        @behavior
        def daytime(self):
            print 'Work whole day!!!'
    class Weekend(State):
        @behavior
        def daytime(self):
            print 'Relax Sleep and Have fun!!!'

felix = Me()
while 1:
    for i in range(1, 8):
        if i==6:
            switch(felix, Me.Weekend)
        if i==1:
            switch(felix, Me.WorkDay)
        felix.day()

简单说明一下,被@stateful装饰器修饰的类的实例本身带有状态,可以通过curr()来查询,通过switch()来转换,而WorkDayWeekend所继承的State类带有__begin____end__状态转换协议(有点类似于上下文语句with)可以用来处理在状态进入/离开时的初始化/清理工作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,913评论 25 709
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,076评论 0 4
  • 简介 当android应用启动的时候会启动一条主线程,这个主线程负责向UI组件分发事件(包括绘制事件),所以当在主...
    lee小杰阅读 3,715评论 0 3
  • webui metrics 外部设施 都可以用来监控spark应用的运行 每一个sparkcontext可以启动一...
    xncode阅读 3,966评论 0 1
  • C++入门笔记:高级编程 文件和流 打开文件void open (const char *filename, io...
    云之外阅读 4,278评论 0 4