OOPを勉強するならJavaを使ってみるのが一番
id:tazantはオブジェクト指向を勉強するためにC++のオブジェクト指向なソースを読むという方法をとりたいみたいだけど、僕はJavaで実際にオブジェクト指向なライブラリを使ってプログラミングをしたほうが絶対にいいと思う。たとえJavaなんて知らなくても、だ。
プログラミングを勉強する3つの方法
プログラミングを勉強する方法は、3つにわけられる。
- プログラムを読む。
- プログラムを書く。
- プログラムを使う。
どれも等しくミッション・・・じゃなくてどれも大事だと思うけど、それぞれが一長一短であるし、目的にあわせて選ばないといけないと思う。
id:tazantがやりたがっていたのは、「オブジェクト指向とデザインパターン」を「自分で構成できるように」なりたいと言っていた。
デザインパターンというのは、今まで培われてきたオブジェクト指向のノウハウである。つまり、他の人が昔からやってきた経験を学ぶということだ。だから、自分でがむしゃらにプログラムを書いてても簡単には身につかないと思う。
そして、id:tazantは、それを自分のものにしたいと言っていた。そのためには、読むというだけでは絶対に身につかないと僕は思う。(もしかしたらid:tazantにはできるのかもしれない)
だから、オブジェクト指向的なプログラムの書き方を自分のものにするためには、オブジェクト指向の考え方に基づいて作られたライブラリを使って自分でプログラムを書くのが一番だと思う。
オブジェクト指向性の高い言語とライブラリ
そして、そういうデザインパターン的な構造を色濃く持ったライブラリというのは、実はそんなに多くない。
スクリプト言語であれば、型が厳密でないし、プロトタイプ型オブジェクト指向やクロージャといった特有の機能で、また別の構造をもっている。
C++にも、オブジェクト指向を厳密に求めるライブラリもあるが、多くはC言語の上乗せであり、高度にオブジェクト指向化されているライブラリは多くないと思う。(QtとXercesを紹介しておいたが。)また、オブジェクト指向を使わないほうが気軽に組めるという言語の性質が、さらにオブジェクト指向化を妨げてると思う。
そこで、やはりJavaやC#などの、オブジェクト指向をベースに設計された言語を使うべきである。
C#はなんだか迷走してるようだし、あまり用途がないので置いておくとして、Javaは最小限でオブジェクト指向を実装したシンプルで力強い言語である。
Javaの機能は、基本的にオブジェクト指向の考え方がそのままである。例を示そう。
- Javaはグローバル空間に変数や関数を置けない。
- Javaの型はvoidを含む9つの基本型と配列、それに参照オブジェクトだけで構成されている。
- Javaのクラスは単一継承であり、Objectを根とした継承木がつくられる。
- Javaのクラスはクラス(static)メソッド、クラス(static)変数、メンバメソッド、メンバ変数のみをもつ。これらはprivate,protected,(default),publicというアクセス修飾子を付けて管理できる。
- Javaは階層構造を持たない名前空間(パッケージ)によって分けられている。
- Javaの型は内部で厳密に管理されており、オブジェクトが親以外の型にキャストされることは絶対にない。
- Javaはメモリ管理を全てVMに任せる。
メモリ機能、クロージャ、ポインタ、プロパティーなどは、全てオブジェクト指向の上で実装される。(省略記法はあっても、内部的にはシンプルなオブジェクト指向である。)
Javaに、オブジェクト指向以外の機能はついていない。極めてシンプルで、厳密に考えられている。
また、JavaはBattery Includedである。普段使う機能の殆どが、オブジェクト指向的な考えに基づいてとても上手に設計されたライブラリとして、Javaに同梱されている。
Javaという言語と、Javaというライブラリ群が、どれだけオブジェクト指向にマッチしているかは、Wikipediaのデザインパターンの説明をひとつづつ読んでいってもわかる。