所谓“箭头型代码”是指大量嵌套条件导致的过深的程序层次,由于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()
来转换,而WorkDay
和Weekend
所继承的State
类带有__begin__
和__end__
状态转换协议(有点类似于上下文语句with
)可以用来处理在状态进入/离开时的初始化/清理工作。