第3回「オブジェクト指向設計実践ガイド」読書会に参加しました

10/4 NSEGの「オブジェクト指向設計実践ガイド」読書会の第3回に参加しました。参加者11名でした。盛況ですね。

nseg.connpass.com

今回は第3章を読みました。

コード例が単順すぎて、より良い設計として挙げられてるコードがいまいちピンとこないところもありましたが、なんとなくわかった気がします。

「自身より変更されないものに依存しなさい」は、なるほどなーと思いました。

引数を一つのHashで受けつけるというのは、訳注にもありましたが今はキーワード引数を使うのが良いですね。

本の「はじめに」に「本で説明する概念を理解するために Ruby を知っている必要はありません」とありましたが、コード例を読み解くにはやっぱりRubyの知識が必要です。Rubyの構文についての説明が一切ないので。

私は前回の第2章には不参加だったのですが、attr_reader とか @変数 とかが何の説明もなしに出てきてもRubyを知らない人は戸惑いますよね。

p.50 の

Wheel = Struct.new(:rim, :tire)
def wheelify(data)
  data.collect {|cell|
    Wheel.new(cell[0], cell[1])}
end

Struct を使うのは無駄に難易度を上げているんじゃないかと思いました。

第3章には module が出てきたので、名前空間を分けるためのもの…と説明しました。

読み終わった後で、モジュールとクラスについて以下の説明をしました。あんまり本書の内容とは関係ありませんが。

Rubyはクラスもオブジェクトで、Classクラスのインスタンス。

123.class   #=> Integer
"abc".class #=> String
String.class  #=> Class
class Hoge
end

Hoge = Class.new

と同じ。

モジュールはクラスと似たようなものだけど、インスタンスを生成することはできない。 Module クラスを継承してインスタンスを作る機能を追加したものが Class クラス。

Class.superclass #=> Module

Class.new で作った直後のクラスは名前がない。定数に代入することでクラス名がつけられる。

a = Class.new  #=> #<Class:0x0055ed560694f8>
X = a          #=> X
a              #=> X

2章の例は Struct.new で名無しクラスを作って、Wheel に代入することで Wheel クラスを作っている。

説明したことで、なんかRubyは難しいと思われてしまった感がなきにしもあらずですが、Rubyは難しくないですよ!こわくないよー。


次回は 10/18 です。

nseg.connpass.com

この書籍(に限らず技術評論社の書籍全般)を電子書籍で購入する場合は https://gihyo.jp/dp がおすすめです。 ひとつ購入すればPDFとEPUBの両方が入手できて、DRMフリーです。

gihyo.jp