両方とも前のリビジョン
前のリビジョン
次のリビジョン
|
前のリビジョン
|
article:poodr [2020/09/27 15:11] kijima [5. Reducing Costs with Duck Typing] |
article:poodr [2020/12/30 00:28] (現在) kijima |
{{tag>book 進行中}} | {{tag>book}} |
====== Practical Object-Oriented Design in Ruby ====== | ====== Practical Object-Oriented Design in Ruby ====== |
| |
5 14 21 24 30 59 65 71 81 88 | 5 14 21 24 30 59 65 71 81 88 92 105 110 125 141 |
| |
オブジェクト指向なデザインの本。要するにRubyでの再利用性、耐変更性を考慮した正しい書き方。 | オブジェクト指向なデザインの本。要するにRubyでの再利用性、耐変更性を考慮した正しい書き方。 |
デザインパターンとたぶん同じ意味。CやJavaをテーマにしたデザインパターンの本は数あれど、Rubyを題材にしたデザインの本はそう多くない。 | デザインパターンの本だと思っていたが、違う。 |
| |
===== 1. Object-Oriented Design ===== | ===== 1. Object-Oriented Design ===== |
* クラスは、オブジェクトがパブリックインターフェースを得る方法の一つである。 | * クラスは、オブジェクトがパブリックインターフェースを得る方法の一つである。 |
* 手続き型言語のメインメソッドのような、知りすぎているクラスは危険である。…変更の副作用を受けやすく、変更しにくい。 | * 手続き型言語のメインメソッドのような、知りすぎているクラスは危険である。…変更の副作用を受けやすく、変更しにくい。 |
| <code> |
| class Trip |
| def prepare(prepares) |
| prepares.each {|preparer| |
| preparer.prepare_trip(self)} |
| end |
| end |
| |
| class Mechanic |
| def prepare_trip(trip) |
| trip.bicycles.each {|bycycle| |
| prepare_bicycle(bicycle)} |
| end |
| end |
| </code> |
| * prepare_tripの中身はクラスによって違う。移譲して、一発でprepare_tripができる。 |
| * 具体的なコードは理解はしやすいがメンテナンスしにくい。抽象的なコードは最初は理解しにくいが変更しやすい。 |
| * ボリモーフィズム。kind_of?, is_a?, responds_to? |
| * 動的型付け。コードを書くコード、メタプログラミング。 |
| * 動的型付けがダックタイピングを可能にする。 |
===== 6. Acquiring Behavior Through Inheritance ===== | ===== 6. Acquiring Behavior Through Inheritance ===== |
| |
| * 継承の核となる概念は、自動的なメッセージの移譲である。 |
| * スーパークラスで定義して子クラスにメッセージを送る。テンプレートメソッドパターン。ただし、これは具体クラスで埋め込むメソッドを用意し損ねる可能性があるので、例外メッセージを入れておくと親切。あとでオーバライドすると、例外が表示されない。 |
| * super()し忘れると間違った挙動をもたらす。よくない。コンストラクタのフックメソッドを作っておく。そうすると、子クラスには特化だけ書かれていることになる。 |
===== 7. Sharing Role Behavior with Modules ===== | ===== 7. Sharing Role Behavior with Modules ===== |
| |
| * オブジェクトごとに共通の振る舞い、それがロール。 |
| * ミックスインとは、名前をつけてメソッドのグループを定義すること。クラスとは独立し、どんなオブジェクトにも混ぜ入れることができる。 |
| * Rubyでは、混ぜ入れられるものを「モジュール」という。なるほど。''include''するやつ。 |
===== 8. Combining Objects with Composition ===== | ===== 8. Combining Objects with Composition ===== |
===== 9. Designing Cost-Effective Tests ===== | ===== 9. Designing Cost-Effective Tests ===== |