テトリミノ:石の回転

内周だけを回転させる場合と、外周とともに回転させる場合とで、分割統治が可能です。これによって、開放閉鎖原則に沿った記述が可能になります。

class Omino(object):
    def rotateClockwise(self):
        self.phase = self._rotate1(1)
        for e, n in zip(self.shape[self.offset:], self.mino1):
            e.Points = self.matrix1[self._rotate1(n)]

共通する特性として、内周だけを回転させる動作を規定します。このとき「外周」について気に掛ける必要はありません。つまり、将来の仕様変更に依存しない(閉じている closed)記述が可能です。そのため、共通する特性 mino1/matrix1/_rotate1 だけを使って、必要な処理を記述できます。

class PiOmino(SigOmino):
    def rotateClockwise(self):
        super(PiOmino, self).rotateClockwise()
        for e, n in zip(self.shape[len(self.mino1)+1:], self.mino2):
            e.Points = self.matrix2[self._rotate2(n)]

拡張した特性として、同時に外周を回転させる動作を規定します。このとき「内周」について気に掛ける必要はありません。つまり、自由に仕様変更に対処した(開いている open)記述が可能です。そのため、共通する特性 mino1 を再利用するだけ(変更しない)で、拡張した特性 mino2/matrix2/_rotate2 を使って、必要な処理を記述できます。