generic operations with explicit dispatch
新しい型のデータを加えるときは,選択子がデータ型の詳細を他の関数から隠しているなら、その選択子のみの書き換え(新しい型から選択できるようにする)を行えばいい感じかと思います。
新しい操作を加えるときは、上の選択子の書き換えさえすんでいたら何も必要は無いか。
data-directed style
新しい型のデータを加えるときは、その型の選択子を書き換える。もしその型に関する操作が必要なら、それをテーブルに追加しないとダメかなー。
新しい操作を加えるときは、その操作をテーブルに加える。
message-passing
message-passingだと、型の追加と操作の追加ってほとんど同義に見えるんだけど、違うの?
最後
頻繁にデータ型の追加が発生するんなら、message passingが良いような気がします。data-directed styleだと逐一テーブルにその型と型に付随する操作を追加していくのがメンドい。
既存の型に新しい操作を加える作業が頻繁に発生するのであれば、data-directed styleが良さそう。テーブルにその関数を単に追加するだけでおk。