Rubyで学ぶオブジェクト指向
モダンな設計・実装に欠かせない重要要素で企業の新人研修にも出てくるし、その反面知らない人にはピンとこなくてけっこう難しかったり、クラス・メソッド構成のレベルでいうと唯一の正解がなかったり別に多少沿ってなくてもシステムは動いたりでなかなか厄介な、オブジェクト指向の考え方。
Object OrientedでOO、プログラミング技術についてはObject Oriented ProgrammingでOOPと呼んだりもします。
オブジェクト指向の有名本というとサンプルコードは大抵は静的型付け言語、Javaだったりするのですが、RubyでOOが学べる良書です。
作者のSandyさんは大学でコードを書いたりアプリケーションを作ったりしているそうですが、序盤から文章も親しみやすく、訳もそんなに不自然ではないので割とそんなり読めます。網羅本というよりは読み物系です。
- 設計は芸術で、コード構成の芸術だと述べているあたり美しい。
- サンプルコードは当然Rubyですが、自転車を作ったり売ったりしようという話で出てくるクラスは最初はBicycleとかGearとかWheelとかそういうのです。大して難しくないので言語としてRubyを知らない人でも読んでいけると思います。
(後半は、クラスの数が増えてシーケンスが複雑になったりしてきます) - インターフェースの意識の話が。JavaやC#だと親のインターフェースのメソッドをインプリメントしてないとその時点でエラーが出るので感覚的にも何となく分かるのですが、RubyだとそれがないのでOOをこれから学ぶ人は苦しんだりするのかなーと思います。
- オブジェクトよりオブジェクト間のメッセージが重要なという説明はなるほどと思いました。
- 欠かせない継承やコンポジションの話。継承を深くするな、継承よりはコンポジションの方が良いという話もなるほどと思いました。
- 依存関係の方向は、自身より変更されないものに依存されなさい、も深い。
- 子クラスでinitializeをオーバーライドしてsuperしながら再実装ではなく、親に空のpost_initializeを置いてそっちをオーバーライドするという話は、こういう手もあったか!とけっこう驚き。
- Ruby特有の機能としてはmix-inの話。
- テストの話も色々。こういうクラス実装時にテストクラスも一緒に作ってテストしやすくしたりスタブを工夫したりする考え方・文化・仕組みが言語やフレームワークに最初からあるのは良いなあと思います。
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者:Sandi Metz
- 発売日: 2016/09/02
- メディア: 大型本
詳しくは本編を読もうという感じですが、紙の本はそれほど分厚くなく、挫折せずに読めます。オブジェクト指向について得るところは大きいので若手の人にもオススメです。勉強会の題材なんかにも向いてそうですね。
腑に落ちなかったところ
途中、静的型付け言語と動的型付け言語の比較の話で静的言語はコンパイル時の型検査のメリットがあるけど時間がかかるしさしてメリットとはいえない。他にもいくつか理由があり、結局のところ動的型付け言語がベストなんだ、Rubyサイコー、ウェーイ!(注:意訳ですよ) 的な話になっているところがあり、そこだけは「んん?」と引っ掛かる感じでした。(笑)
職業エンジニアからしたら静的言語も動的言語もどっちもどっちだし、必要になったらその言語で作るだけですからね。
ネット上の感想などを見ると皆さん同じようなことを感じたようで、なるほどとちょっと安心しました。まあ作者さんは現役RubyエンジニアでRubyが好きな人でそんな人がRubyを題材にした本を書くんだから、そりゃその言語を褒めますよね。まあ極端な原理主義で侵略するのはイカんよねということで。
確かにコンパイルやビルドの時間がばかにならないというのはあります。Javaでも機能や画面数が多いエンタープライズなアプリになると画面やらソースやらjarやら一式まとめてフルビルドするとけっこうな時間になったりします。
僕も初めてPHPでWebアプリケーションを作った折、ちょいと直した後の確認に掛かる時間がブラウザのリロードだけだった時には「うぉぉスクリプト系言語SUGEEE!!」とちょっと感動しました。
OOPやデザインパターン回りの本
時々ネットの記事になったりしますが、メジャー言語に対応し2017年現在で比較的入手しやすいもの、新しい本を中心にまとめてみました。OOあるいはOO的に書けるメジャー言語ではPerl/JavaScript/Swiftあたりは除いています。
●総合
初版は2004年でしたが2011年に第2版が出ました。初版もいい本でした。
- 作者:平澤 章
- 発売日: 2011/04/07
- メディア: 単行本
今度読んでみようと思っている本です。
現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法
- 作者:増田 亨
- 発売日: 2017/07/05
- メディア: 単行本(ソフトカバー)
●原典/C++
とても有名なデザパタのバイブル本、GoF本。分厚いので勇気がいります。言語もC++でハードル高し。
●Java
Javaの実際のコードサンプルがあるので、こちらの方が分かりやすいとよく言われます。やはり分厚い本。
- 作者:結城 浩
- 発売日: 2004/06/19
- メディア: 大型本
この本も軽そうな表紙のイメージに反して分かりやすいそうですね。しかしなぜか本屋でほとんど見たことがないなあ。
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者:Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates
- 発売日: 2005/12/02
- メディア: 大型本
オブジェクト指向分析版もあります。
Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
- 作者:Brett McLaughlin,Gary Pollice
- 発売日: 2007/12/04
- メディア: 単行本
パターン名をよく忘れるので僕もJavaのデザパタ一覧ハンドブック的な本を手元に置いていましたが、今はぐぐる方が早いですね。
●Ruby
最近Rubyでも比較的初心者向けの本が出ていました。
Rubyの上級者になるとこのへんのほうが効いてくるのでしょうか。
- 作者:Jay Fields,Shane Harvie,Martin Fowler,Kent Beck
- 発売日: 2010/02/27
- メディア: 大型本
- 作者:Paolo Perrotta
- 発売日: 2015/10/10
- メディア: 大型本
●PHP
PHPでOOP/デザインパターンを扱った本は絶版が1冊きりであまり見かけませんね。ちょっと悲しい。
●C
C#に限ると以下は2011年の本なので最近の本はあまりなさそうです。
C#プログラミング入門―「オブジェクト指向」の「プログラミング手法」を基礎から解説 (I・O BOOKS)
- 作者:秀行, 出井
- 発売日: 2011/05/12
- メディア: 単行本
と思いきや、比較的上級者向けですがMS公式解説書の本書に、デザインパターン周りもがっつり載っています。この本も面白そう。
- 作者:Gary McLean Hall
- 発売日: 2015/06/04
- メディア: 単行本
●Python
Pythonではプログラム初心者向けの本書にもOOPの解説多し。
- 作者:辻 真吾
- 発売日: 2010/04/24
- メディア: 大型本
個人的には勉強中のみんPy4版にもOOPの記述あり。
- 作者:柴田 淳
- 発売日: 2016/12/22
- メディア: 単行本
上級レベル向けですが、こちらもGoFデザインパターンのPython実装例が豊富とのこと。
- 作者:Mark Summerfield
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
Effective Pythonの上級テクニック群もがっつりOOPと関連。
Effective Python ―Pythonプログラムを改良する59項目
- 作者:Brett Slatkin
- 発売日: 2016/01/23
- メディア: 大型本