オブジェクト指向プログラミングの学習法(初心者向け)
個人的な話をしますと、オブジェクト指向の入門書に出てくる、「クルマのたとえ話」とかは本当に意味わかりませんでした。こちとら、すっかり手続き脳なもので、そんなんでmainとかどうやって書くのよ?みたいな。<我ながらヒドイ
http://d.hatena.ne.jp/LazyCoder/20070806/1186417299
追記
PHPのオブジェクト指向を勉強してる。というか仕事での必要性を感じてやってるけど、正直オブジェクト指向の良さがさっぱりわからん。(中略)
http://anond.hatelabo.jp/20070427093912
よくあるオブジェクト指向の解説本には車がオブジェクトでタイヤがファンクションでみたいなんかいてるけど、実務で使うプログラムの設計の仕方がわからん。
こんな説明を読んで、なんだかわかったような気分になれる人は、どっちかというと思考力に欠ける人なんじゃないかと思います。「わけわからん」という反応のほうが技術屋としては正常でしょう。
http://kmaebashi.com/programmer/object/naze.html
いい加減、こういうわけのわからないたとえ話はやめたらどうかと。
あんなもん、わかったつもりの半可通と、理解できない挫折組を生み出すだけではないかと。
「パン屋さんの設計図がクラスで〜とか、cryってメッセージが送られると猫ならニャーニャー、犬ならワンワンって返ってくると考えると解りやすいですね」
とか言ってたけどむしろ解りづらいし…上記のような例えで理解できる人は既に開発の経験がある人じゃないの?
なんて思ったものです。現実世界は何でもオブジェクトとして考えられるとか言われてもピンとこなかったしね。
http://d.hatena.ne.jp/ysatou7250/20080501/1209652552
http://www.biwa.ne.jp/~mmura/SoftwareDevelopment/twentyfirstcentury3.html
http://d.hatena.ne.jp/JavaBlack/20070805/p2
これに関連して,改めて書くほどのことではないんだけど、初心者が学習する上で参考になるように一応まとめとく.特に初心者向け/入門レベルの話なので,ベテランには今更ほとんど参考にならないでしょう.
なんとなく書籍紹介っぽくなってしまったが,新しい技術を勉強する時に優れた書籍というものは圧倒的にコストパフォーマンスに優れるのだから仕方あるまい.*1
私の推奨する学習の順序*2は以下の通り.
- OOP言語を学ぶ.
- そのOOP言語のイディオムやコーディングテクニックを学ぶ.
- GoFのデザインパターンを学ぶ.
- OOPの設計原理を具体例(ソースコード!)を交えながら学ぶ.
- リファクタリングを学ぶ.
- 第二OOP言語を学ぶ.
- オブジェクト指向プログラミングそのものを理論的に学ぶ.
このうち1,2,3までが必修科目.4,5は推奨.6,7は選択科目.
また言語,イディオムを学び終えたあたりから,実際にプログラムを書いたり,良いソースコードを読んだりするのも大切だ.フレームワークやライブラリのコードを読んで,設計や様々なテクニックを理解する必要もあるだろう.プログラミングを座学だけで体得するのは非常に難しいのだ.*3
毎度お馴染み参考書リスト: http://d.hatena.ne.jp/JavaBlack/20070522/p1
「オブジェクト指向を教えるとき、どの言語がよいか?」
- ここ数年、オブジェクト指向を覚えるときには、Javaが使われてきました。(以下略)
- 選択肢とは、RubyとPythonのことです。両言語とも、動的型言語です。静的型言語と一緒に使えるようになってれば便利だと思います。
- 私は、まずは言語を使って、何かできるようになるほうが断然いいと思いますね。私にとってソフトウェア設計とは、数学みたいなものなんです。読んだり聞いたりするだけでは、なかなか理解が深まりません。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageForLearningObjects
1,2,3:必修科目
まず最初にOOP言語を最低でも何か一つ学ぶべきだ.OOP言語にはOOPのエッセンスが詰め込まれており,言語を学び,それを使いこなすことはそのエッセンスを理解することに繋がる.また知っている言語がないと具体例を示すことができず,「犬がワン,猫がニャー」だの「部長が起立!」だのと言った理解しにくく実用性のないたとえ話に終始してしまう.*4 *5
学ぶべき言語としては,まともなOOP言語ならどれでもいい.特に現在の仕事で使っている/使う必要のある言語があれば,それで十分だ*6.誰かに教わることができるなら,その人の意見を聞こう.多くはその人が使っているのと同じ言語を学ぶことになるだろう.特に理由がない場合は,Java,Ruby,Pythonは有力な候補になる.
言語解説書もまともなものを選ぶこと.Javaならば「プログラミング言語Java」が最有力候補だ.
プログラミング言語Java (The Java Series)
- 作者: ケン・アーノルド,ジェームズゴスリン,デビッドホームズ,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/04
- メディア: 単行本
- 購入: 38人 クリック: 1,044回
- この商品を含むブログ (71件) を見る
追記:ピアソン桐原が撤退により絶版.別会社から再出版されました.2014年現在でも最新版です.Java8も出たことだし,そろそろ5版が出てもいい頃合いなのだが.
- 作者: ケンアーノルド,デビッドホームズ,ジェームズゴスリン,Ken Arnold,David Holmes,James Gosling,柴田芳樹
- 出版社/メーカー: 東京電機大学出版局
- 発売日: 2014/05/10
- メディア: 単行本
- この商品を含むブログ (4件) を見る
Javaチュートリアル 第4版 (The Java Series)
- 作者: シャロンザクァワ,ジャコブロイヤル,アイザックラビノビッチ,マークホーバ,トーマスリーサ,スコットホンメル,Sharon Zakhour,Isaac Rabinovitch,Thomas Risser,Jacob Royal,Scott Hommel,Mark Hoeber,安藤慶一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/11
- メディア: 単行本
- 購入: 12人 クリック: 505回
- この商品を含むブログ (8件) を見る
- 作者: Dave Thomas,Chad Fowler,Andy Hunt,まつもとゆきひろ,田和勝
- 出版社/メーカー: オーム社
- 発売日: 2006/08/26
- メディア: 大型本
- 購入: 7人 クリック: 270回
- この商品を含むブログ (152件) を見る
文法などの基本だけでは,その言語の理解は不十分だ.ここは言語によって異なる.Javaだったら「Effective Java」*7,C++だったら「Effective C++」や「C++ Coding Standards」などだろうか.実はこの部分こそが,言語を学ぶ上で一番量が多い部分だと思う.*8
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2018/10/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
Effective Java (English Edition)
- 作者: Joshua Bloch
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2017/12/18
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
注:既に3版が登場している.
Effective Java 第2版 (The Java Series)
Effective Java (Java Series)
追記:ピアソン桐原撤退により絶版.別会社より再出版されました.
EFFECTIVE JAVA 第2版 (The Java Series)
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: スコット・メイヤーズ,小林健一郎
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2006/04/29
- メディア: 大型本
- 購入: 29人 クリック: 411回
- この商品を含むブログ (186件) を見る
Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)
- 作者: スコットメイヤーズ,小林健一郎
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)
- 作者: ハーブサッター,アンドレイアレキサンドレスク,浜田光之,Herb Sutter,Andrei Alexandrescu,浜田真理
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2005/10
- メディア: 単行本
- 購入: 20人 クリック: 383回
- この商品を含むブログ (100件) を見る
GoFもそういう具体的なノウハウの一つだ.ただしプログラミング経験が少ないと理解できないかもしれない.
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (202件) を見る
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/02
- メディア: 大型本
- 購入: 14人 クリック: 362回
- この商品を含むブログ (98件) を見る
4,5:推奨科目
LSP*9のような設計原理やリファクタリングのようなテクニックについても,一応は知っておく方がいい.設計原理は「C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)」にも,一部含まれている.
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/oo-principles.html
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz,?山泰基
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: 大型本
- この商品を含むブログ (6件) を見る
オブジェクト指向設計実践ガイド ?Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: Kindle版
- この商品を含むブログ (6件) を見る
追記.基本的で王道のテクニックが説明されてる.入門者が手を出してもかまわないだろう.
デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series)
- 作者: アラン・シャロウェイ,ジェームズ・R・トロット,村上雅章
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2005/09/16
- メディア: 大型本
- 購入: 51人 クリック: 615回
- この商品を含むブログ (125件) を見る
オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)
- 作者: アラン・シャロウェイ,ジェームズ・R・トロット,村上雅章
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
- 作者: ロバート・C・マーチン,Robert C. Martin,瀬谷啓介
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2008/07/01
- メディア: 単行本
- 購入: 18人 クリック: 586回
- この商品を含むブログ (64件) を見る
- 作者: ロバート・C・マーチン,瀬谷啓介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/30
- メディア: 単行本
- 購入: 3人 クリック: 236回
- この商品を含むブログ (148件) を見る
リファクタリングも重要ではあるが,ある意味で非常に地味な技術で全て丸暗記する必要はない.センスのある人ならば臨機応変に対応するだけで十分かもしれないが,センスのない人は一度一通り目を通しておこう.
リファクタリング―プログラムの体質改善テクニック (Object Technology Series)
- 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2000/05
- メディア: 単行本
- 購入: 94人 クリック: 3,091回
- この商品を含むブログ (312件) を見る
新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)
- 作者: Martin Fowler,児玉公信,友野晶夫,平澤章,梅澤真史
- 出版社/メーカー: オーム社
- 発売日: 2014/07/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
6,第二言語を学ぶ
一つの言語を学ぶだけでなく,他の言語を学ぶことはプログラミングを理解する上で重要だ.たとえ第一言語ほどには使いこなせなくても,異なる言語から得る物は多い.OOPの理解においてもこれは変わらない.
第二OOP言語を選ぶときは,似たような言語は可能な限り避けるべきだ.Java,C#,C++のように似た言語を複数学んでも時間の無駄だ.Javaのような静的型言語を学んだ人はRubyやPythonのような動的型言語を,動的型言語を学んだ人は逆に静的型言語に挑戦してみるのが良いだろう
関連
http://d.hatena.ne.jp/JavaBlack/20070726/p1
毎年1つは新しい言語を学べという『達人プログラマー』の教えが何よりの裏付けだ。この要点は、プログラミング言語はプログラミングについての考え方に影響を及ぼすもので、新しい言語を学ぶことは、問題を別のやり方で解くことを考える大きな手助けとなるだろうということだ。(この利益を得るためには大きく異なった言語を学ぶことが大事だ。JavaとC#では似すぎていて有効でない。)
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?OneLanguage
最近Ruby MLで出ている,以下の件も興味深い。
ですから、将来ありえる組み合わせは
* 1.8のまま、順序は導入しない
* Hashに順序を導入する(ただし、インスタンス変数やシンボルテーブルなどにはない)
のいずれかではないかと。気持ち的には後者に傾いています。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43930
この発想はJavaではあり得ないだろうな.RubyとJavaとでは単に言語仕様が異なるというだけでなく,ライブラリの設計思想まで異なるのだろう.
7,オブジェクト指向プログラミングそのものを学ぶ
ここで始めて「オブジェクト指向とは何ぞや?」みたな話になる.この順番を間違えると,まるで理解できずに消化不良になるのも当然だ.ただし消化不良になるのを覚悟の上でなら,もっと早い段階で読んでおいても構わない.むしろその方が好ましい側面もある.
カモノハシ本の方が初中級者向け*10.できれば原書第三版の方が良い.これも日本語訳が待ち遠しい良書の一つだな.
- 作者: ティモシイ・A.バッド,Timothy A. Budd,羽部正義
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2002/12
- メディア: 単行本
- 購入: 3人 クリック: 195回
- この商品を含むブログ (42件) を見る
もしKindleで再版されて値段が三千円以下,できれば二千円くらいになれば,古いながらも若い人にもお勧めし易い良書となるのだが...
オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)
- 作者: バートランド・メイヤー,酒匂寛
- 出版社/メーカー: 翔泳社
- 発売日: 2007/01/10
- メディア: 単行本(ソフトカバー)
- 購入: 11人 クリック: 307回
- この商品を含むブログ (132件) を見る
オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)
- 作者: バートランド・メイヤー,酒匂寛
- 出版社/メーカー: 翔泳社
- 発売日: 2008/08/29
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 97回
- この商品を含むブログ (53件) を見る
*1:念のため言っておくが,執筆も翻訳もアフィリエイトもほとんど儲からない.せいぜいバイト代程度だ.それでもROIという視点ではアフィリエイトが一番効率的かもしれない.
*2:要するにカリキュラムみたいなもんかな.
*3:そういう意味では水泳のようなもの.座学だけの「畳水練」は間違った学習法なのです.
とはいえOJTオンリーで座学無しという人は,さらに困りものなのだが.
*4:物理や数学の専門書で数式を使わないものがないのと同じ.ソースコードを読めない人は,プログラムの話ができないのだ.
*5:一口に「オブジェクト指向プログラミング」と言っても,細部においてはそれぞれ微妙に異なる漠然としたものなのだ.「JavaにおけるOOP」と「RubyにおけるOOP」と「C++におけるOOP」が全部違っていたりする.もちろん違いはそれほど大きな物ではないのだが初心者を混乱させるには十分すぎるだろう.複数の言語を全部まとめて「OOPとは何か」と始めるよりは,ただ一つの言語に軸足を置いて「その言語におけるOOPはどんなものか」を学習する方が初心者には理解しやすいと思う.一般論については,その後で学べば良い.
*6:VBはまともなOOP言語じゃないし,変な癖が付くので止めた方がいい.C++は初心者が使うには複雑すぎるけど,今使う必要があるのなら許容範囲だ.
*7:Effective Javaは原書第二版(ISBN:0321356683)が予定されている.洋書が予定通りでも今年中,和書が出るのは早くても来年半ばくらいだろう.
*8:http://d.hatena.ne.jp/JavaBlack/20150201
*9:"Liskov Substitution Principle".「リスコフの置換原則」などと呼ばれる.
http://en.wikipedia.org/wiki/Liskov_substitution_principle
*10:実はアフィリエイトを設定して以降,このサイトを通じて地味に売れ続けているヒット商品.「オブジェクト指向とは何ぞや」で悩んでいる人がいかに多いかということの現れかもね.