「99 Bottles of OOP」を読んだ
「オブジェクト指向設計実践ガイド」の著者のSandi MetzとKatrina Owen著の「99 Bottles of OOP」(https://www.sandimetz.com/99bottles/)を読んだので感想を書きます。
読了するのに数週間かかってしまったので英語の本を読むスピードを上げていきたい。。
どんな本か?
「99 Bottles of Oop」はrubyでオブジェクト指向を学ぶ本で、「オブジェクト指向設計実践ガイド」が各プラクティスごとに説明してあるのと異なり、こちらの本では一つの題材について、実装、リファクタリング、機能追加をTDDで進めていく中でオブジェクト指向での設計、実装の進め方を学ぶことがきます。
概要
各章ごとに重要だと思った点をピックアップします。
1. Redesicovering Simplicity
例題に対して4種類の実装をメトリックなどをもとにどれが一番良いかを検証。
変更が発生するまでは変更容易性よりも理解しやすさに重点をを置いたShameless Greenの手法が良い。
早すぎる抽象化は行わない。
2.Test Driving Shameless Green
Shameless Greenを導くテストをTDDでどのように作るか。
TDDで小さいステップで修正していく。
- テストを書く
- テストを実行する
- 正しく動くよう修正する
3.Unerathing Concepts
新しい要件が発生した場合にどのように修正するか。
開放/閉鎖原則にしたがって、新しい要件を実装する前にコードが「開放」されるまでリファクリングする。
「コードの臭い」や「Flocking Rules」を元にリファクタリングする。
コードの臭いで注目すべきポイント
- 重複
- 大きすぎるクラス
Flocking Rules
- 最も似ている部分を選択
- それらの最小の相違点を見つける
- 差異をなくす簡潔な変更を行う
4. Practicing Horizontal Refactoring
リスコフの置換原則にしたがってリファクタリングを進める。
名前の付け方で抽象的/一般的の尺度を元にどのように決めていくのかが説明されているのが良かったです。
5. Separating Responsibilities
リファクタリングを進め、クラスを責務で分割する。
責務の分割の際は下記の質問を手掛かりにする。
- 同じ形状のメソッドはあるか?
- 同じ名前の引数を取るメソッドはあるか?
- 同じ名前の引数は常に同じ意味か?
- このクラスにprivateを入れるとするとどこに入れるか?
- このクラスを二つの部分に分ける場合どこで分ける?
- 条件分岐のテストに共通点はあるか?
- 条件分岐のブランチ数は?
- 条件分岐以外のコードがメソッドにあるか?
- メソッドが引数以外のクラスの情報に依存しているか?
6. Archeving Openess
データの塊(同時に発生する複数のデータ)をコードから取り除き、条件分岐をポリモーフィズムで取り除く。
データの塊が発生するのはコンセプトが抽出されていないから。
リスコフ違反を修正するのは重要。rubyのような動的型付けのオブジェクト指向言語ではオブジェクト間の暗黙的な契約の中の明示的な信頼に依存しているから。
修正が完了すると新しい要件に対して「開放」されているのでコードの修正を行う。
感想
具体的な例題を元にリファクタリングを進めて良い設計にしていくところが分かりやすくて良かったです。リファクタリングの各手法をどのような観点でどのように適用していくのかが詳細に説明されているので理解しやすかったです。
rubyでオブジェクト指向を学ぶにはかなりおススメの本だと思います。
「オブジェクト指向設計実践ガイド」の原著についても今年第二版がでるみたいなのでそちらも楽しみです。
https://www.amazon.co.jp/dp/0134456475/