【问题标题】:MVC - Data transformation from one model to another?MVC - 从一个模型到另一个模型的数据转换?
【发布时间】:2012-12-13 22:40:21
【问题描述】:

在模型视图控制器模式中,数据转换应该发生在哪里?

我有一个存储非常具体的数学数据的模型。我需要将这些数据转换为物理模拟器(只接受某种格式的数据),我想知道它的代码应该放在哪里?一般来说,将一个模型转换为另一种模型的代码放在哪里?

【问题讨论】:

  • 您在构建企业应用程序吗?
  • @BhushanFirake 我正在集成两个应用程序

标签: oop model-view-controller transformation ooad object-oriented-analysis


【解决方案1】:

就个人而言,我喜欢将这段代码放在派生类型模型的构造函数中。这样,进行转换的代码就在需要使用它的类中。我发现这种组织代码的方式更容易理解、测试和维护。

使用你的例子,假设你有一个如下的类(你没有提到你使用的是什么语言,所以我将在 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 实例。

【讨论】:

  • 你是不是打算在最后一句话中说“我不会为 PhysicsSimulator 创建默认构造函数”?
  • 糟糕,我不小心输入了错误的类。谢谢丹尼斯指出这一点。我更正了帖子。
  • 我喜欢这个建议。创建一个继承自 PhysicsSimulator 的名为“MathDataBasedPhysicsSimulation”的新类并保持 PhySim 类不变是否不利?
  • 当然,如果需要,您可以继承 PhysicsSimulator 类。在子类中,您还可以有一个需要 MathematicalData 输入参数的构造函数。如果要复用 PhysicsSimulator 基类中的代码,可以从子类构造函数中调用基类构造函数。
【解决方案2】:

在我看来,您需要设计一个适配器接口来实现这一点。使目标 (PhysicsSimulator) 的构造函数接受源 (MathData) 对象会将它们绑定在一起,这样当源因任何原因发生更改时,目标改变。

适配器将限制对适配器的更改,并且不会强制目标因源中的每次更改而更改。

希望这会有所帮助。

【讨论】:

  • 谢谢,我不确定我是否理解。为什么当 MathData 改变时 PhysicsSimulator 必须改变?因为我们需要更新构造函数?在其他情况下,我们不需要更改适配器吗?
  • 你是对的@ArthurWulfWhite,适配器必须改变。但是,由于您正在集成两个应用程序,我假设它们都有自己的客户端。仅仅因为MathData 的改变而改变PhysicsSimulator 的构造函数将迫使PhysicsSimulator 的所有客户端改变他们使用它的方式(从客户端的角度来看没有明显的原因)。由于适配器公开了PhysicsSimulator 使用的接口,对适配器的更改对PhysicsSimulator 的客户端变得透明。希望我回答了你的问题。
  • 我现在明白了,这是一个有趣的见解@Sudarshan Shubakar
【解决方案3】:

这是我为 MVC Web 应用程序遵循的典型模式。来自网络的输入进入模型,然后控制器负责在调用业务层操作之前将网络模型转换为业务层模型。

为了避免控制器因转换代码而臃肿,我将在合适的时候将转换卸载到AutoMapper

【讨论】:

  • 我不太明白您在第一段中的建议,但 AutoMapper 是一个很好的建议。
  • 这不是“Web MVC”,它只是 Rails 方式。
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多