《06》依存性:change&update(6)〈Python 3.0 版〉

Python à la carte記事一覧
《06》依存性:change&update(6)

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28

主モデルの状態が時間とともに変化する

モデルの状態が時間とともに変化するとき、それに呼応する動作を規定したい場合もあります。


>>> m = ValueHolder()

主となるモデル(として、ValueHolder のインスタンス)m を生成します。

ビューの状態を変化させる

>>> import sys
>>> def show(e): print(e,end=" "); sys.stdout.flush()
... 
    
関数 show は、引数 e の値を出力します。ここで、stdout.flush() とあるのは、その値を確実に出力するためです。これを省略するとどうなるか、試してみるのも一興です。 《Note》ここで注目して欲しいのは、値をどのように出力するか(how)を知っていても、その値をいつ出力するか(when)を知らないし、またそれを知る必要がないことです。すると、特定の状況に依存しないので、その再利用性が向上します。■
>>> m.compute(lambda self,e: show(e))
<__main__.BlockValue object at 0x603390>
メソッド compute を使って、モデルの動作を規定(すると同時に、BlockValue のインスタンス 0x603390 を生成)します。ここでは、モデル m の値 e を(関数 show を使って)出力するだけです。

モデルの状態を変化させる

>>> from time import sleep
>>> def countdown(self,n):
...     for e in range(n,0,-1):
...         self.value(e); sleep(1)
...     print("... Bomb!!")
... 
    
関数 countdown は、引数 n の値が 0 になるまで(sleep を利用して)その値 e を1秒おきに出力します。メソッド value を呼び出すと、主モデル self の値が変化したのに呼応して、すでに compute で規定した処理を実行します。すると、カウントダウンの値が出力されます。つまり、value の実引数 e が(compute を介して)show の仮引数 e に対応します。 《Note》ここで注目して欲しいのは、値がどのように変化するか(how)を知っていても、その変化がどこに反映されるか(where)を知らないし、またそれを知る必要がないことです。すると、特定の状況に依存しないので、その再利用性が向上します。■
>>> m.countdown = lambda n: countdown(m,n)
インスタンス属性 countdown には、カウントダウンを実行する関数 lambda を設定します。
>>> m.countdown(5)
5 4 3 2 1 ... Bomb!!
    
(主モデル m に固有のメソッド)countdown を呼び出すと、指定した実引数 5 から、カウントダウンが始まります。 まず、実引数 5 が lambda の仮引数 n に対応するので、関数 countdown(m,5) が呼び出されます。次に、実引数 m が countdown の仮引数 self に、実引数 5 が countdown の仮引数 n に、それぞれ対応します。すると、self.value(e) によって、主モデル m の値が変化したのに呼応して、compute で指定した関数 show が呼び出され、カウントダウンの値を出力します。

Tips

関心の分離の原則に沿って、how と when/where とを分割統治すると、その再利用性が向上します。
Last updated♪09/03/22