bear.sunday $app
DESCRIPTION
about the application of BEAR.Sunday PHP web framework.TRANSCRIPT
![Page 1: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/1.jpg)
BEAR.Sunday $appBEAR.Sunday meetup #1 17/Feb/2013 (Sun)
![Page 2: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/2.jpg)
ソフトウエアの原則
![Page 3: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/3.jpg)
依存関係逆転の原則
•具体的な実装に依存してはいけない•抽象に依存する•× スタティックコール• サービスロケーターNG
NG
キーで取得できる実装に依存
実クラスに依存
http://www.flickr.com/photos/rgidra/4256316243/
![Page 4: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/4.jpg)
生成使用分離の原則
•オブジェクトは生成するか利用するかのどちらかで、どちらも同時にしてはいけない
•オブジェクトの使用 は抽象 を取り扱う•オブジェクトの生成 は具象 を取り扱う
使用
生成
抽象
具象
![Page 5: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/5.jpg)
デメテルの原則
•最小知識の原則•必要のないオブジェクトは受け取らない• $c = $obj->getB()->getC();• $c = $obj->getB()->publicCOK
NG
![Page 6: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/6.jpg)
Tell, Don’t ask.
• $dog->walk();• $model->render();• $renderer->set($model->name)->render();
OK
OK
NG
![Page 7: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/7.jpg)
Solution ?
![Page 8: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/8.jpg)
DI + AOP
![Page 9: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/9.jpg)
インターフェイスとクラスを束縛します
![Page 10: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/10.jpg)
@Injectを付けたメソッドに注入されます
![Page 11: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/11.jpg)
束縛の集合がモジュールです
![Page 12: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/12.jpg)
モジュールはモジュールを利用できます
![Page 13: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/13.jpg)
実行モードに応じて束縛は変わります
APIならJSON出力、Devなら詳細なログ...
![Page 14: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/14.jpg)
モードに応じて振る舞いを変えるのでなく振る舞い
NG
![Page 15: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/15.jpg)
モードに応じて振るを変えます構成
OK
修正に閉じ、変更に開いています(OCP)
![Page 16: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/16.jpg)
AOPAspect Oriented Programming
![Page 17: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/17.jpg)
注釈と横断的関心時を束縛
![Page 18: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/18.jpg)
注釈を解釈ここでは「クラスに@Dbと注釈がある」&「”on”で始まっている」メソッドにはDBをセットするDBインジェクターを束縛 しています。 DBインジェクターはメソッドによってmaster/slaveを選択しDBオブジェクトを注入します。 利用側、被利用側ともにDB取得の関心が分離されています。
束縛
![Page 19: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/19.jpg)
モードに応じた構成で全てが束縛され...
Dependency + Aspects
![Page 20: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/20.jpg)
インジェクターでアプリケーションを取得します
![Page 21: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/21.jpg)
アプリケーションは依存を持ちます
![Page 22: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/22.jpg)
依存も依存を持ちます
![Page 23: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/23.jpg)
依存の依存..と取得を続け
![Page 24: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/24.jpg)
巨大な”アプリケーションオブジェクトグラフ”を得ます
![Page 25: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/25.jpg)
アプリケーションはシリアライズ可能で
![Page 26: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/26.jpg)
リクエストを超え再利用されます。
アノテーションと束縛を使った膨大なオブジェクトコンストラクションコストは原理的にほとんどなくなります。
![Page 27: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/27.jpg)
コンストラクタはリクエストを超えて1度しかコールされず、そのときプロパティに代入した値はキャッシュされます。
構成に応じたコードはコンストラクタ、そうでないものはメソッドと区別できます。
![Page 28: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/28.jpg)
アプリケーションはスクリプトでも取得できます
![Page 29: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/29.jpg)
他のシステムからの利用が容易です
より長期間の運用を可能にします
![Page 30: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/30.jpg)
アプリケーションスクリプトでサービスを記述
自由な構成が可能です
![Page 31: BEAR.Sunday $app](https://reader034.vdocuments.mx/reader034/viewer/2022042814/554f7255b4c9058a148b53dd/html5/thumbnails/31.jpg)
アプリケーションオブジェクトまとめ
•DI/AOPでOOP原則に従う•アプリケーションは1つの変数、巨大なオブジェクトグラフ
•スクリプトから準備なしに取得できる•アプリケーションスクリプトでサービスを記述