IRC から質問をここに移動します。
問題: 良い形にしたいコード ベースに飛び込んでしまいました。私たちはいつもそうではありませんか?
その精神で、(テスト カバレッジのように) いくつかのカバレッジを追加した後、このタスクを支援するためにいくつかの既知のリファクタリング/改善を適用しました。これが私がやったことです(実際にはもっと多くのことをしましたが、これらは私の質問に関連するビットです):
- モデル、コントローラー、さらにはビューで実行されるいくつかのタスクをオフロードするために、いくつかの PORO オブジェクトを追加しました。
- *decent_exposure* を使用して、ビュー レイヤーがあったインスタンス変数地獄を取り除きました。
- ビューに多くのロジックが含まれないように、draperを使用していくつかの for-views デコレーターを実装しました。
- 複数のモデルを生成するアクションのプレゼンターを追加しました。
今、私は(楽観的に)これがすべてうまくいくと予想していました. それは実際には優れていますが、台所の流し以外をすべて投げた後、私はそれがはるかに優れていると期待していました. そうではありません。
文字通り 1 回のアクションで 10 ~ 15 個のパーシャルをレンダリングするビュー レイヤーがあるため、コントローラーまたはビュー レイヤーで何かを変更できるか心配です。アカウントのメンバーを「メンバー」または単に「ユーザー」と呼ぶことにしたときはいつでも、このすべてのパーシャルを実行したくありません。モデルレイヤーはもっと大きな変更が予定されているので、これは気にしています。
私が最初に考えた(そして今でも立っている)のは、愚かな見方をすることです。ビューレイヤーの大部分で、レンダリングしているモデルについてまったく知らないようにしたいのです。モデルから必要なデータを抽出し、HTML をレンダリングするという 2 つのことを行う方法を知っている中間オブジェクトが必要です。ここで SRP に違反していると言う前に、このオブジェクトの本当の責任は、「モデルをエンド ユーザーに表示すること」と読むことができます。
過度に単純化して、私の意見 (少なくともこれらの前述のもの) を次のようにしたいと思います。
= some_object.render
= another_object.render
デコレータ パターンのように聞こえますし、プレゼンター パターンのようにも聞こえますが、少なくともこれは私が経験したことです。
それから、私は MVC (少なくとも Rails が公開する MVC) から大きく逸脱するだろうと考え始めたので、これが最善の解決策であるかどうかを知りたいと思いました (この時間制約では明らかでほとんど不可能な REWRITE 以外)。 、だから私はショットを作ることにもっと自信があります。
したがって、その文脈で、私の本当の質問は次のように要約されます。
a) MVP、MVVM、MV への切り替えは、この問題の適切な解決策ですか?
b) そうである場合、この some_object.render ビュー スタイルに使用できる最適なソリューションについて教えていただけますか?
c) そうでない場合、大幅に書き直されるのに数時間かかる可能性のあるモデル レイヤーを使用して、一般に、これらのパーシャルとビューの間の強い依存関係を回避する方法を教えてもらえますか?
d) あなたがここに来ないことを願っています: YAGNI, 後で修正しますか? 私はそれが必要になると確信しています。
私の頭をよぎり、IRC に持ち込んだ別のオプションがあります。実際には、タイトルの精神ではなく、有効なオプションです (目の前のタスクにはやり過ぎだと思いますが)。
e)サービスレイヤーを追加し、ビューをそのサービスレイヤーの「論理」モデルにマップして、ビューとは無関係に物理モデルを変更できるようにします。