jasagiri @ ウィキ

Foundations と Layers

最終更新:

jasagiri

- view
管理者のみ編集可
Foundations And Layers
Waves での Layer はアプリケーションの代表的な特徴を加えたり変更したりするモジュールです。Foundation は Layer 無しでもアプリケーションを実行することができるあらゆる Layer です。

もしあなたがチュートリアルや他の記事を試したなら、もっとも単純な Foundation は Compact だとわかると思います。:

 require 'foundations/compact'
 module TeaTime
   include Waves::Foundations::Compact
 end

Noice the require ステートメントで … one nice thing about Layers is that, by convention, Layers に置くことができることはコアフレームワークには含まれていません。 (i.e., require 'waves' のとき何を得ますか)。あなたは使うということに代価を払うだけです。

Looking Inside A Foundation
Foundation がどのように動作するか Classic Foundation を見てみましょう。

 module Waves
   module Foundations
     module Classic
       def self.included( app )
         require 'autocode'
         require 'layers/mvc'
         require 'layers/inflect/english'
         require 'helpers/extended'
         require 'layers/renderers/erubis'

モジュールの読み込まれたメソッドを上書きして必要とするすべてのコードが要求されるのがわかります。お分かりのように、 Autocode (コード再読み込み), MVC, inflection サポート, view ヘルパ, ERb は Waves のコアデザインに含まれていません。

 app.module_eval do

   include AutoCode

   app.auto_create_module( :Configurations ) do
     include AutoCode
     auto_create_class :Default, Waves::Configurations::Default
     auto_load :Default, :directories => [ :configurations ]
   end

次にアプリケーションモジュールの module_eval を呼びます。AutoCode 定義をセットアップし始めます。 This one says, 「もし Default 構成が存在しないなら, ファイルから読み込もうとし、失敗したら Waves の既定に基づいて作成します。」

他にもこのような宣言はたくさんありますが、ここでは立ち入りません。基本的に、これらはアプリケーションのためにコード再読み込みと必要になったときの生成コンベンションをセットアップしています。もう少し見ると、異なった慣習の独自の Foundation を作れるようになるでしょう。

特徴を見ていきましょう。

 app.auto_eval( :Resources ) do
   auto_create_class true, app::Resources::Default
   auto_load true, :directories => [ :resources ]
   auto_eval :Map do

     handler( Waves::Dispatchers::NotFoundError ) do
       app::Views::Errors.new( request ).not_found_404
     end

   end
 end

ここでは リソースのコード再読み込み / 必要になったときの生成コンベンションをセットアップするだけでなく、NotFoundErrors の既定のエラーハンドラを追加し、アプリケーションの view に not_found_404 を描写させます。

次に、別の Layers を加え、順番に実行します。:

 include Waves::Layers::Inflect::English
 include Waves::Layers::MVC
 include Waves::Renderers::Erubis   


Layers That Modify Waves
たった3行で、inflection サポート、 MVC サポート、 ERbスタイルのテンプレートエンジンを加えました。すごい。 さて、続けましょう。 MVC Layer は何をするでしょう?

 module Waves
   module Layers
     module MVC

       def self.included( app )

         require 'layers/mvc/extensions'
         require 'layers/mvc/controllers'

Again,アプリケーションモジュールに含まれているメソッドを定義する身近なパターンを確認でき、新しいコードが読み込まれる時、この Layer が必要になるでしょう。一旦ここでとまって、 layers/mvc/extensions が何をするか一通り見てみましょう。

 module Waves
   module Resources
     module Mixin
       def controller( resource = nil )
         resource ||= self.class.basename
         @controller ||= app::Controllers[ resource ].new( @request )
       end
       def view( resource = nil )
         resource ||= self.class.basename
         @view ||= app::Views[ resource ].new( @request )
       end
     end
   end

Woah. Waves を再起動して要素を加えましょうか。 Yep. これは Layer がするように完全に決まっています。 ここで MVC Layer はアプリケーションにResources へアクセスするためのcontrollerとviewヘルパメソッドを加えます。 Further down, もっと面白いものを見ることができます。


Layer And Foundation Etiquette
Layer のための基本的なルールはかなり簡単です。:含まれるフックを定義して、 要求される必要なコードを追加し、アプリケーションモジュールや Waves 自身さえも変更して新しい機能を取り入れてください。

Foundation のルールはほんのちょっと複雑です、Foundation は基本的に保障されているので アプリケーションを実行するのには十分です。

基本的に、 Foundation はアプリケーションの Configurations モジュールを定義しなくてはならず、その中で、configuration クラスはあなたが実行するどんな構成にも対応します。 (慣習で、waves server コマンドが既定オプションなので少なくとも Development 構成を提供しなくてはなりません。)。

また、アプリケーションのために Resources モジュールを定義する必要があり、そして、その中で、アプリケーションリソースとして構成するために少なくとも1つの Resource クラスが参照されます。

Future Enhancements
Waves の Layers には将来のリリースでいくつかの改良を予定しており、 開発者が Layers を簡単に作成するのを助ける多くのものを含んでいます。また Layers 開発者ガイドも作成する予定です。

Layers Are Just Modules
Leyers の美しさの肝は単なる Ruby モジュールということで、特徴を mixin するためには標準の Ruby フックを使います、今回はたまたまアプリケーションだということです。 「plug-in」 や 「component」インタフェースはまったく必要ありません。
記事メニュー
目安箱バナー