Next: 4.6 メッセージパッシング
Up: 4.5 データのタイプ付け
Previous: 4.5.3 場合分けを明示する汎用手続き
データのタイプごとに場合分けをする
手続きを作るのではなく,データタイプの種類ごとに
適用するオペレーションを登録しておき,
あるデータが与えられた時に,
そのタイプを調べ,そのタイプ名に登録されている
オペレーションを引き出してきて使うという
方法が考えられます.
このような方法はデータ指向型プログラミングと
呼ばれます.
ここでは,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日