11/1 NSEGの「オブジェクト指向設計実践ガイド」読書会の第5回に参加しました。参加者7名でした。
今回は第5章を読みました。
オブジェクトの型(クラス)を調べて処理を変えるというコードの例としてcase文が使われてました:
case preparer when Mechanic preparer.prepare_bicycles(bicycles) when TripCoordinator preparer.buy_food(customers) when Driver preparer.gas_up(vehicle) preparer.fill_water_tank(vehicle) end
本に何の説明も書かれてなかったのでRubyを知らない人は、このようにcase文でクラスの判定ができるということがわからなかったようです。
Rubyのcase文は単純な一致比較だけでなく、文字列が正規表現に適合するかとか、上の例のようにクラスのオブジェクトかどうかを調べたり、when に書かれたオブジェクトによって色んな比較が便利にできるのですが、その仕組みは単純で、
case a when b ...
は、b === a
を判定しているにすぎません。
基底クラスであるObjectの ===
メソッドは単純一致比較、正規表現の ===
メソッドは正規表現に適合するかどうかの比較、Classの ===
メソッドはオブジェクトがクラスインスタンスかどうかの比較というように、各オブジェクトに適切な ===
メソッドを定義することで自然にcase文が記述できるようになっているのです。
まさにこの章の本題である「抽象的なパブリックインタフェースを取り決める」ということが実装されている例になってますね。
後半、静的型付けと動的型付けの比較をしていますが、静的型付けのメリットを過小評価してるような気がしました。 コンパイル時の型検査を "コストが高い割にわずかな価値しか得られない深刻な制約" と書いていたり。
本の中で静的型付けのメリットとして挙げられてますが、
- コンパイラがコンパイル時に型エラーを発見してくれる
- 可視化された型情報は、文書の役割も果たしてくれる
この2つはかなり役に立つと個人的には思ってます。 1番目は自分がコードを書く時。2番目は人のコードを読む時。
そういや、Ruby にもバージョン3で(どんな形かはわかりませんが)型システムが入るらしいですね。
今はまた静的型付き言語が流行ってきてるようですが、原著「Practical Object-Oriented Design in Ruby」は2012年なのでちょっと古いのかもしれません。 来年に第二版が出るみたいですね。
Practical Object-Oriented Design in Ruby: An Agile Primer (2nd Edition)
- 作者: Sandi Metz
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2018/07/10
- メディア: ペーパーバック
- この商品を含むブログを見る
次回は 11/15 です。
ところで12/2に「ながのRubyの会」があるのでよろしければこちらもご参加ください。