所謂“箭頭型代碼”是指大量嵌套條件導致的過深的程序層次,由于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
)可以用來處理在狀態進入/離開時的初始化/清理工作。