Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

47,221 views

Published on

Published in: Technology

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

  1. 1. 第 4 回 Symfony2 勉強会Symfony2 でより良いソフトウェアを作るために 株式会社アイテマン 久保敦啓 @iteman    
  2. 2.    
  3. 3. iteman 株式会社アイテマン 代表取締役 Piece Project プロジェクトリード Twitter @iteman    
  4. 4. Piece Framework PHP のアプリケーションフレームワーク オープンソースソフトウェア  New BSD License  Eclipse Public License    
  5. 5. 歴史 2005 Stagehand_TestRunner 2006 Piece_Unity, Piece_Flow 2009 MakeGood 2011 ???    
  6. 6. 良いソフトウェアとは?   
  7. 7. “ ソフトウェアの核心は、ドメインに関係した問題をユーザのために解決する能力である。”— エリック・エヴァンスのドメイン駆動設計    
  8. 8. Symfony2   
  9. 9. “Build your App, not your Tools.” —The Symfony2 Book   
  10. 10. Symfony2 の特徴 バンドル コンフィギュレーション サービスコンテナ (DI コンテナ ) 機能テスト 独立したドメインオブジェクト etc...    
  11. 11. バンドル モジュールシステムの構成単位 フィーチャの提供単位 クラス、コントローラ、 Web リソース等を 束ねたもの 外部のモジュールとの統合レイヤ セマンティックコンフィギュレーションの提供 他のバンドルの拡張の提供 自身のバンドルの拡張ポイントの提供    
  12. 12. バンドルの構成要素と依存関係Bundle Classes Controllers Web Resources Bundles Classes Other Resources    
  13. 13. バンドルの拡張 FrameworkBundle kernel.listener ...web_profiler.debug_toolbar assetic.request_listenerWebProfilerBundle AsseticBundle    
  14. 14. 既存のモジュールシステム PEAR パッケージ Phar Debian パッケージ OSGi バンドル etc...    
  15. 15. バンドル設計の原則 高い凝集度と低い結合度  一般的なモジュール設計の原則 パッケージ設計の原則 — アジャイルソフトウェア開発の奥義  再利用・リリース等価の原則など 6 つの原則 ドメインの概念 — エリック・エヴァンスのドメイン駆動設計    
  16. 16. サービスコンテナ Dependency Injection  依存関係逆転の原則 — アジャイルソフトウェア開発の奥義 コンポーネント間の疎結合化 テスタビリティの向上 コンポーネント構成知識の保存と可視化  軽量プログラミング言語における DI コンテナの価値    
  17. 17. 依存関係の逆転Client ClientServer Server Interface Server    
  18. 18. セマンティックコンフィギュレーション# 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" }    # ...    
  19. 19. トランスフォーメーションProblem Space Solution Space Parse Populate ---------- ---------- ---------- ---------- ------ Service ContainersSemantic  Service Configurations Definitions(YAML,XML,PHP) (Objects) ---------- ---------- Parse ---------- Service  ---------- Container ------ Configurations (YAML,XML,PHP)    
  20. 20. ドメイン特化言語 DSL:Domain Specific Languages 問題空間の言語 ドメインに特化した記法を持つ言語 言語ワークベンチ コンフィグレーション DSL 式 DSL, グラフィカル DSL    
  21. 21. ドメイン特化言語の開発 コンフィギュレーション DSL  YAML 式 DSL, グラフィカル DSL  言語ワークベンチ  Lexer/Parser Generators    
  22. 22. 機能テスト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);    }}    
  23. 23. テストの対象 ユーザ側からみた Web アプリの機能 機能に対するユースケースの粒度 ルーティング ページフロー 入力・出力 バリデーション    
  24. 24. 独立したドメインオブジェクト Pure PHP オブジェクト バリデーションや OR マッピングから の高い独立性 フレームワークからの影響を極小化    
  25. 25. “Build your App, not your Domain  Models.” —iteman   
  26. 26. なぜフレームワーク を使うのか?   
  27. 27. “ ソフトウェアの核心は、ドメインに関係した問題をユーザのために解決する能力である。”— エリック・エヴァンスのドメイン駆動設計    
  28. 28. ドメイン駆動設計DDD:Domain­Driven Design    
  29. 29. “ ドメインモデルをソフトウェア開発の中心にすえ、コードやコミュニケーションを常にドメインモデルと一体化させながら、ドメインモデルを反復的に深化させることでより価値の高いアプリケーションを生み出していこうとする考え方”—Domain­Driven Design のエッセンス    
  30. 30. ドメイン駆動設計の要点 ドメインモデルは、ドメイン知識を深めなが ら反復的( iterative )に深化させていく ドメインモデルが、開発者とドメイン知識を もつ人(ユーザ、専門家等)との間の共通言 語となるようにする ドメインモデルと実装コードとがきちんと対 応付けられるようにする —Domain­Driven Design のエッセンス    
  31. 31. 代表的なパターン ユビキタス言語 モデル駆動設計  ≠ オブジェクト指向  ドメイン特化言語 実践的モデラー    
  32. 32. ドメイン駆動設計を 実践するには?   
  33. 33. プロセス、技法、パラダイム アジャイルプロセス (Scrum, XP, …) テスト駆動開発 (TDD:Test­Driven Development) SOLID ビヘイビア駆動開発 (BDD:Behavior­Driven Development) リファクタリング    
  34. 34. 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    
  35. 35. プロセス、技法、パラダイム オブジェクト指向プログラミング 関数プログラミング ジェネリックプログラミング アスペクト指向プログラミング メタプログラミング    
  36. 36. プロセス、技法、パラダイム マルチパラダイムデザイン ジェネレーティブプログラミング プロダクトライン Software Factories インテンショナルプログラミング 言語指向プログラミング 言語ワークベンチ Lean Software Architecture    
  37. 37. プロセス、技法、パラダイム レイヤ化アーキテクチャ モデル・ビュー・コントローラ DCI: Data, Context, and Interaction    
  38. 38. DDD+TDD= アメージング!    
  39. 39. 参考 『エリック・エヴァンスのドメイン駆動設計 (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     

×