所謂“箭頭型代碼”是指大量嵌套條件導(dǎo)致的過深的程序?qū)哟危捎?code>Python天然依賴縮進區(qū)分層級芝此,所以最直接的體現(xiàn)就是一個縮進極夸張的語句塊憋肖,導(dǎo)致屏幕寬度“不夠用了”因痛。
箭頭型最大的毒害還不在于必須拖動橫向滾動條才能檢查代碼(這點按照PEP8的處理方式完全可以避免)婚苹,而在于過深的嵌套層次導(dǎo)致代碼邏輯驟然復(fù)雜,看到最內(nèi)層代碼都不知道哪些條件下會執(zhí)行這些語句鸵膏,導(dǎo)致代碼的可讀性膊升、可維護性降低。
這時引入狀態(tài)模式來一定程度上替代“箭頭型代碼”就非常必要了谭企。所謂狀態(tài)模式是指當(dāng)一個對象內(nèi)在狀態(tài)改變時允許改變其行為廓译,但看起來對象本身像是改變了類。狀態(tài)模式通過將一系列復(fù)雜的邏輯判斷轉(zhuǎn)移到不同狀態(tài)的類中來簡化邏輯判斷债查。
簡單來看個例子:
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
裝飾器修飾的類的實例本身帶有狀態(tài),可以通過curr()
來查詢盹廷,通過switch()
來轉(zhuǎn)換征绸,而WorkDay
和Weekend
所繼承的State
類帶有__begin__
和__end__
狀態(tài)轉(zhuǎn)換協(xié)議(有點類似于上下文語句with
)可以用來處理在狀態(tài)進入/離開時的初始化/清理工作。