2011-02-07 7 views
7

私は非コンピューティングのバックグラウンドから来ており、私はMVCの設計アプローチとフレームワークについて一般的に頭を下げることに苦労しています。私はコードを再利用し、ロジックからディスプレイを分離し、カプセル化とデカップリングを「取得」しますが、私はこれを知りません。Coldfusion、ページコントローラ上のフロントコントローラデザインの利点は何ですか?

現時点では、私は単純にイメージのための別々のサブフォルダ、つまりcfcsと_includesをすべてルートに置いています。すべてのデータベースとの対話はcfcs経由です。私はページの上部ですべての処理を行い、次にコメント行を表示し、その下にページレイアウトを表示します。

私が見てきたフレームワークのほとんどはフロントコントローラーを好むようですので、トップコントローラーMVCデザインの私の単純なバージョンは、cfcs、コントローラー、ビューのサブフォルダとなり、index.cfmの大きなswitch文

<cfif not IsDefined("URL.event")> 
    <cflocation url="index.cfm?event=home" addtoken="No"> 
</cfif> 

<cfswitch expression="#url.event#"> 
    <cfcase value="home"> 
     <cfinclude template="controllers/home.cfm"/> 
     <cfinclude template="views/home.cfm"/> 
    </cfcase> 
    <cfcase value="about"> 
     <cfinclude template="controllers/about.cfm"/> 
     <cfinclude template="views/about.cfm"/> 
    </cfcase> 
</cfswitch> 

..実際のところ、私はページコントローラーのデザインを教えてくれますか?私が書いたサイトのようなものでない限り、コントローラのロジックはビューに固有のものであることがわかります。コントローラが複数のビューに収まるか、複数のコントローラが1つのビューに出力できるようにはならないので、それらを分離する?

光がまだ私のために来ていない、どのポインタ?

答えて

4

「トップ」コントローラとは、アプリケーションへのリクエストの単一の入力ポイントである"front" controllerを意味します。 @bpanullaが書いたように、ほとんどのColdFusionフレームワークではこのデザインパターンが使用されます。これは、URL rewritingで特に興味深くなります。ここでは、URLを傍受し(domain.ext/i/am/friendly.ext)、それをindex.cfmのような標準ファイルにルーティングして、要求されたURLをパラメータ(多くの場合、リクエストヘッダー)にすることによって簡単になります。また、エイリアスやリダイレクトに適しているため、URLの変更が容易なサイトの再設計も可能です。

コントローラーに関しては、通常、特定のURLまたはURLパターンに密接に結合されています。コントローラーともっと疎結合することは可能ですが、実際には、それは複数のリファクタリングの後で緊急のプロパティであることがわかります。コントローラーの基礎となるべきものは、service layerへの1つ以上の呼び出しで、データベースと通信し、ビジネスプロセスを実行し、ステートフルエンティティなどを作成します。次に、コントローラーはサービスレイヤーの出力を受け取り、それらをどのようなメカニズムに配置します(たとえばeventオブジェクト)は、データをビューに渡すために使用されます。

これは、コントローラではなく再利用可能なサービスレイヤです。コントローラは、アプリケーションが動作するフレームワークを拡張したものに過ぎません。アイデアは、ビューとサービス層にほとんど影響を与えずにフレームワークを切り替えることができるということです。触れる必要のある部分はコントローラです。

サービスレイヤの特定のサービスオブジェクトは、複数のコントローラを処理できる必要があります。たとえば、ログインしたユーザーの情報をサイト上のウィジェットとして表示することを検討してください。コントローラによって異なるページが提供されるかもしれませんが、それぞれが同じサービスオブジェクトを呼び出して、ウィジェットをレンダリングするのと同じビューに与えられる可能性のあるユーザーデータを取得します。

更新:フロントコントローラメリット

  • セキュリティ:集中認証と承認。
  • i18n & l10n:要求に適切な言語パックを注入グローバル
  • プロセスオーケストレーション:あなたが仕事に戻ると進むボタンを望んでいないショッピングカート用マルチステップのチェックアウトプロセスを考える - すべてをルーティングすることにより、フロントコントローラを介して、あなたは強制することができるしているどのようなステップ(すなわち状態)
  • ログ&追跡:簡単に一つだけの場所で追加することによって、サイトにGoogle Analyticsのトラッキングや他の要求を追加し
  • の処理エラー:中央集中型の行動

は今、これらの項目の多くはまた、<cferror>Appplication.cfcを使用して行うことができますが、私はそれが簡単に一元ポイントを持つことがわかります。

役立ちリンク

+0

OKを完全にカプセル化されるように設計する必要があり、そのサービスレイヤことを受け入れること。しかし、URL書き換えの問題を除けば(Webサーバーではこれをやっていないと仮定します)、フロントコントローラーはページコントローラー上でどのような利点を提供しますか?それは私には、コントローラのページのトップの代わりにエディタで開く別のファイルのように見える、ページの一番下を見る。 – Saul

+0

@Saul:私の更新を見てください。 – orangepips

+0

そのMSDNは、特に、プロセスオーケストレーションと呼ばれるものの周りに良いです。それは私が複数ページのフォームで見つけた問題です。 – Saul

2

実際にあなたが書いたものでFusebox(http://www.fusebox.org/)の要点を実装しました。何も問題はありませんし、ColdFusionコミュニティのほとんどは何年も似たようなものを使用していました.Fuseboxは、数年前にModelGlue、Mach-II、次世代のCFフレームワークが登場しました。

私が指摘できることの1つは、コントローラへのアプローチ(.cfmファイル)は、オブジェクトメソッド呼び出しに向かう特定の引数を使用して、典型的なOODファッションでカプセル化を実際に強制しないということです。非常に厄介なものでなければ、時間の経過とともに、.cfmコントローラは、問題を解決するために振る舞いを変更する、文書化されていない多数のパラメータを蓄積する可能性があります。

さまざまなフレームワークを使用すると、アプリケーション、セッション、およびリクエストの特定のコード(onApplicationStart、onRequestEndなど)などの優れた機能も利用できます。しかし、あなたは簡単なApplication.cfcを通してそれらを得ることができます。

関連する問題