symfony2でより良いソフトウェアを作るために

40
 Symfony2 より良いソフトウェア を作るために 株式会社アイテマン 久保敦啓 @iteman 4 Symfony2 勉強会

Upload: atsuhiro-kubo

Post on 19-May-2015

44.485 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Symfony2でより良いソフトウェアを作るために

  

Symfony2でより良いソフトウェアを作るために

株式会社アイテマン久保敦啓@iteman

第 4回 Symfony2勉強会

Page 2: Symfony2でより良いソフトウェアを作るために

  

Page 3: Symfony2でより良いソフトウェアを作るために

  

iteman

株式会社アイテマン 代表取締役

Piece Projectプロジェクトリード

Twitter @iteman

Page 4: Symfony2でより良いソフトウェアを作るために

  

Piece Framework

PHPのアプリケーションフレームワーク

オープンソースソフトウェア New BSD License Eclipse Public License

Page 5: Symfony2でより良いソフトウェアを作るために

  

歴史

2005 Stagehand_TestRunner

2006 Piece_Unity, Piece_Flow

2009 MakeGood

2011 ???

Page 6: Symfony2でより良いソフトウェアを作るために

  

良いソフトウェアとは?

Page 7: Symfony2でより良いソフトウェアを作るために

  

“ ソフトウェアの核心は、

ドメインに関係した問題を

ユーザのために解決する能

力である。”—エリック・エヴァンスのドメイン駆動設計

Page 8: Symfony2でより良いソフトウェアを作るために

  

Symfony2

Page 9: Symfony2でより良いソフトウェアを作るために

  

“Build your App,

not your Tools.”—The Symfony2 Book

Page 10: Symfony2でより良いソフトウェアを作るために

  

Symfony2の特徴

バンドル

コンフィギュレーション

サービスコンテナ (DIコンテナ )

機能テスト

独立したドメインオブジェクト

etc...

Page 11: Symfony2でより良いソフトウェアを作るために

  

バンドル モジュールシステムの構成単位

フィーチャの提供単位

クラス、コントローラ、 Webリソース等を

束ねたもの

外部のモジュールとの統合レイヤ

セマンティックコンフィギュレーションの提供

他のバンドルの拡張の提供

自身のバンドルの拡張ポイントの提供

Page 12: Symfony2でより良いソフトウェアを作るために

  

バンドルの構成要素と依存関係

Bundle Classes Controllers Web Resources

Bundles Classes Other Resources

Page 13: Symfony2でより良いソフトウェアを作るために

  

バンドルの拡張

kernel.listener

web_profiler.debug_toolbar assetic.request_listener

WebProfilerBundleWebProfilerBundle AsseticBundle

FrameworkBundle

...

Page 14: Symfony2でより良いソフトウェアを作るために

  

既存のモジュールシステム

PEARパッケージ

Phar

Debianパッケージ

OSGiバンドル

etc...

Page 15: Symfony2でより良いソフトウェアを作るために

  

バンドル設計の原則

高い凝集度と低い結合度 一般的なモジュール設計の原則

パッケージ設計の原則

—アジャイルソフトウェア開発の奥義

再利用・リリース等価の原則など 6つの原則

ドメインの概念

—エリック・エヴァンスのドメイン駆動設計

Page 16: Symfony2でより良いソフトウェアを作るために

  

サービスコンテナ

Dependency Injection 依存関係逆転の原則

—アジャイルソフトウェア開発の奥義

コンポーネント間の疎結合化

テスタビリティの向上

コンポーネント構成知識の保存と可視化 軽量プログラミング言語における

DIコンテナの価値

Page 17: Symfony2でより良いソフトウェアを作るために

  

依存関係の逆転

Client

Server

Client

Server Interface

Server

Page 18: Symfony2でより良いソフトウェアを作るために

  

セマンティックコンフィギュレーション

# app/config/config.ymlframework:    secret:          xxxxxxxxxx    charset:         UTF­8    error_handler:   null    form:            true    csrf_protection: true    router:        { resource: "%kernel.root_dir%/config/routing.yml" }    # ...

Page 19: Symfony2でより良いソフトウェアを作るために

  

トランスフォーメーション

---------- ---------- ---------- ---------- ------

Service Containers

Semantic Configurations(YAML,XML,PHP)

Service Definitions(Objects)

---------- ---------- ---------- ---------- ------

Service ContainerConfigurations(YAML,XML,PHP)

Parse Populate

Parse

Problem Space Solution Space

Page 20: Symfony2でより良いソフトウェアを作るために

  

ドメイン特化言語

DSL:Domain Specific Languages

問題空間の言語

ドメインに特化した記法を持つ言語

言語ワークベンチ

コンフィグレーション DSL

式 DSL,グラフィカル DSL

Page 21: Symfony2でより良いソフトウェアを作るために

  

ドメイン特化言語の開発

コンフィギュレーション DSL

YAML 式 DSL,グラフィカル DSL

言語ワークベンチ Lexer/Parser Generators

