symfony2でより良いソフトウェアを作るために
TRANSCRIPT
![Page 1: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/1.jpg)
Symfony2でより良いソフトウェアを作るために
株式会社アイテマン久保敦啓@iteman
第 4回 Symfony2勉強会
![Page 2: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/2.jpg)
![Page 3: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/3.jpg)
iteman
株式会社アイテマン 代表取締役
Piece Projectプロジェクトリード
Twitter @iteman
![Page 4: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/4.jpg)
Piece Framework
PHPのアプリケーションフレームワーク
オープンソースソフトウェア New BSD License Eclipse Public License
![Page 5: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/5.jpg)
歴史
2005 Stagehand_TestRunner
2006 Piece_Unity, Piece_Flow
2009 MakeGood
2011 ???
![Page 6: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/6.jpg)
良いソフトウェアとは?
![Page 7: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/7.jpg)
“ ソフトウェアの核心は、
ドメインに関係した問題を
ユーザのために解決する能
力である。”—エリック・エヴァンスのドメイン駆動設計
![Page 8: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/8.jpg)
Symfony2
![Page 9: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/9.jpg)
“Build your App,
not your Tools.”—The Symfony2 Book
![Page 10: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/10.jpg)
Symfony2の特徴
バンドル
コンフィギュレーション
サービスコンテナ (DIコンテナ )
機能テスト
独立したドメインオブジェクト
etc...
![Page 11: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/11.jpg)
バンドル モジュールシステムの構成単位
フィーチャの提供単位
クラス、コントローラ、 Webリソース等を
束ねたもの
外部のモジュールとの統合レイヤ
セマンティックコンフィギュレーションの提供
他のバンドルの拡張の提供
自身のバンドルの拡張ポイントの提供
![Page 12: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/12.jpg)
バンドルの構成要素と依存関係
Bundle Classes Controllers Web Resources
Bundles Classes Other Resources
![Page 13: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/13.jpg)
バンドルの拡張
kernel.listener
web_profiler.debug_toolbar assetic.request_listener
WebProfilerBundleWebProfilerBundle AsseticBundle
FrameworkBundle
...
![Page 14: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/14.jpg)
既存のモジュールシステム
PEARパッケージ
Phar
Debianパッケージ
OSGiバンドル
etc...
![Page 15: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/15.jpg)
バンドル設計の原則
高い凝集度と低い結合度 一般的なモジュール設計の原則
パッケージ設計の原則
—アジャイルソフトウェア開発の奥義
再利用・リリース等価の原則など 6つの原則
ドメインの概念
—エリック・エヴァンスのドメイン駆動設計
![Page 16: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/16.jpg)
サービスコンテナ
Dependency Injection 依存関係逆転の原則
—アジャイルソフトウェア開発の奥義
コンポーネント間の疎結合化
テスタビリティの向上
コンポーネント構成知識の保存と可視化 軽量プログラミング言語における
DIコンテナの価値
![Page 17: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/17.jpg)
依存関係の逆転
Client
Server
Client
Server Interface
Server
![Page 18: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/18.jpg)
セマンティックコンフィギュレーション
# app/config/config.ymlframework: secret: xxxxxxxxxx charset: UTF8 error_handler: null form: true csrf_protection: true router: { resource: "%kernel.root_dir%/config/routing.yml" } # ...
![Page 19: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/19.jpg)
トランスフォーメーション
---------- ---------- ---------- ---------- ------
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でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/20.jpg)
ドメイン特化言語
DSL:Domain Specific Languages
問題空間の言語
ドメインに特化した記法を持つ言語
言語ワークベンチ
コンフィグレーション DSL
式 DSL,グラフィカル DSL
![Page 21: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/21.jpg)
ドメイン特化言語の開発
コンフィギュレーション DSL
YAML 式 DSL,グラフィカル DSL
言語ワークベンチ Lexer/Parser Generators
![Page 22: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/22.jpg)
機能テスト
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でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/23.jpg)
テストの対象
ユーザ側からみた Webアプリの機能
機能に対するユースケースの粒度
ルーティング
ページフロー
入力・出力
バリデーション
![Page 24: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/24.jpg)
独立したドメインオブジェクト
Pure PHPオブジェクト
バリデーションや ORマッピングから
の高い独立性
フレームワークからの影響を極小化
![Page 25: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/25.jpg)
“Build your App,
not your Domain Models.”
—iteman
![Page 26: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/26.jpg)
![Page 27: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/27.jpg)
なぜフレームワークを使うのか?
![Page 28: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/28.jpg)
“ ソフトウェアの核心は、
ドメインに関係した問題を
ユーザのために解決する能
力である。”—エリック・エヴァンスのドメイン駆動設計
![Page 29: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/29.jpg)
ドメイン駆動設計
DDD:DomainDriven Design
![Page 30: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/30.jpg)
“ ドメインモデルをソフトウェア
開発の中心にすえ、コードやコミュニ
ケーションを常にドメインモデルと一
体化させながら、ドメインモデルを反
復的に深化させることでより価値の高い
アプリケーションを生み出していこう
とする考え方”
—DomainDriven Designのエッセンス
![Page 31: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/31.jpg)
ドメイン駆動設計の要点
ドメインモデルは、ドメイン知識を深めながら反復的( iterative)に深化させていく
ドメインモデルが、開発者とドメイン知識をもつ人(ユーザ、専門家等)との間の共通言語となるようにする
ドメインモデルと実装コードとがきちんと対応付けられるようにする
—DomainDriven Designのエッセンス
![Page 32: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/32.jpg)
代表的なパターン
ユビキタス言語
モデル駆動設計
≠ オブジェクト指向 ドメイン特化言語
実践的モデラー
![Page 33: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/33.jpg)
ドメイン駆動設計を実践するには?
![Page 34: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/34.jpg)
プロセス、技法、パラダイム
アジャイルプロセス (Scrum, XP, …)
テスト駆動開発 (TDD:TestDriven Development)
SOLID
ビヘイビア駆動開発 (BDD:BehaviorDriven Development)
リファクタリング
![Page 35: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/35.jpg)
SOLID
単一責任の原則
SRP:The Single Responsibility Principle
オープン・クローズドの原則
OCP:The OpenClosed Principle
リスコフの置換原則
LSP:The Liskov Substitution Principle
インタフェース分離の原則
ISP:The Interface Segregation Principle
依存関係逆転の原則
DIP:The Dependency Inversion Principle
![Page 36: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/36.jpg)
プロセス、技法、パラダイム
オブジェクト指向プログラミング
関数プログラミング
ジェネリックプログラミング
アスペクト指向プログラミング
メタプログラミング
![Page 37: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/37.jpg)
プロセス、技法、パラダイム
マルチパラダイムデザイン
ジェネレーティブプログラミング
プロダクトライン
Software Factories
インテンショナルプログラミング
言語指向プログラミング
言語ワークベンチ
Lean Software Architecture
![Page 38: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/38.jpg)
プロセス、技法、パラダイム
レイヤ化アーキテクチャ
モデル・ビュー・コントローラ
DCI: Data, Context, and Interaction
![Page 39: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/39.jpg)
DDD+TDD=アメージング!
![Page 40: Symfony2でより良いソフトウェアを作るために](https://reader033.vdocuments.mx/reader033/viewer/2022060110/555a8f05d8b42a991b8b47ca/html5/thumbnails/40.jpg)
『エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践 ) 』、翔泳社、 2011年、 ISBN 9784798121963
[ 技術講座 ] DomainDriven Designのエッセンス 第 1回、 http://www.ogisri.co.jp/otc/hiroba/technical/DDDEssence/chap1.html
『アジャイルソフトウェア開発の奥義 第 2版 オブジェクト指向開発の神髄と匠の技』、ソフトバンククリエイティブ、 2008年、 ISBN 9784797347784
『ジェネレーティブプログラミング (IT Architects’Archive CLASSIC MODER) 』、翔泳社、 2008年、 ISBN 9784798113319
The Symfony2 Book, http://symfony.com/doc/current/book/index.html
参考