bear (suday) design

46
PHP 5.3+ /5.4 BEAR (Sunday)

Upload: akihito-koriyama

Post on 29-Jan-2018

3.160 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: BEAR (Suday) design

PHP 5.3+ /5.4

BEAR (Sunday)

Page 2: BEAR (Suday) design

1. namespace

Page 3: BEAR (Suday) design

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

2. DI

Page 5: BEAR (Suday) design

Say goodbye to BEAR::Dependency()

Page 6: BEAR (Suday) design

\BEAR\Di::Container();

Say hello to

Page 7: BEAR (Suday) design

コンテナをセット

Page 8: BEAR (Suday) design

サービスをセット

Powered

by Aura.

Di

Page 9: BEAR (Suday) design

サービスを取得

Page 10: BEAR (Suday) design

Dependency Injection the JSR 330 way

一部ですが

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

Page 11: BEAR (Suday) design

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

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

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

2. Annotation

Page 15: BEAR (Suday) design

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

• ユーザー定義化

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

Page 16: BEAR (Suday) design

/** * 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

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

Page 18: BEAR (Suday) design

App_Main::run($class);

Page 19: BEAR (Suday) design

App_Main::run($class);

Page 20: BEAR (Suday) design

$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

3.Resource Interface

Page 22: BEAR (Suday) design

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

Page 23: BEAR (Suday) design

function request(Ro $ro, Params $params)

リソース Page

Ro

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

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

Page 24: BEAR (Suday) design

function request(Ro $ro, Params $params)

リソース Page

Ro

クライアント

Page 25: BEAR (Suday) design

function request(Ro $ro, Params $params)

function output(Ro $ro)

リソース Page

Ro

クライアント

インスタンス

Main

Page

Page 26: BEAR (Suday) design

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

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

Webがモデル。

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

Apache

Webブラウザmod_php

Page

Ro

Page 29: BEAR (Suday) design

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

• リソースは「リソース結果を決定する処理」をリソース自身が決定できる。

• =Pageリソースであっても純正Pageアダプター以外の処理でリソース結果を返す事ができる。

Page 31: BEAR (Suday) design

4.CQRS

Page 32: BEAR (Suday) design

CQRSCommand and Query

Responsibility Segregation

Page 33: BEAR (Suday) design

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

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

Page 34: BEAR (Suday) design
Page 35: BEAR (Suday) design
Page 36: BEAR (Suday) design

CQRS + REST = ?

Page 37: BEAR (Suday) design

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

CQRS + REST = BEAR

Page 39: BEAR (Suday) design

<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

<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

5.Compatibility

Page 42: BEAR (Suday) design

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

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

• Ro互換モード

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

Compatibility

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

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

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

Page 43: BEAR (Suday) design

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

7.Multi Language

PHP Page Java Resource

Objective-C Client PHP Resource

Powered

by Thrif

t

言語を超えて祖

結合

Page 45: BEAR (Suday) design

8. Online editorfully supported

Powered

by AceEd

itor

Page 46: BEAR (Suday) design

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