Page 22: Symfony2でより良いソフトウェアを作るために

  

機能テスト

class HelloControllerTest extends WebTestCase{    public function testIndex()    {        $client = $this­>createClient();

        $crawler = $client­>request('GET', '/hello/Fabien');

        $this­>assertTrue($crawler­>filter('html:contains("Hello Fabien")')­>count() > 0);    }}

Page 23: Symfony2でより良いソフトウェアを作るために

  

テストの対象

ユーザ側からみた Webアプリの機能

機能に対するユースケースの粒度

ルーティング

ページフロー

入力・出力

バリデーション

Page 24: Symfony2でより良いソフトウェアを作るために

  

独立したドメインオブジェクト

Pure PHPオブジェクト

バリデーションや ORマッピングから

の高い独立性

フレームワークからの影響を極小化

Page 25: Symfony2でより良いソフトウェアを作るために

  

“Build your App,

not your Domain Models.”

—iteman

Page 26: Symfony2でより良いソフトウェアを作るために
Page 27: Symfony2でより良いソフトウェアを作るために

  

なぜフレームワークを使うのか?

Page 28: Symfony2でより良いソフトウェアを作るために

  

“ ソフトウェアの核心は、

ドメインに関係した問題を

ユーザのために解決する能

力である。”—エリック・エヴァンスのドメイン駆動設計

Page 29: Symfony2でより良いソフトウェアを作るために

  

ドメイン駆動設計

DDD:Domain­Driven Design

Page 30: Symfony2でより良いソフトウェアを作るために

  

“ ドメインモデルをソフトウェア

開発の中心にすえ、コードやコミュニ

ケーションを常にドメインモデルと一

体化させながら、ドメインモデルを反

復的に深化させることでより価値の高い

アプリケーションを生み出していこう

とする考え方”

—Domain­Driven Designのエッセンス

Page 31: Symfony2でより良いソフトウェアを作るために

  

ドメイン駆動設計の要点

ドメインモデルは、ドメイン知識を深めながら反復的( iterative)に深化させていく

ドメインモデルが、開発者とドメイン知識をもつ人(ユーザ、専門家等)との間の共通言語となるようにする

ドメインモデルと実装コードとがきちんと対応付けられるようにする

—Domain­Driven Designのエッセンス

Page 32: Symfony2でより良いソフトウェアを作るために

  

代表的なパターン

ユビキタス言語

モデル駆動設計

≠ オブジェクト指向 ドメイン特化言語

実践的モデラー

Page 33: Symfony2でより良いソフトウェアを作るために

  

ドメイン駆動設計を実践するには?

Page 34: Symfony2でより良いソフトウェアを作るために

  

プロセス、技法、パラダイム

アジャイルプロセス (Scrum, XP, …)

テスト駆動開発 (TDD:Test­Driven Development)

SOLID

ビヘイビア駆動開発 (BDD:Behavior­Driven Development)

リファクタリング

Page 35: Symfony2でより良いソフトウェアを作るために

  

SOLID

単一責任の原則

SRP:The Single Responsibility Principle

オープン・クローズドの原則

OCP:The Open­Closed Principle

リスコフの置換原則

LSP:The Liskov Substitution Principle

インタフェース分離の原則

ISP:The Interface Segregation Principle

依存関係逆転の原則

DIP:The Dependency Inversion Principle

Page 36: Symfony2でより良いソフトウェアを作るために

  

プロセス、技法、パラダイム

オブジェクト指向プログラミング

関数プログラミング

ジェネリックプログラミング

アスペクト指向プログラミング

メタプログラミング

Page 37: Symfony2でより良いソフトウェアを作るために

  

プロセス、技法、パラダイム

マルチパラダイムデザイン

ジェネレーティブプログラミング

プロダクトライン

Software Factories

インテンショナルプログラミング

言語指向プログラミング

言語ワークベンチ

Lean Software Architecture

Page 38: Symfony2でより良いソフトウェアを作るために

  

プロセス、技法、パラダイム

レイヤ化アーキテクチャ

モデル・ビュー・コントローラ

DCI: Data, Context, and Interaction

Page 39: Symfony2でより良いソフトウェアを作るために

  

DDD+TDD=アメージング!

Page 40: Symfony2でより良いソフトウェアを作るために

  

『エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践 ) 』、翔泳社、 2011年、 ISBN 978­4798121963

[ 技術講座 ] Domain­Driven Designのエッセンス 第 1回、 http://www.ogis­ri.co.jp/otc/hiroba/technical/DDDEssence/chap1.html

『アジャイルソフトウェア開発の奥義 第 2版 オブジェクト指向開発の神髄と匠の技』、ソフトバンククリエイティブ、 2008年、 ISBN 978­4797347784

『ジェネレーティブプログラミング (IT Architects’Archive CLASSIC MODER) 』、翔泳社、 2008年、 ISBN 978­4798113319

The Symfony2 Book, http://symfony.com/doc/current/book/index.html 

参考