Skip to main content
第 4 回 Symfony2 勉強会




Symfony2 で
より良いソフトウェア
を作るために
                     株式会社アイテマン
                     久保敦啓
                     @iteman
                  
     
iteman
   株式会社アイテマン 代表取締役
   Piece Project プロジェクトリード
   Twitter @iteman




               
Piece Framework
   PHP のアプリケーションフレームワーク
   オープンソースソフトウェア
            New BSD License
            Eclipse Public License




                      
歴史
   2005 Stagehand_TestRunner
   2006 Piece_Unity, Piece_Flow
   2009 MakeGood
   2011 ???




                
良いソフトウェアとは?




     
“ ソフトウェアの核心は、
ドメインに関係した問題を
ユーザのために解決する能
力である。”
— エリック・エヴァンスのドメイン駆動設計


         
Symfony2




      
“Build your App,
    not your Tools.”
    —The Symfony2 Book




            
Symfony2 の特徴
   バンドル
   コンフィギュレーション
   サービスコンテナ (DI コンテナ )
   機能テスト
   独立したドメインオブジェクト
   etc...


                 
バンドル
   モジュールシステムの構成単位
   フィーチャの提供単位
   クラス、コントローラ、 Web リソース等を
    束ねたもの
   外部のモジュールとの統合レイヤ
   セマンティックコンフィギュレーションの提供
   他のバンドルの拡張の提供
   自身のバンドルの拡張ポイントの提供

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




Bundle        Classes          Controllers   Web Resources




   Bundles                  Classes           Other Resources




                         
バンドルの拡張

              FrameworkBundle



                      kernel.listener




                                                           ...
web_profiler.debug_toolbar      assetic.request_listener

WebProfilerBundle               AsseticBundle




                         
既存のモジュールシステム
   PEAR パッケージ
   Phar
   Debian パッケージ
   OSGi バンドル
   etc...




              
バンドル設計の原則
   高い凝集度と低い結合度
            一般的なモジュール設計の原則
   パッケージ設計の原則
    — アジャイルソフトウェア開発の奥義
            再利用・リリース等価の原則など 6 つの原則
   ドメインの概念
    — エリック・エヴァンスのドメイン駆動設計


                    
サービスコンテナ
   Dependency Injection
             依存関係逆転の原則
              — アジャイルソフトウェア開発の奥義
   コンポーネント間の疎結合化
   テスタビリティの向上
   コンポーネント構成知識の保存と可視化
             軽量プログラミング言語における
              DI コンテナの価値

                      
依存関係の逆転


Client              Client




Server         Server Interface




                    Server




           
セマンティックコンフィギュレーション
# app/config/config.yml
framework:
    secret:          xxxxxxxxxx
    charset:         UTF­8
    error_handler:   null
    form:            true
    csrf_protection: true
    router:        { resource: "%kernel.root_dir
%/config/routing.yml" }
    # ...




                    
トランスフォーメーション
Problem Space                                                Solution Space


                  Parse                        Populate
 ----------
 ----------
 ----------
 ----------
 ------
                          Service Containers

Semantic                                                     Service 
Configurations                                               Definitions
(YAML,XML,PHP)                                               (Objects)


                                               ----------
                                               ----------
                           Parse               ----------
                                                            Service 
                                               ----------   Container
                                               ------
                                                            Configurations
                                                            (YAML,XML,PHP)


                                
ドメイン特化言語
   DSL:Domain Specific Languages
   問題空間の言語
   ドメインに特化した記法を持つ言語
   言語ワークベンチ
   コンフィグレーション DSL
   式 DSL, グラフィカル DSL


               
ドメイン特化言語の開発
   コンフィギュレーション DSL
         YAML
   式 DSL, グラフィカル DSL
         言語ワークベンチ
         Lexer/Parser Generators




                  
機能テスト
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);
    }
}


                    
テストの対象

   ユーザ側からみた Web アプリの機能
   機能に対するユースケースの粒度
   ルーティング
   ページフロー
   入力・出力
   バリデーション


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

   Pure PHP オブジェクト
   バリデーションや OR マッピングから
    の高い独立性
   フレームワークからの影響を極小化




               
“Build your App,
    not your Domain 
     Models.”
    —iteman



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



       
“ ソフトウェアの核心は、
ドメインに関係した問題を
ユーザのために解決する能
力である。”
— エリック・エヴァンスのドメイン駆動設計


         
ドメイン駆動設計
DDD:Domain­Driven Design




         
“ ドメインモデルをソフトウェア
開発の中心にすえ、コードやコミュニ
ケーションを常にドメインモデルと一
体化させながら、ドメインモデルを反
復的に深化させることでより価値の高い
アプリケーションを生み出していこう
とする考え方”
—Domain­Driven Design のエッセンス
             
ドメイン駆動設計の要点
   ドメインモデルは、ドメイン知識を深めなが
     ら反復的( iterative )に深化させていく
   ドメインモデルが、開発者とドメイン知識を
     もつ人(ユーザ、専門家等)との間の共通言
     語となるようにする
   ドメインモデルと実装コードとがきちんと対
     応付けられるようにする
    —Domain­Driven Design のエッセンス


                 
代表的なパターン
   ユビキタス言語
   モデル駆動設計
      ≠ オブジェクト指向
      ドメイン特化言語


   実践的モデラー




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



       
プロセス、技法、パラダイム
   アジャイルプロセス (Scrum, XP, …)
   テスト駆動開発 (TDD:Test­Driven Development)
   SOLID
   ビヘイビア駆動開発 (BDD:Behavior­Driven Development)
   リファクタリング




                     
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
                     
プロセス、技法、パラダイム
   オブジェクト指向プログラミング
   関数プログラミング
   ジェネリックプログラミング
   アスペクト指向プログラミング
   メタプログラミング




                 
プロセス、技法、パラダイム
   マルチパラダイムデザイン
   ジェネレーティブプログラミング
   プロダクトライン
   Software Factories
   インテンショナルプログラミング
   言語指向プログラミング
   言語ワークベンチ
   Lean Software Architecture




                     
プロセス、技法、パラダイム
   レイヤ化アーキテクチャ
   モデル・ビュー・コントローラ
   DCI: Data, Context, and Interaction




                     
DDD+TDD= アメージング!




      
参考
   『エリック・エヴァンスのドメイン駆動設計 (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