動的言語とオブジェクト指向

クラスおよび継承の意義は以下のものだと思う。


Pythonなどの動的言語では基本的にはDuckTypingなのでインタフェースという考え方がない。Python3.0ではABC(Abstract Base Classes)があるがオプショナル。なのでポリモーフィズム機能は不要。継承は「ポリモーフィズム」+「Mix-in」だと思うので、RubyのようにMix-inだけあれば十分だと思われる。もはや継承という機能をなくした方が良いと思う。ポリモーフィズムやインタフェースは少なくともABCのようなオプショナルなやり方で十分に思える。そもそも1つの機能で2つの意味を持っているからおかしいことになるのだと思う。


継承を辞めると言っても、型を持つ言語であればポリモーフィズムを行う上で型の階層化を伴ったグループ化はできる必要がある。しかし、継承という機能によって型のグループ化をしなくても良いと思う。それ専用の別の機能を付ければ良いのだと思う。ただし、世間一般に広まっている構文や機能というのは受け入れやすいので、あまり大きく違うと受け入れられるまで時間がかかりそう。


カプセル化とマルチプルインスタンスは重要。クラスは1つの小さいプログラムとなる。しかもそれが簡単に複製できる。しかし、若干コストが高いのでC++のinline関数のようにコストを安くする仕組みがクラスにもあっても良いと思うがどうだろう?そうすればクラスを多用することが(クラス定義をたくさん作ることが)できる。クラスを多用ことは可読性を上げるのか下げるのか?以前ある人の記事でScalaはパターンマッチのためにクラスを多用するという記事があった。以前私もローカル的にちょっとした処理をするのにクラスを使うと良いと考えたことがある。例えば、for idx, xyz in a_pntsのように、多重代入できると(型指定がなくても)一時的に値に変数名を付けることができるので可読性が若干上がるというのがある。それと同様に、クラスは属性(フィールド)として変数名を付けられるので、例えばリストにタプルとしてデータを格納して[('aaa', 1), ('bbb', 2), ...]とするより、[d1, d2, ...]で、d.name, d.idxとした方が意味が分かりやすい。データが階層的になってくるともっと見やすい。もっと言えば、オプショナルで型が付けられるとベスト。特に界面(関数の引数)で型チェックできると便利。


あといつも思うのは、クラスの意味が複数あるのに言語として区別する機能がない。例えば、POD(Plain Old Data)のような単なるデータ的なクラスとか、先の例の可読性を上げるためだけのような使い捨てのクラスとか、データでなくまとまった処理を集めたような関数的なクラスとか、区別はプログラマの頭の中やコメントやドキュメントにしか存在しない。また、PythonでコーディングしているとほとんどがPODで、クラスをシンプルにするため関連した処理もできるだけ外で定義するようにしている。たまに関数的クラスを使う。それ以外はほとんどクラスを使用しない。そもそも複雑なことをしないといけないのは、設計が悪かったり言語が悪かったりすると思うので、いずれにしても本質的な部分でないような気がすする。汎用的なライブラリやフレームワークを作るのは別かもしれないが。


オブジェクト指向の概念は不滅だと思うが、もっと手軽でシンプルなものにして欲しい。プロトタイプベースに関して全く考えていないが、そっちは手軽なのかな?あとはパターンマッチのメリットをきちんと知りたい。