もくじ
オブジェクト脳ができるまで
- クラスの修飾子を把握する
public protected privateの違い - abstract, interfaceの違いを把握する
- デザパタ本を写経する
- Facadeあたりがわかるようになる
- 関連と集約の意味を把握する
関連・・・newで呼び出すが、呼び出したインスタンスはプロパティに保持しない
集約・・・プロパティにインスタンスを保持する - UMLのクラス図が読めるようになる
- デザパタ本が読めるようになる
1.UMLのクラス図を読む
関連や集約、継承と実装に着目して概要を把握する
2. サンプルコードを読む
実際のクラス関係の結びつき方に着目する
→写経しなくてもデザパタが理解できるようになる。
UMLの図が読めることが重要
最初読んでも頭に入らないなぁ〜って思っていたけれど、
ある程度写経して抽象・継承とインターフェイス、特に関連と集約のサンプルコードのイメージを掴んでおくと読めるようになりました。
- デザパタの『Chain of Responsibility』を使いたい!
- Chain of ResponsibilityのUML図を画像として思い出す
- 画像からサンプルコードの概要を思い出す
- サンプルコードの細部を思い出す, 補完していく
別に本やメモを参照すれば良いのかもしれないけれど、速さが足りないっ!
デザパタ名からサンプルコードを想起することはできませんでしたが、デザパタ名からUML図を想起して、そこからサンプルコードを思い出す、補完していくことはできました。
オブジェクト脳ができた
UMLのクラス図を読んでふむーっ(@_@。となる
→実際のサンプルコードを読む
→だよね。
→理解したっぽい。。!?(。- .•)
public function setHandler(ValidationHandler $handler) {
$this->handler = $handler;
}
→その上で写経したり、サンプルコードを見ながらアレンジして動かしてみる
→return $this!(。- .•)
interfaceとabstractクラスの違い
- interfaceは関数定義だけの子クラスの仕様書
子クラス毎に存在する共通の同名の関数だが、中身の振る舞いを変えたい場合 - abstractクラスは共通処理と子クラス毎に異なるabstract関数を定義する
子クラス毎に共通処理がある場合はabstractクラスを利用する
・共通処理をpublic関数を記述する
・子クラス毎にそれぞれ振る舞いの違うものをprotected abstract function 関数名();で定義
interface インターフェイス
- 実装先で利用する関数名の定義のみを行う
- intefaceで定義された関数は実装クラスで定義しないとエラーになる
interfaceの用途
- 仕様書みたいな扱い
interfaceを見れば実装先での仕様がわかる
abstractクラス
- 共通処理をpublic関数で定義し、継承先のクラスそれぞれで振る舞いが違うクラスをabstract関数で定義する
- abstract関数は継承先で記述しなければならない
これはinterfaceと同じ
abstractクラスの用途
- 共通処理があり、継承先クラスそれぞれで振る舞いが違う関数がある場合
関係と集約
関係(関連)
- プロパティに代入しないで値を持たない、newで生成するだけの結びつきの弱いクラス関係
クラスAがクラスBを生成する
【クラスA】→【クラスB】
集約
- メソッドインジェクションでプロパティに保持する結びつきの強いクラス関係
クラスAがクラスBを保持する
【クラスA】◇→【クラスB】