| 両方とも前のリビジョン
前のリビジョン
次のリビジョン
|
前のリビジョン
|
article:poodr [2020/09/27 11:03] kijima [Practical Object-Oriented Design in Ruby] |
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 80 | 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 ===== |
| * 1つのオブジェクトに1つの責任。 | * 1つのオブジェクトに1つの責任。 |
| * インターフェースの明確さは設計スキルを明らかにする。 | * インターフェースの明確さは設計スキルを明らかにする。 |
| | * メッセージに焦点をあわせ、オブジェクトを明確にする。 |
| ===== 5. Reducing Costs with Duck Typing ===== | ===== 5. Reducing Costs with Duck Typing ===== |
| | |
| | * オブジェクト指向のデザインの目的は変化のコストを小さくすることにある。 |
| | * ダックタイピングは特定のクラスに関連付けられていないパブリックインターフェースである。 |
| | * 型は、ふるまいを定義する。intだと演算、stringはconcat、など。パブリックインターフェースといえる。 |
| | * クラスは、オブジェクトがパブリックインターフェースを得る方法の一つである。 |
| | * 手続き型言語のメインメソッドのような、知りすぎているクラスは危険である。…変更の副作用を受けやすく、変更しにくい。 |
| | <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 ===== |