BEAR (Suday) design

Post on 29-Jan-2018

3.160 views 0 download

Transcript of BEAR (Suday) design

PHP 5.3+ /5.4

BEAR (Sunday)

1. namespace

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

2. DI

Say goodbye to BEAR::Dependency()

\BEAR\Di::Container();

Say hello to

コンテナをセット

サービスをセット

Powered

by Aura.

Di

サービスを取得

Dependency Injection the JSR 330 way

一部ですが

標準化されたDIの為のアノテーション

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

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

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

2. Annotation

• どのクラスでも利用可能

• ユーザー定義化

• リソースアノテーション

/** * 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で「制御が反転」「ログイン情報からブログ情報」ではなくて逆になってる

3.More Resource Orientedページもリソースに

App_Main::run($class);

App_Main::run($class);

$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

3.Resource Interface

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

function request(Ro $ro, Params $params)

リソース Page

Ro

リソース処理はアダプターに委譲

リソースもクライアントもリソースの内部処理には関心がない

function request(Ro $ro, Params $params)

リソース Page

Ro

クライアント

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

クライアント

インスタンス

Main

Page

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

クライアント

インスタンス

PageAdapter::request(Ro $ro, Params $params);

Main

Page

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

クライアント

インスタンス

PageAdapter::request(Ro $ro, Params $params);

Main

Page

Webがモデル。

ApacheもブラウザもPHPを知らないのに注目。

Apache

Webブラウザmod_php

Page

Ro

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リソースであっても純正Pageアダプター以外の処理でリソース結果を返す事ができる。

4.CQRS

CQRSCommand and Query

Responsibility Segregation

CQS: 「あらゆるメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリかのいずれかであって、両方を行ってはならない。これは、質問をすることで回答を変化させてはならないということだ。」 -Bertrand Meyer

http://d.hatena.ne.jp/digitalsoul/20100712/1278886009

CQRS + REST = ?

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

CQRS + REST = BEAR

<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

<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データを作成値だけでなく表現も生成する

5.Compatibility

• Saturday(for 5.2)内蔵「そのまま」でも動く

• ページの混在可能 (=Shared nothing)

• Ro互換モード

• 作法はほとんど変わらず低学習コスト

Compatibility

フロントコントローラがなくサイトは単にページリソースの集合体なので

ページ間が Aタグでしか結ばれていない

できるんでしょうか...を目指したい

6.RealTime$this->set(‘user’, $user, ‘realtime’);

$this->set(‘user’, $user, ‘ajax’);

ニコニコ動画の時報CMやgtalkのようなrealtime性リソースの変化をビューがobserveするGUI的MVC

Powered

by Orbit

ed

7.Multi Language

PHP Page Java Resource

Objective-C Client PHP Resource

Powered

by Thrif

t

言語を超えて祖

結合

8. Online editorfully supported

Powered

by AceEd

itor

design memo athttps://gist.github.com/1111850