クラスとは

classとはなんぞやと考えている。たどり着いたところまでまとめる。

クラスとは、同じ性質を持ったオブジェクトを分類 (classification) したものである。漢字で書くと類です。同じクラスに属しているオブジェクトは同じような性質を持っている。クラスは、その要素 (element, 元という) が共通して持つ性質によって定義される。名前が付いているというのも大事なところだ。*1正しいソースコードであれば、クラスには属するオブジェクトの共通した性質を代表した名称がついている。

オブジェクトの性質とはなんだろう。それはメソッドだ。性質というのは、外から観察できるもののことだ。オブジェクトはメソッドによって外部とやりとりする。したがって、同じメソッドを持っていて、そこから外部に出力されるものが似ているオブジェクトは共通した性質を持っていると言え、それらは同じクラスに属していることとなる。

しかし、プログラミングの世界では、オブジェクトがまずあって、その性質を人間が分類して整理していくわけではない。

プログラミングの世界では概念が先にあるという世界観でものを見なければならない。先に分類があって、それに属するオブジェクトが後から作られる。ものが先にあるのか、名称(概念)が先にあるのかというのは、世界観によって立場が異なる。前者が主流の考え方だろうけれども、オブジェクト指向は後者の考え方をする。

概念としてのクラスを定義するのは設計者だ。プログラムの設計は難しい仕事だと思うけれども、それは概念からまず考えて行かなければならないからだろう。詳しくないので誤っているかもしれないが、概念が先にあるという世界観では概念は神的なものが天下り的に与えるものだと思うが、プログラムの設計はオブジェクトたちの神の視点に立って世界を描いていけなければならないのだ。

人間は神でないから、いきなり抽象概念をつくるのは無理だ;何かをヒントにクラスを見つけていく。クラスの見つけ方がオブジェクト指向設計の勘所なのだろう。オブジェクト指向プログラミングが発明されてから、もう長いのでクラスの見つけ方は体系化されつつある。クラスの見つけ方は将来的にまとめてみたいと思っている。

全てのクラスを厳密に定義できるかというとおそらく無理だ。同じクラスに属するオブジェクのメソッドは似たような振る舞いをするといっても、似たようなとはどこまでが許されるのかを厳密に定義できないからだと思う。

クラスを定義するには自然言語を一部使わざるをえない。したがって、正しいオブジェクト指向にはどうしてもドキュメンテーションは必要となる。

クラスを定義することとは、そのクラスに属しているオブジェクトの振る舞いに期待してよいことを規定することだ。オブジェクト指向設計に内部仕様なんてない。どこまでも外部仕様しかない。オブジェクト指向の世界は自己相似的な世界だ。

*1:無名クラスというものもあるが、これは名前を付ける必要がない場面でしか使えない。