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