next up previous
Next: 4.6 メッセージパッシング Up: 4.5 データのタイプ付け Previous: 4.5.3 場合分けを明示する汎用手続き

4.5.4 データ指向型プログラミング

データのタイプごとに場合分けをする 手続きを作るのではなく,データタイプの種類ごとに 適用するオペレーションを登録しておき, あるデータが与えられた時に, そのタイプを調べ,そのタイプ名に登録されている オペレーションを引き出してきて使うという 方法が考えられます. このような方法はデータ指向型プログラミングと 呼ばれます. ここでは,rectangularとpolarというデータタイプ名に 4つのオペレーション(実部,虚部,絶対値,偏角) を属性値とした属性リストに登録しておきます.
(put 'rectangular 'real-part
     real-part-rectangular)
(put 'rectangular 'imag-part
     imag-part-rectangular)
(put 'rectangular 'magnitude-part
     magnitude-part-rectangular)
(put 'rectangular 'angle-part
     angle-part-rectangular)

(put 'polar 'real-part
     real-part-polar)
(put 'polar 'imag-part
     imag-part-polar)
(put 'polar 'magnitude-part
     magnitude-part-polar)
(put 'polar 'angle-part
     angle-part-polar)
こうしておいて,データ(obj)に 対してあるオペレーション(op)を適用したいときの ための手続きoperateを次のように定義します.

(define (operate op obj)
  (let ((proc (get (type obj) op)))
    (if (not (null? proc))
        (proc (contents obj))
      (error
       "Operator undefined
         for this type -- OPERATE"
       (list op obj)))))
こうすると,
(define (real-part obj)
  (operate 'real-part obj))
(define (imag-part obj)
  (operate 'imag-part obj))
(define (magnitude-part obj)
  (operate 'magnitude-part obj))
(define (angle-part obj)
  (operate 'angle-part obj))
というように,operateのみを使って4つの汎用手続きを作ることができます. このように,データのタイプをチェックし,適当な手続きを呼び出すという一 般的な方式をタイプに基づくディスパッチング(dispatching on type)と呼び ます. この方式は,なにか大きなシステムを作るときに,拡張性やモジュラリティを 高めるためによく使われる手法です.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日