Model View Controller パターンでは、どこでデータ変換を行う必要がありますか?
非常に具体的な数学的データを格納するモデルがあります。そのデータを物理シミュレーター (特定の形式のデータのみを受け入れる) 用に変換する必要があり、そのためのコードをどこに置くべきか疑問に思っています。一般に、あるモデルを別のタイプのモデルに変換するコードをどこに配置しますか?
Model View Controller パターンでは、どこでデータ変換を行う必要がありますか?
非常に具体的な数学的データを格納するモデルがあります。そのデータを物理シミュレーター (特定の形式のデータのみを受け入れる) 用に変換する必要があり、そのためのコードをどこに置くべきか疑問に思っています。一般に、あるモデルを別のタイプのモデルに変換するコードをどこに配置しますか?
個人的には、このコードをモデルの派生型のコンストラクターに入れるのが好きです。このように、変換を行うコードは、それを使用する必要があるクラスにあります。このようにコードを整理すると、理解、テスト、保守が容易になります。
あなたの例を使用して、次のようなクラスがあるとします(使用している言語について言及していないため、以下のコードをC#で提供しますが、Javaでも非常に似ています):
public class MathematicalData
{
//members of class
}
MathematicalData のインスタンスのメンバーを取得し、それらを PhysicsSimulator という名前の別のクラスに変換する必要があるとします。PhysicsSimulator のコンストラクターで、入力パラメーターとして MathematicalData のインスタンスを取得し、このコンストラクターに PhysicsSimulator のメンバーを設定する必要があります。
public class PhysicsSimulator
{
//constructor
public PhysicsSimulator(MathematicalData input)
{
//put code here to use the members of input to populate members of this instance of PhysicsSimulator
}
}
PhysicsSimulator のインスタンスを作成する唯一の方法が MathematicalData のインスタンスを使用することである場合、PhysicsSimulator の既定のコンストラクターは作成しません。このように、PhysicsSimulator を作成する唯一の方法は、MathematicalData インスタンスを渡すことです。
これを実現するには、アダプタインターフェイスを設計する必要があるように思われます。target(PhysicsSimulator
)のコンストラクターにsource()オブジェクトを受け入れさせると、MathData
何らかの理由でソースが変更されたときにターゲットを変更する必要があるように、両方が結び付けられます。
アダプタはアダプタへの変更を制限し、ソースの変更ごとにターゲットを強制的に変更することはありません。
お役に立てれば。
これは、MVCWebアプリで私が従う典型的なパターンです。Webからの入力がモデルに到達すると、コントローラーは、ビジネス層アクションを呼び出す前に、Webモデルをビジネス層モデルに変換する責任を負います。
コントローラが変換コードで肥大化するのを防ぐために、適切な場合はいつでも変換をAutoMapperにオフロードします。