矢印型コードの代わりにステータスモード
1370 ワード
「矢印型コード」とは、大量のネスト条件による深すぎるプログラム階層を指し、
矢印型の最大の毒害は、コードを検査するために横スクロールバーをドラッグしなければならないことではなく(PEP 8の処理によって完全に回避できる)、深すぎるネスト階層がコード論理を急激に複雑にし、最内層コードがどのような条件でこれらの文を実行するか分からないことを見て、コードの可読性、メンテナンス性を低下させることである.
この場合,「矢印型コード」にある程度代わる状態モードを導入する必要がある.状態モードとは、1つのオブジェクトが状態を変化させるとその動作を変化させることができるが、オブジェクト自体がクラスを変化させたように見えることを意味する.状態モードは,一連の複雑な論理判断を異なる状態のクラスに移行することによって論理判断を簡略化する.
簡単に例を見てみましょう.
簡単に説明すると、
Python
は天然にインデント区分階層に依存するため、最も直接的な体現は、インデントが誇張された文ブロックであり、画面幅が「足りない」ことを招く.矢印型の最大の毒害は、コードを検査するために横スクロールバーをドラッグしなければならないことではなく(PEP 8の処理によって完全に回避できる)、深すぎるネスト階層がコード論理を急激に複雑にし、最内層コードがどのような条件でこれらの文を実行するか分からないことを見て、コードの可読性、メンテナンス性を低下させることである.
この場合,「矢印型コード」にある程度代わる状態モードを導入する必要がある.状態モードとは、1つのオブジェクトが状態を変化させるとその動作を変化させることができるが、オブジェクト自体がクラスを変化させたように見えることを意味する.状態モードは,一連の複雑な論理判断を異なる状態のクラスに移行することによって論理判断を簡略化する.
簡単に例を見てみましょう.
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
と少し類似している)を有し、ステータスの進入/離脱時の初期化/クリーンアップ作業を処理するために使用することができる.