WPF に対する非依存性を促進する

たとえば、Windows Form で作成した既存のアプリケーションを、新たに WPF アプリケーションとして再構築するときに「再利用可能なモジュールだけが整理整頓されていたら」どんなに楽でしょうか。私たち「タマゴ倶楽部」のモットーにも「楽をするための努力なら惜しみません」を掲げているだけに、ここはアピールしておきたいことです。
モジュール TetrisContext.py は、WPF に依存するコードの断片を隠蔽するとともに、相互に独立したモジュールの分割統治を促進します。すると、要求仕様の変更に伴って、WPF に代わる新たなフレームワークを導入するときに、既存のアプリケーションの再利用性が向上します。

from System.Windows.Shapes import Polygon
class XPolygon:
    def __init__(self, Points=None, **args):
        self.value = Polygon(
            HorizontalAlignment=HorizontalAlignment.Center,
            VerticalAlignment=VerticalAlignment.Center,
            Points=Points.value,
            **args)

Smalltalk 版(第1版)と違って、Python 版(第3版)はやや冗長な表現になってしまいがちです。なぜなら、Smalltalk ではオブジェクトに最適な制御構造を自由に定義できますが、Python ではコンパイラーに組み込みの制御構造に課された制約の下で、コードの断片を記述せざるを得ないからです。

    def __iter__(self):
        for e in self.value.Points:
            yield e

Python では、組み込みの制御構造である for を使って、オブジェクトに最適な制御構造を実現する必要があります。ここでは、多角形を構成する各頂点の座標を順にアクセスする方法を提供します。すると、次に示すように、

class Omino(object):
    def shift(self, n=0):
        ...
        def _points(s):
            return XPointCollection([XPoint(e.X + n*W, e.Y) for e in s])
        for s in self.shape:
            s.update(_points, s)
        ...    

簡潔で見通しの良いコードを記述できるようになります。インスタンス属性 self.shape は、テトリミノを構成する4つの6角形を管理します。ここでは、for に続く制御変数 s が、6角形を構成する各頂点の座標を順に参照します。ここで注目して欲しいのは、各頂点をどのようにして参照するか(how)は知る必要がなく、それを使って何をしたいか(what)「テトリミノを左右にシフトするために、各頂点の座標を更新 update したい」を理解できればいいということです。