第30回 西日暮里.rb オブジェクト指向設計実践ガイド読書会 に参加してきました

読書会第一回から2週間が経過して、読書会第二回が開催されたので参加してきました。

nishinipporirb.doorkeeper.jp

内容

今回は第三章、第四章が対象でした。第三章は依存関係の管理について、第四章はインターフェースについてです。とはいえ今のまとめは語弊があって、「依存関係の管理」はオブジェクト指向のキモであると筆者が書いたように本書全体で扱うテーマなので不適切です。第三章では特に依存関係とはなにか、どのような依存関係が望ましいのかという点について説明しています。第四章の"インターフェース"も、2種類ある"インターフェース"のうちの片方にしか触れていません。2種類あるというのは、1つは「ある1つのオブジェクトに対して送信できるメッセージの定義群」としての意味で、もう1つは「複数のオブジェクトに対して同じようにメッセージを送ることができるようなメッセージの定義」としての意味です。ざっくりいうと、前者が1つのオブジェクトがもつメソッドのシグネチャのまとまりで後者がJavaのインターフェースです*1。第四章では前者についてどのような定義がよいのか、何を考慮すべきかについて説明しています。

以下、トピックとして気になったものについてかいていきます。

依存関係の認識

本書では依存関係とは何かについて具体的に例を挙げて説明している。 あるクラス内にクラス名がハードコードされていたらそれは当然依存関係であるのだが、それ以外にも初心者が気が付きにくいものがあげられていた*2

依存関係の方向を意識するのが大事なのはひしひしと伝わってきたのだけれども、ここでRubyの言語仕様的な難しさを感じる。Javaだとファイル単位でimport文を書くのであるファイルがどのパッケージに依存するかは宣言的。一方でRubyのrequireはファイル単位ではなくグローバルに影響を及ぼすので依存関係を意識する機会が少ないというのはあるとおもう。

コンストラクタで処理する

これは本の中にある変更に対する反論として挙がっていたのだけれども*3、あるクラスが他のクラスに依存してる場合、それを明示するためにコンストラクタ内で見せたほうがいいんじゃないかという話。 遅延初期化は生成コストがバカにならない場合のみにすべきで普通のインスタンス変数は initialize メソッドで初期化したほうがいいのでは、という意見があった。

この指摘はたしかにそうかもなと納得したのでとりあえずメモ化みたいなのはやめる。


西日暮里.rbは今後も2週間に1回くらいのペースで「オブジェクト指向設計実践ガイド」の読書会を開催していくようなのでよければ是非。月曜日夜20時からで最寄りが秋葉原なので参加もしやすいと思います。なお次回は第五章と第六章の予定で第五章では動的型付け vs 静的型づけのセクションがあるので最悪の場合死に至るかもしれません。

*1:ざっくり言い過ぎなのはわかってます

*2:詳しくは読んでください

*3:本を書く上で選んだサンプルが不適切ではないかという指摘です