10/4 NSEGの「オブジェクト指向設計実践ガイド」読書会の第3回に参加しました。参加者11名でした。盛況ですね。
今回は第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 です。
この書籍(に限らず技術評論社の書籍全般)を電子書籍で購入する場合は https://gihyo.jp/dp がおすすめです。 ひとつ購入すればPDFとEPUBの両方が入手できて、DRMフリーです。