PHPをはじめて半年が経とうとしています。しかしいまだにオブジェクト指向やらを理解できません。
そこで質問です。
どうやったら簡単にオブジェクト指向を理解することができますか?分かりやすく簡潔にお願いします。
又、なぜオブジェクト指向はいいのでしょうか?ただ、簡単に別のパーツを扱えるという利点しかないのでしょうか?
よろしくお願いいします。
Javaの入門書あたりを開くと詳しく載っていたりするんですが(^^;
オブジェクトなどの概念的な物ではなく、手っ取り早く効能を知りたいと言うことであれば「カプセル化」「継承」「ポリモーフィズム」あたりから調べられてはいかがでしょう。
カプセル化はコードの独立性を高める効能があります。
・カプセル化と隠蔽
http://www.nextindex.net/java/capsulate.html
継承は同じコードをちょっと改良して再利用したいといった際に活用できます。
・クラスの継承
http://www.nextindex.net/java/inherit.html
・ewords
http://e-words.jp/w/E7B699E689BF.html
ポリモーフィズムは直訳すると「多様性」のことです。
オブジェクトを生成する際に状況によって何パターンもの生成方法に対応できます。
・Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%...
仕事ではなく個人レベルでの小規模なプログラミングであれば、無理に使う必要はありませんが、コードが大きくなってくると重宝するシーンが多いです。
!簡潔な説明を行うために、以下の文章は多くの語弊/誤りを含みます!
オブジェクト指向というのは、簡単に言うと関数がすべて箱の中に入れられて整理されている状態で提供されていることを言います。
つまり、例えばC言語などではstrlen()やstrcpy()のような名前の関数を用いますが、オブジェクト指向のC#などの言語では
String.LengthやString.copy()などという名前の関数が用いられます。
これらは、Stringという名前の箱(オブジェクト)に含まれている変数や、関数を指します。
オブジェクト指向にはいろいろな利点があると私は思いますが、
一番即物的な部分では、「関数名の重複が起こりにくい」ことだと思います。
reset()とか、exit()とか、"よくある"名前を関数につけてしまうと、既に提供されている関数の名前と被ってしまってエラーを吐く場合が多いです。
オブジェクト指向では、始めから箱の中に整理されているわけですから、
そういった意味で名称が重複する可能性は格段に少なくなるといえます。
?C言語ではなくてPHPの例でお願いします。
オブジェクト指向の本を読むと、オブジェクト指向が思考の道具でみんながクラス定義をやって継承して…というようなことをしないといけないかのように思ってしまいますが、実際にはそういう作業を個人でする必要はあんまりありません。
どちらかというと「誰かが用意してくれた機能(クラスライブラリ)を使うためにたまたまオブジェクト指向の知識が必要」ぐらいのケースが大半です。実はそれはオブジェクト指向の特徴のひとつである「カプセル化(情報の隠蔽機能)」などを活かしているのですが。
例えば、PHPでもクラスライブラリはいろいろ用意されていますね。ちょっとググっていて面白いのを見つけたんですが
http://plaza.rakuten.co.jp/pgmemo/diary/200511290000/
PDFを生成するためのクラスライブラリ。ここのblogで紹介されているサンプルプログラムのうち
$pdf = new MBFPDF();
でMBFPDFクラスのオブジェクトを生成、その後の
$pdf->AddMBFont(GOTHIC ,'SJIS');
$pdf->AddMBFont(PGOTHIC,'SJIS');
...
などでそのオブジェクトの中のメソッドを呼び出しています。
なので最初は「こういう書き方をするものだ」と割り切って使うだけに徹する方がよいと思います。
そのうちにメリットに気が付いて(例えば上記の場合、PDFを生成するオブジェクトをたくさん並べたい場合は
$pdf2 = new MBFPDF();
$pdf3 = new MBFPDF();
$pdf4 = new MBFPDF();
...のようにどんどん宣言するだけで、pdf,pdf2,pdf3,pdf4…のお互いの内部の状態などを一切考えずに使うことができます)中身はいったいどうなってるんだろう、と思ったときにソースを眺めるなどして理解していく、というのがわかりやすいでしょう。
あと、PHPよりもRubyのほうがオブジェクト指向理解するにははるかによいと思いますが、これは好みですからなんとも。
なるほど
http://piro.sakura.ne.jp/latest/flakes/033oo_javascript.html
http://squeak.hp.infoseek.co.jp/
PHPはPHP5でもまだまだオブジェクト指向言語としては甘い上、これからも言語仕様が大きく変わる可能性があるのであまりオススメできません。
そこで、最近脚光を浴びてきたJavaScriptはどうでしょうか。JavaScriptは「すべてがオブジェクト」という一風変わったスタイルを持つ言語ですが、それゆえにオブジェクト指向を理解するにはうってつけといえます。
視覚的にオブジェクト指向を理解したいのであれば、Squeakも馬鹿にできません。割とお手軽にオブジェクト指向的なプログラム(?)を作って遊べます。
オブジェクト指向を理解する方法は、
やはりオブジェクト指向の良さを体感することが近道でしょう。
まずはPEAEなどのライブラリを使う事で、
中身がどのようになっているか分からなくても、
ここまで高機能なことができるのかと感動します。
それとともにオブジェクト指向プログラミングの基礎的なことも
覚えられるでしょう。
一通り有名なライブラリを試した後は、
何かしらのアプリケーションフレームワークを
使ってみてはいかがでしょうか?
Mojavi、Ethna、Maple、symfonyなど色々ありますが、
これらを使って開発を行う事で、
より理解が深まると思います。
まぁ理論より先に実践から入ってみるという提案です。
ぐぐるぐらい私でもできます