ポリモーフィズムは一般的にオブジェクト指向の代名詞のように扱われることが多いですが、ポリモーフィズムを再利用性の観点から説明する場合には慎重に行わなければならないと私は考えます。なぜならポリモーフィズムの根源的な意味とは、オブジェクト同士の結合を弱める疎結合化の仕組みにあるからです。再利用の役割を担っているのは(そうなるように作った)設計の側にあり、オブジェクトそのものの方にあると言えると思います。ポリモーフィズムはオブジェクトを再利用可能なまでに汎化させるための手段の一つに過ぎません。どちらかと言えば抽象化し実装への依存度を下げることで将来的な拡張に備えることに力点が置かれた仕組みであり、説明の際は「拡張性」あるいは「拡張における再利用性」と厳密に言うべきかもしれません。どちらにしてもその土台には「抽象化」という設計思想が存在し、ただただポリモーフィズムの仕組みを使っていれば良いプログラムなんだというわけではありません。
では設計における「抽象化」というのはどういうことでしょうか。
ここにも私は注意を払うべき点があると感じています。なぜなら基底となるクラスが抽象化されるのは設計の結果そうなるのであって、抽象化することそのものが設計の目的ではないからです。もし抽象化が何に置いても是であるとするのならば、すべてのインタフェースはvirtualに抽象化されなければなりません。しかしあまりにも汎化の進んだモジュールは可読性やアクセシビリティを恐ろしく低下させます。抽象化は将来拡張の可能性のある箇所にのみ行うべきであり、拡張部分を局所化し効率良く機能させるためにも、疎結合化、論理階層化、モジュール化などの観点からの設計をまず行わなければなりません。
オブジェクトは現実にあるものを写実する必要すらありません。オブジェクトを説明する際によく使われる「データやその集合を現実世界のモノになぞらえうんぬんかんぬん……」という文章は、間違ったメッセージを与える可能性があるという点で問題があると思います。
近年のプログラミング言語には疎結合化を促す仕組みや工夫が言語仕様となって顕著に現れてきています。要素へのアクセス権やカプセル化などがそうで、特にオブジェクト指向言語でいうところの継承やポリモーフィズムといった概念も、なるべく関係性を疎に保ちながら再利用を実現させる技法として疎結合性の追及に主眼を置いているものと私は考えます。ポリモーフィズムに関して言えば、(これについて様々な利点を挙げられる方がいらっしゃいますが)私としては「不要なスコープを遮断することによる疎結合性の強化」以上の優位性をあまり感じたことはありません。これまでの経験上、初期設計段階からすべての拡張可能性を考慮し、多様性にインプリメントさせることは多くの場合において困難だったと記憶しています。もちろん「疎結合性の強化」という意味合いにおいて非常に重要な機能であることは言うまでもありません。ポリモーフィズムを学習させる際は、スコープの遮断という目的に焦点を定めた教育アプローチの方が筋が良いのではないかと私は思います。
コメント