*オブジェクト指向プログラミング [#a1403f64]
#contents

**オブジェクト指向とオブジェクト指向プログラミング [#cf427b76]
''Object Oriented and Object Oriented Programing''~
最近はオブジェクト指向プログラミングと言うプログラミング設計が流行っています。以下OOP


OOとはモノを重視した考え方。~
OOPとはそれをプログラミングに適用した設計です。

OO自体は多少の個人差はあっても覚えるのは難しくありません。~
しかしOOPは洗練されたセンスも必要なので一朝一夕で習得出来ません。~
オブジェクト指向は今や、プログラミング言語だけでなく、ソフトウェア開発の全てにおける総合技術となっています。~
でもベテランしか扱えない、と言う訳でも無いのでちゃっちゃと覚えちゃいましょう。~
よく、オブジェクト指向の説明の際に現実世界を全てオブジェクト指向で説明できる、という説明を見かけますが、これは全くの間違いなので注意しましょう。~
wikiなので興味のある方はどんどん訂正・追加をしちゃってください。~

***今までのプログラミングと何が違うのか [#ma518828]

従来のCで見られるような非OOPでの主役は関数です。実装の最前線に立つのも関数でしたし、設計の最前線に立つのも関数でした。
何かしら作りたいと思い立ったとき、まず意識すべきなのはどういう機能を実装すべきかであり、プログラミングの実装力というのはその機能をいかにして関数のコードに落とし込むかということでした。

ところで、プログラミング言語の進歩というのは抽象化の進歩を大きく孕んでいます。
コンピューターが使われ始めた当時、Perl, PHP, Pythonなどのインタプリタ言語はもちろん、Cなどの言語もありませんでした。
プログラマーはコンピューターと機械語で、''もっとも具体的な形で''対話していたのです。
しかし、それではあんまりだということで、機械語命令にmov, jmpなどのアルファベットを割り当てたのがアセンブリ言語です。これが最初の抽象化とも言えましょう。0と1のもっとも具体的な世界から意味的に理解できるように抽象化された状態で対話するようになったのです。~
もう一つの抽象化として、変数があります。これのおかげで、プログラマーはメモリに置かれたデータをより便利に、簡単に扱えるようになりました。「メモリのn番地におかれたデータ」をhogeとかfugaとかいう人間が理解しやすい名前で扱えるようになりましたね。~
さらに時は進み、次に持ち込まれたのが関数というものです。
たとえば、今まで三角形の面積を求めるためには「入力された底辺、高さという二つのデータを掛け合わせ、2で割る」という手続きが必要でした。関数を使えば、これをtriangleとかいう名前の関数にして扱えます。
関数プログラミングの効能には処理を共通化でき、ソースコードの見通しがよくなるということもありますが、ソースコードを(変数のそれと同じように)より人間に理解しやすくできるということもありますね。

さて、長くなりましたが、オブジェクト指向プログラミングとはこの抽象化物語の続きにあるものです。
関数プログラミングでは設計の主役は関数でした。オブジェクト指向プログラミングでの主役は名前の通り、オブジェクトです。
関数が抽象化してきたものはtriangleだったら「『入力された底辺、高さという二つのデータを掛け合わせ、2で割る』という手続き」でしたが、オブジェクトが抽象化するものはアプリケーション上における''役割''です。~
アプリケーションの例として2ちゃんねるのような掲示板を考えてみましょう。従来の関数プログラミングでは、スレッドを立てるor編集するor削除する関数、レスを書き込むor編集するor削除する関数、スレ一覧ページを表示する関数、1スレのページを表示する関数など、機能を中心に考えます(大事なのは、これも正しい方法であるということです)。~
オブジェクト指向では、「アプリケーションにどういう役割をしてくれるオブジェクトがあればいいか」を考えます。
この場合ではスレッドを扱う役割のオブジェクトとレスを扱う役割のオブジェクトとページ表示の役割のオブジェクトがあればいいですね(実際にはもちろんもっとたくさんになるでしょう)。

人間の脳には限界があります。設計に登場してくるヤツらは「数が少なくて、しかも人間が理解しやすい形であること」を満たしていたほうがいいですね。それを実現する新しい手段がオブジェクト指向です。
オブジェクト指向で検索すると、抽象クラスを作って共通化!とかカプセル化で変数を触らせない!などの触れ込みがありますが、僕はオブジェクト指向が真価を発揮してくれるのは設計だと思います。抽象化とか、カプセル化というのはそれを助けるためのものに過ぎないのです。

より人間が楽をするための技術なので、肩の力を張らずに気楽に使っていきましょう。

**原則・法則 [#hb9b4b97]
これを抜きにしてOOは語れません。~
OOPの悪い設計はこれに反している
可能性が大なので知っておいた方が良いでしょう。~

-[[単一責任の原則>./単一責任の原則]]
-[[開放閉鎖原則>./開放閉鎖原則]]
-[[リスコフの置換原則>./リスコフの置換原則]]
-[[依存関係逆転の原則>./依存関係逆転の原則]]
-[[インターフェイス分離の原則>./インターフェイス分離の原則]]
-[[再利用・リリース等価の原則>./再利用・リリース等価の原則]]
-[[閉鎖性共通の原則>./閉鎖性共通の原則]]
-[[全再利用の原則>./全再利用の原則]]
-[[非循環依存関係の原則>./非循環依存関係の原則]]
-[[安定依存の原則>./安定依存の原則]]
-[[安定度・抽象度等価の原則>./安定度・抽象度等価の原則]]
-[[デメテルの法則>./デメテルの法則]]


**パターン [#i772cfb9]

***デザインパターン [#i0e98419]
GOF(Gang of Four)と言う偉い人達が纏めたOOPの良い設計です。~
実装レベルに近いので覚え易いのですが、
その反面適切な使い方が分からず濫用してしまいがちなので注意しましょう。~

詳しくは''[[デザインパターン]]''にて会いましょうノシ

**参考リンク [#ned0e46e]
:[[オブジェクト指向関係資料集:http://www2.ocn.ne.jp/~yamagu/object/]]|
『アジャイルソフトウェア開発の奥義(ISBN-13: 978-4797323368)』の著者:Robert C. Martin氏による「Open closed principle」の和訳。[[OCP>./開放閉鎖原則]]、[[LSP>./リスコフの置換原則]]、[[DIP>./依存関係逆転の原則]]の各PDF Document.

:[[オージス総研 - オブジェクトの広場:http://www.ogis-ri.co.jp/otc/hiroba/index.html]]|
技術講座、OO入門 、技術書籍紹介 、メーリングリスト、ほか オブジェクト指向に関するドキュメントなど。

:[[オブジェクト倶楽部:http://www.objectclub.jp/]]|
オブジェクト指向を中心とする技術について実践、研究、発表するグループ

:[[オブジェクト指向の概念の発明者は誰ですか? - sumim’s smalltalking-tos:http://d.hatena.ne.jp/sumim/20040525/p1]]|
オブジェクト指向の“モヤッと”の正体を知りたくなったら

--[[オブジェクト指向プログラミング:http://sumim.no-ip.com:8080/wiki/488]] - 『[[Wiki っぽい場(あるいは 疑似脳内ネットワーク):http://sumim.no-ip.com:8080/wiki]]』内コンテンツ
---[[メッセージ指向:http://sumim.no-ip.com:8080/wiki/519]]
---[[クラス指向:http://sumim.no-ip.com:8080/wiki/564]]
---[[クラスベース・オブジェクト指向:http://sumim.no-ip.com:8080/wiki/482]]
---[[プロトタイプベース・オブジェクト指向:http://sumim.no-ip.com:8080/wiki/493]]
//『オブジェクト指向の概念の発明者は誰ですか?』と関連が深そうだから移動したよ
---[[ある OOPL な会話:http://sumim.no-ip.com:8080/wiki/748]]
// どうせなら↑のページも入れておこうよw
---[[オブジェクト:http://sumim.no-ip.com:8080/wiki/279]]
---[[インスタンス:http://sumim.no-ip.com:8080/wiki/481]]
---[[クラス:http://sumim.no-ip.com:8080/wiki/569]]

:[[疑りぶかいあなたのためのオブジェクト指向再入門:http://kmaebashi.com/programmer/object/index.html]]|
オブジェクト指向を勉強しようとして挫折した人向けの文書。C言語の基本を知っている人向け。~
オブジェクト指向議論が目的ではなく、どの順番で説明すれば初心者に解りやすいだろうか、について書かれていることに注意。

:[[OOPが理解できません:http://hccweb1.bai.ne.jp/tsune-1/oop.html]]|
このようなエラーが発生したら、上司に至急連絡を取り、障害を取り除かないといけません。

:[[動画リンク集 - OOP>動画リンク集#k9ebb35f]]|
解説動画へのリンク

:[[On Lisp --- オブジェクト指向Lisp:http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/objectOrientedLisp.html]]|
:[[On Lisp --- オブジェクト指向Lisp:http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/objectOrientedLisp.html]]((参考:[[CLOS:http://sumim.no-ip.com:8080/wiki/607]] - Wiki っぽい場(あるいは 疑似脳内ネットワーク) ))|
>
 ~ 「Lispは拡張可能な言語で,その内部でオブジェクト指向プログラミングが容易に行える」
 と言う方が真実に近いだろう.  ~
>
 CLOSは規格として定義済みなので,Lispがオブジェクト指向言語だと宣伝するのは嘘ではない.
 しかしそれではLispを単なるオブジェクト指向言語だと見るという制限を設けてしまっている.
 確かにLispはオブジェクト指向言語だが,それはオブジェクト指向モデルを採用しているからではない.
 むしろLispの底を流れる抽象化技法の適用例にオブジェクト指向モデルが加わったに過ぎない ~
((参考:[[CLOS:http://sumim.no-ip.com:8080/wiki/607]] - Wiki っぽい場(あるいは 疑似脳内ネットワーク) ))

***初心者向け [#d2fc9c64]
-[[OOP用語ひとめぐり - みねこあ:http://d.hatena.ne.jp/minekoa/20090503/1241359991]]
-[[オブジェクト指向プログラミングの学習法(初心者向け) - カレーなる辛口Javaな転職日記:http://d.hatena.ne.jp/JavaBlack/20070825/p1]]
//↑sumim氏の記事に八つ当たり?してる人がいたから入れてみた
//↑あれは八つ当たりじゃなくて煽りだったような。気にし過ぎかもよ // エントリ自体は有用だから結果オーライか。

**参考文献 [#j13e2b89]

:アジャイルソフトウェア開発の奥義|
ISBN-13:978-4797323368

:Code Complete 第2版 上、下|
ISBN:4-89100-455-X,ISBN:4-89100-456-8~
OOPの専門書、ではないし、これ一冊でOOPの学習が完結する訳ではありませんが、OOPに対して WHY? って思っている人なら読んでみるといいと思います。~
([[オヌヌメサイト>オヌヌメサイト#hc96ac23]] でも紹介されていますが)@ITの[[BOOK Preview:http://www.atmarkit.co.jp/fdotnet/bookpreview/codecomp2nd_index/codecomp2nd.html]] も読んでみて下さい。

***参考リンク [#k0d22062]

-[[Java&オブジェクト指向参考書リスト(2007年版) - カレーなる辛口Javaな転職日記:http://d.hatena.ne.jp/JavaBlack/20070522/p1]]
--[[自己流オブジェクト指向&Java参考書 『非』お勧め版 - カレーなる辛口Javaな転職日記:http://d.hatena.ne.jp/JavaBlack/20080401/p1]]
--[[「嫌われるオブジェクト指向」のパターン - カレーなる辛口Javaな転職日記:http://d.hatena.ne.jp/JavaBlack/20070805/p2]]
--[[お勧め本? - カレーなる辛口Javaな転職日記:http://d.hatena.ne.jp/JavaBlack/20080727/p1]]
-[[オブジェクト指向でなぜ作るのか を買ってみました - みねこあ:http://d.hatena.ne.jp/minekoa/20080803/1217795027]] - コメント欄も併せて
--[[限りなき旅は続く - みねこあ:http://d.hatena.ne.jp/minekoa/20080803/1217795028]] - この本が正しく見える理由
-[[憂鬱本を買ってみました - みねこあ:http://d.hatena.ne.jp/minekoa/20080503/1209799681]]
-[[駄目なOO本の見分け方? - みねこあ:http://d.hatena.ne.jp/minekoa/20080803/1217795029]]