1a)対象となる要素:Element

Visitor::Element では、対象とする要素に共通するプロトコルを規定します。

## --------------------             # Visitor::Element
class XShape:
    def accept(self, v):
        source = "v.visit_%s(self)"%self.__class__.__name__
        eval(source)    ; print source

多種多様な対象を扱いたいときに、それらの違いを捨象するとともに、動的な問題解決が可能になるメカニズムが提供されていると、便利です。すると、XShape の傘下では、個別にメソッド accept を用意する必要がなくなります。次のような(単調な)コードを何度も繰り返し記述することを想像すると、その効用が分かります。

## --------------------
class EllipseShape:                 # ('.')
    def accept(self, v):
        v.visit_EllipseShape(self)
class PolygonShape:                 # (-.-)
    def accept(self, v):
        v.visit_PolygonShape(self)
class BooShape:                     # (=.=)
    def accept(self, v):
        v.visit_BooShape(self)

どのメソッドを必要とするかは、実行時にオブジェクト自身 self に決定させるのが得策です。「クラス」指向から「オブジェクト」指向への扉を開く鍵は、こんなところにも落ちています。


《Tips》 未熟な OOP 言語仕様のツケをパターンで清算する憂き目(力仕事:ハードコーディング)から、プログラマーを解放します。単調な作業の繰り返しは、得てして後で見つけるのが困難なバグを誘発しがちです。ハードウェア/ソフトウェアの特性を知ることで、プログラム(算譜)の質の向上が期待できるのと同様に、ヘッドウェアの特性を知っておくと、プログラミング(作譜)の質の向上が期待できます。□