在模型视图控制器模式中,数据转换应该发生在哪里?
我有一个存储非常具体的数学数据的模型。我需要将这些数据转换为物理模拟器(只接受某种格式的数据),我想知道它的代码应该放在哪里?一般来说,将一个模型转换为另一种模型的代码放在哪里?
在模型视图控制器模式中,数据转换应该发生在哪里?
我有一个存储非常具体的数学数据的模型。我需要将这些数据转换为物理模拟器(只接受某种格式的数据),我想知道它的代码应该放在哪里?一般来说,将一个模型转换为另一种模型的代码放在哪里?
就个人而言,我喜欢将这段代码放在模型派生类型的构造函数中。这样,进行转换的代码就在需要使用它的类中。我发现这种组织代码的方式更容易理解、测试和维护。
使用你的例子,假设你有一个如下的类(你没有提到你使用的是什么语言,所以我将在 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
) 对象会将它们联系起来,这样当源因任何原因发生更改时,目标必须更改。
适配器将限制对适配器的更改,并且不会强制目标因源中的每次更改而更改。
希望这可以帮助。
这是我为 MVC Web 应用程序遵循的典型模式。来自网络的输入进入模型,然后控制器负责在调用业务层操作之前将网络模型转换为业务层模型。
为了防止控制器因转换代码而臃肿,我将在合适的时候将转换卸载到AutoMapper 。