BEAR (Suday) design
-
Upload
akihito-koriyama -
Category
Technology
-
view
3.160 -
download
0
Transcript of BEAR (Suday) design
![Page 1: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/1.jpg)
PHP 5.3+ /5.4
BEAR (Sunday)
![Page 2: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/2.jpg)
1. namespace
![Page 3: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/3.jpg)
1. namespace
use \coupon\App\Auth as couponAuth;
use \blog\App\Auth as blogAuth;
read ro:://coupon/User?id=1read ro:://blog/User?id=1
![Page 4: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/4.jpg)
2. DI
![Page 5: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/5.jpg)
Say goodbye to BEAR::Dependency()
![Page 6: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/6.jpg)
\BEAR\Di::Container();
Say hello to
![Page 7: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/7.jpg)
コンテナをセット
![Page 8: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/8.jpg)
サービスをセット
Powered
by Aura.
Di
![Page 9: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/9.jpg)
サービスを取得
![Page 10: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/10.jpg)
Dependency Injection the JSR 330 way
一部ですが
標準化されたDIの為のアノテーション
![Page 11: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/11.jpg)
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@ScopePrototype
Session
Application
Property Injection
Singleton
@Inject
![Page 12: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/12.jpg)
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@PostConstruct
@PreDestory
Setter Injection
Initialization
@Inject
Finalization
![Page 13: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/13.jpg)
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@PreDestory
@Named
Setter Injection@Inject
Finalization
![Page 14: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/14.jpg)
2. Annotation
![Page 15: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/15.jpg)
• どのクラスでも利用可能
• ユーザー定義化
• リソースアノテーション
![Page 16: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/16.jpg)
/** * Blog info * * @Template(user.tpl) * @Cache(life=0) * @Pager(item=10) * @Pull(“ro://self/User/Login”) */ public function onRead($values) { $this->set(); }
設定を利用する側から利用される側に
Inversion of Control
@Pullで「制御が反転」「ログイン情報からブログ情報」ではなくて逆になってる
![Page 17: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/17.jpg)
3.More Resource Orientedページもリソースに
![Page 18: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/18.jpg)
App_Main::run($class);
![Page 19: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/19.jpg)
App_Main::run($class);
![Page 20: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/20.jpg)
$params = $di->get(‘params’)->setOption($option);$page = $di->factory('testapp\App\Page\Hello\World');$ro = $di->get('main')->request($page, $params)->getRo();$ro->output();
ページリクエスト
ページリクエスト
の結果もRo
![Page 21: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/21.jpg)
3.Resource Interface
![Page 22: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/22.jpg)
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
![Page 23: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/23.jpg)
function request(Ro $ro, Params $params)
リソース Page
Ro
リソース処理はアダプターに委譲
リソースもクライアントもリソースの内部処理には関心がない
![Page 24: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/24.jpg)
function request(Ro $ro, Params $params)
リソース Page
Ro
クライアント
![Page 25: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/25.jpg)
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
Main
Page
![Page 26: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/26.jpg)
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
PageAdapter::request(Ro $ro, Params $params);
Main
Page
![Page 27: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/27.jpg)
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
PageAdapter::request(Ro $ro, Params $params);
Main
Page
![Page 28: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/28.jpg)
Webがモデル。
ApacheもブラウザもPHPを知らないのに注目。
Apache
Webブラウザmod_php
Page
Ro
![Page 29: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/29.jpg)
Main Page Ro
Ro
BrowserGET /User?id=1 request($page, $params); request($ro, $params);
$ro$roHTTP
$ro->output();
pageAdapter::request($page, $params);
roAdapter::request($page, $params);
Resource Interface
read User?id=1
![Page 30: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/30.jpg)
• リソースは「リソース結果を決定する処理」をリソース自身が決定できる。
• =Pageリソースであっても純正Pageアダプター以外の処理でリソース結果を返す事ができる。
![Page 31: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/31.jpg)
4.CQRS
![Page 32: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/32.jpg)
CQRSCommand and Query
Responsibility Segregation
![Page 33: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/33.jpg)
CQS: 「あらゆるメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリかのいずれかであって、両方を行ってはならない。これは、質問をすることで回答を変化させてはならないということだ。」 -Bertrand Meyer
http://d.hatena.ne.jp/digitalsoul/20100712/1278886009
![Page 34: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/34.jpg)
![Page 35: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/35.jpg)
![Page 36: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/36.jpg)
CQRS + REST = ?
![Page 37: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/37.jpg)
CQS: 「あらゆるメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリかのいずれかであって、両方を行ってはならない。これは、質問をすることで回答を変化させてはならないということだ。」 -Bertrand Meyer
http://d.hatena.ne.jp/digitalsoul/20100712/1278886009
コマンドクエリ READ
CREATEUPDATEDELETE
ロジックは、可能な限り(副作用なく戻り値を返すような)関数の中に置く。命令は単純な操作として厳密に分離し、ドメイン情報は返さないようにする。
DDD/Side -Effect-Free Functions - Java EE勉強会
変化させてはならないRESTのGETと同じ
Side Effect FREE
![Page 38: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/38.jpg)
CQRS + REST = BEAR
![Page 39: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/39.jpg)
<h2>koriym</h2><ul><li>name: Koriama</li></ul>
RDB (MySQL)
Representation
Resource
Client
COMMANDupdate User?id=1&name=koriym
NoSQLQUERY
read User?id=1
![Page 40: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/40.jpg)
<h2>koriym</h2><ul><li>name: Koriama</li></ul>
それぞれに適したレポジトリに分離する
COMMANDupdate User?id=1&name=koriym
PC用,iPhone用、携帯用、AJAX用、データ用...
Commandはデータの粒度やリレーションに関心がある。
RDB (MySQL)
Client
NoSQLQUERY
read User?id=1
リソース表現はクライアントによって異なり複数存在
Queryは構造に無関心。結合されたキャッシュが読めれば良い。QueryとCommandではデータ構造の関心は異なる
キャッシュの適切な破壊
Commandの実行と同時にQueryデータを作成値だけでなく表現も生成する
![Page 41: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/41.jpg)
5.Compatibility
![Page 42: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/42.jpg)
• Saturday(for 5.2)内蔵「そのまま」でも動く
• ページの混在可能 (=Shared nothing)
• Ro互換モード
• 作法はほとんど変わらず低学習コスト
Compatibility
フロントコントローラがなくサイトは単にページリソースの集合体なので
ページ間が Aタグでしか結ばれていない
できるんでしょうか...を目指したい
![Page 43: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/43.jpg)
6.RealTime$this->set(‘user’, $user, ‘realtime’);
$this->set(‘user’, $user, ‘ajax’);
ニコニコ動画の時報CMやgtalkのようなrealtime性リソースの変化をビューがobserveするGUI的MVC
Powered
by Orbit
ed
![Page 44: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/44.jpg)
7.Multi Language
PHP Page Java Resource
Objective-C Client PHP Resource
Powered
by Thrif
t
言語を超えて祖
結合
![Page 45: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/45.jpg)
8. Online editorfully supported
Powered
by AceEd
itor
![Page 46: BEAR (Suday) design](https://reader034.fdocuments.net/reader034/viewer/2022050613/555d7fa4d8b42a6c3d8b4a01/html5/thumbnails/46.jpg)
design memo athttps://gist.github.com/1111850