Djangoアプリケーションを作成しているときに、ある種のジレンマに直面していますが、私が直面している問題は、MVCパターンに一般的に当てはまると思います。Question
クイズやアンケートの作成に使用できるモデルを作成しています。基本クラスはQuestion
、単純な無料回答の質問になります。多肢選択式の質問やスライディングスケールの質問など、さまざまな種類の質問をサポートしたいと思います。これらはQuestion
、可能な選択肢の配列などの追加フィールドが追加された基本クラスのサブクラスになります。将来、より多くのタイプの質問をサポートするように質問モデルを拡張できるようにしたいと思います。そのために、ポリモーフィズムに依存して、Question
のすべてのサブクラスのモデルレイヤーとビューレイヤーの間でタイプのオブジェクトを渡すことができますQuestion
。
私が直面している問題は、ビューをレンダリングするために、ビューが受け取った質問のタイプを認識している必要があることです。多肢選択問題が発生した場合は、ラジオ選択ウィジェットなどを描画する必要があります。したがって、モデルをより多くの種類の質問で拡張する場合は、モデルレイヤーとビューレイヤーの両方に追加する必要があります。Question
オブジェクトを受け取るビューは、受け取った質問のサブクラスタイプを常に知っている必要があるため、これはポリモーフィズムのポイントを打ち負かすようです。質問をモデルに戻す責任を委任することで、この問題を回避できます。Question
モデルにと呼ばれる仮想関数がある場合render_question()
そのサブクラスがオーバーライドすると、ビューレイヤーはその関数を呼び出して、質問のタイプを気にせずに適切なHTMLを出力できるようになります。しかし、HTMLレンダリングコードをモデルにバインドするという問題があります。
私が考えた解決策のどちらの欠点も持たない3番目の解決策はありますか?それとも、これは本当に難しい決断を下さなければならないジレンマですか?