2012-01-13 7 views
0

私はいくつかのコントローラの一番上に同じコードを置いていることに気付きました。出力フィールドの説明、コントローラまたはモデルはどこに置くべきですか?

これはコントローラー内のいくつかの異なるアクションから呼び出すことにしますが、一般的にコントローラー外ではありません。プロパティにアクセスします。それはメソッドを呼び出します。不透明なオブジェクト(日付のようなもの)をフォーマットします。

私の質問は:このコントローラコード、またはモデルコードですか?

コントローラの場合:

  • それは私のAPIを定義します。
  • 現在、このモジュールでのみ使用されています。
  • ここには論理がないようです。

モデルの場合:

  • それはモデルが担当すべきデータの記述、のように思えます。
  • 他のコントローラでこれを使用したいと思うかもしれません。まだそこにはいないが、これらの機能はまだかなり新しいので、そうかもしれない。
  • 明確に属するオブジェクトに関数をアタッチすることは、モジュールレベルの関数として残すよりも優れているようです。
  • モデルでより簡潔に定義できます。最上位のモデルオブジェクトを持つようなものが.description()を定義し、サブクラスはプロパティの黒/ホワイトリストを定義するだけでなく、メソッド自体をオーバーライドして関数を呼び出すようにします。私はコードの行数が少なくなることを確信しています('name': app.nameのようなものの繰り返しを節約するため)。これは良いことのようです。
+0

本当の問題は、MVCはウェブ開発にはあまり適していないということです。 – plaes

答えて

0

私は最終的に決めた答え:これらのメソッドを持つ短期的には

は、コントローラで結構です。彼らが出力を定義すればOK、彼らはそこにとどまることができます。それらはモデルでのみ使用されます。

は、彼らが育ってきた指示に注意するカップルの事を、theresの、および他の場所に行く必要があります:1の場合

  • 、私はオブジェクトの標準的な直列化へのアクセスを必要としていました。その時点で、モデルメソッドとしてモデルに移動しました。
  • 別のケースでは、私はすべてのタイムスタンプを同じようにフォーマットしていました。私はセットContent-Typeのようなものを行う標準@ajaxifyデコレータを持っています、JSONエンコーディングなどこの場合、日時の標準フォーマットをそこに移しました。JSONエンコーダがdatetime(以前は直列化不可)にヒットしても、常に同じもの(エポックからの秒数)が処理されます。
  • さらに3番目のケースでは、私はいくつかのコントローラでこの機能を再利用していることに気付きました。そのために、私はそれを一般的なクラス(別の答えが示唆したように)に引き出し、それを使って "Web API"を定義しました。私は以前このパターンを使用していました。同様に使用されるデータ(timeseriesデータや上位Nリストのような)をグループ化することは意味があります。

私は彼らが最初であると思ったより多くが、しかし基本的に、私はすべて類似しているとは思わない。私は現在、小規模なコードベースの単純なオブジェクトのコンベンションとしてそれらについて考えています。繰り返しを数回行うと、より良い解決策が提示される可能性があることを理解しています。その間、彼らはコントローラにとどまり、私のAJAXy-JSON専用インターフェイスを定義します。

0

ない、使用しているフレームワークを確認してください、私は独自のクラスでは、このヘルパー機能を作成示唆とlib/

のような共有フォルダにそれを置く代わりに、あなただけのアプリケーションヘルパーモジュールを持つことができますこれらの有用なアプリケーション全体の機能の束を持っています。

いずれにしても、モデルとコントローラの両方から離してください。

+0

私はそれらを両方の場所から引き離すことは意味をなさないと思います。そのモジュールでしか使用されていないので、私は今コントローラーを去り、コードを再訪問するたびにそのロジックで何をしようとしているのか心配することに決めました。あなたの考えに感謝します。 –

+0

もう一度考えてみましょう:私たちは間違いなくlibに独自のモジュールを持っているいくつかの出力フォーマットコードを持っています。これらの関数を複数のコントローラで使用する必要がある場合、Web APIの書式設定用に別途定義されたモジュールを使用することは非常に意味があります。 –

関連する問題