Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方

Rubyで学ぶオブジェクト指向

 モダンな設計・実装に欠かせない重要要素で企業の新人研修にも出てくるし、その反面知らない人にはピンとこなくてけっこう難しかったり、クラス・メソッド構成のレベルでいうと唯一の正解がなかったり別に多少沿ってなくてもシステムは動いたりでなかなか厄介な、オブジェクト指向の考え方。
Object OrientedでOO、プログラミング技術についてはObject Oriented ProgrammingでOOPと呼んだりもします。
 オブジェクト指向の有名本というとサンプルコードは大抵は静的型付け言語、Javaだったりするのですが、RubyでOOが学べる良書です。

 作者のSandyさんは大学でコードを書いたりアプリケーションを作ったりしているそうですが、序盤から文章も親しみやすく、訳もそんなに不自然ではないので割とそんなり読めます。網羅本というよりは読み物系です。

  • 設計は芸術で、コード構成の芸術だと述べているあたり美しい。
  • サンプルコードは当然Rubyですが、自転車を作ったり売ったりしようという話で出てくるクラスは最初はBicycleとかGearとかWheelとかそういうのです。大して難しくないので言語としてRubyを知らない人でも読んでいけると思います。
    (後半は、クラスの数が増えてシーケンスが複雑になったりしてきます)
  • インターフェースの意識の話が。JavaC#だと親のインターフェースのメソッドをインプリメントしてないとその時点でエラーが出るので感覚的にも何となく分かるのですが、RubyだとそれがないのでOOをこれから学ぶ人は苦しんだりするのかなーと思います。
  • オブジェクトよりオブジェクト間のメッセージが重要なという説明はなるほどと思いました。
  • 欠かせない継承やコンポジションの話。継承を深くするな、継承よりはコンポジションの方が良いという話もなるほどと思いました。
  • 依存関係の方向は、自身より変更されないものに依存されなさい、も深い。
  • 子クラスでinitializeをオーバーライドしてsuperしながら再実装ではなく、親に空のpost_initializeを置いてそっちをオーバーライドするという話は、こういう手もあったか!とけっこう驚き。
  • Ruby特有の機能としてはmix-inの話。
  • テストの話も色々。こういうクラス実装時にテストクラスも一緒に作ってテストしやすくしたりスタブを工夫したりする考え方・文化・仕組みが言語やフレームワークに最初からあるのは良いなあと思います。

 詳しくは本編を読もうという感じですが、紙の本はそれほど分厚くなく、挫折せずに読めます。オブジェクト指向について得るところは大きいので若手の人にもオススメです。勉強会の題材なんかにも向いてそうですね。

腑に落ちなかったところ

 途中、静的型付け言語と動的型付け言語の比較の話で静的言語はコンパイル時の型検査のメリットがあるけど時間がかかるしさしてメリットとはいえない。他にもいくつか理由があり、結局のところ動的型付け言語がベストなんだ、Rubyサイコー、ウェーイ!(注:意訳ですよ) 的な話になっているところがあり、そこだけは「んん?」と引っ掛かる感じでした。(笑)
職業エンジニアからしたら静的言語も動的言語もどっちもどっちだし、必要になったらその言語で作るだけですからね。
 ネット上の感想などを見ると皆さん同じようなことを感じたようで、なるほどとちょっと安心しました。まあ作者さんは現役RubyエンジニアでRubyが好きな人でそんな人がRubyを題材にした本を書くんだから、そりゃその言語を褒めますよね。まあ極端な原理主義で侵略するのはイカんよねということで。

 確かにコンパイルやビルドの時間がばかにならないというのはあります。Javaでも機能や画面数が多いエンタープライズなアプリになると画面やらソースやらjarやら一式まとめてフルビルドするとけっこうな時間になったりします。
 僕も初めてPHPでWebアプリケーションを作った折、ちょいと直した後の確認に掛かる時間がブラウザのリロードだけだった時には「うぉぉスクリプト系言語SUGEEE!!」とちょっと感動しました。

OOPデザインパターン回りの本

 時々ネットの記事になったりしますが、メジャー言語に対応し2017年現在で比較的入手しやすいもの、新しい本を中心にまとめてみました。OOあるいはOO的に書けるメジャー言語ではPerl/JavaScript/Swiftあたりは除いています。

●総合

 初版は2004年でしたが2011年に第2版が出ました。初版もいい本でした。

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

  • 作者:平澤 章
  • 発売日: 2011/04/07
  • メディア: 単行本

 今度読んでみようと思っている本です。

●原典/C++

 とても有名なデザパタのバイブル本、GoF本。分厚いので勇気がいります。言語もC++でハードル高し。

Java

 Javaの実際のコードサンプルがあるので、こちらの方が分かりやすいとよく言われます。やはり分厚い本。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

  • 作者:結城 浩
  • 発売日: 2004/06/19
  • メディア: 大型本

 この本も軽そうな表紙のイメージに反して分かりやすいそうですね。しかしなぜか本屋でほとんど見たことがないなあ。

 オブジェクト指向分析版もあります。

パターン名をよく忘れるので僕もJavaデザパタ一覧ハンドブック的な本を手元に置いていましたが、今はぐぐる方が早いですね。

Ruby

 最近Rubyでも比較的初心者向けの本が出ていました。

Rubyの上級者になるとこのへんのほうが効いてくるのでしょうか。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

PHP

PHPOOP/デザインパターンを扱った本は絶版が1冊きりであまり見かけませんね。ちょっと悲しい。

●C

C#に限ると以下は2011年の本なので最近の本はあまりなさそうです。

と思いきや、比較的上級者向けですがMS公式解説書の本書に、デザインパターン周りもがっつり載っています。この本も面白そう。

C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)

Python

Pythonではプログラム初心者向けの本書にもOOPの解説多し。

Pythonスタートブック

Pythonスタートブック

  • 作者:辻 真吾
  • 発売日: 2010/04/24
  • メディア: 大型本

個人的には勉強中のみんPy4版にもOOPの記述あり。

みんなのPython 第4版

みんなのPython 第4版

  • 作者:柴田 淳
  • 発売日: 2016/12/22
  • メディア: 単行本

上級レベル向けですが、こちらもGoFデザインパターンPython実装例が豊富とのこと。

実践 Python 3

実践 Python 3

  • 作者:Mark Summerfield
  • 発売日: 2015/12/01
  • メディア: 単行本(ソフトカバー)

Effective Pythonの上級テクニック群もがっつりOOPと関連。