それでも OOP は難しい

それでも OOP が難しい印象を受けるのは、やっぱり「クラス」が難しいからかしら。

404 Blog Not Found:オブジェクトは難しくない。難しいのはクラス

非常に共感を覚えます。「オブジェクトは易しい。クラスは難しい。」本当にその通りだわ。

OOPの難しいところはクラスなのですが、OOP習得の難しさ の原因として、あたしとしては静的型付け言語のクラスが、何でもクラスで出来てしまうのがいけない、というのを付け加えたいと思います。

C++ のような静的型付け言語においてクラスは、

  1. 型であり、
  2. オブジェクト生成器であり、
  3. オブジェクトの処理の委譲先(実装)であり、
  4. 時には自身がオブジェクト風に振る舞う様に見える(クラスメンバ)

です。クラス継承は差分プログラミングだけでなくポリモーフィズムも実現します。静的OOPLにおいて、その力の源はほぼ全てがクラスと言っても過言ではありません。いやはや何でもできすぎです。

何でもできすぎるので、クラスについて考えるとき、一体自分が何について考えているのかを自身で把握するのが難しいと感じます。クラス継承を使って差分プログラミングがしたいのか、ポリモーフィズムがしたいのか。クラスを抽象型として働かせたいのか、ファクトリとして働かせたいのか。混線してしまうのです。

C++ のクラスを見ていると、あまりにクラスでうまくいきすぎるので、クラスをつかった「大統一理論」を作り上げてしまったという印象を受けます。しかし、本当は別のものにすべき所まで少々統一しすぎてしまった という印象をぬぐえません。

Javaインターフェイスは、機能的にこそ完全抽象クラスと同等ですが、概念を分離し「インターフェイス」という名前を与えたことに意義があると思います。また、動的型付け言語での OOP 習得が比較的容易なのは、ポリモーフィズムの仕組みがクラス継承に依らない為、差分プログラミングと分けて考えるのが容易というのが大きいと感じます。