狀態模式替代箭頭型程式碼

weixin_34402408發表於2017-07-30

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

相關文章