Model view controller 我应该把格式化逻辑放在哪里?

Model view controller 我应该把格式化逻辑放在哪里?,model-view-controller,language-agnostic,formatting,Model View Controller,Language Agnostic,Formatting,我有几个包含原始数据的类,例如: public interface Transaction { public double getAmount(); public Date getDate(); } 我需要在几个地方输出这些数据的格式化版本。例如,我可能在网页上显示金额为$1000,或在Excel下载中显示金额为1000.00。我还希望能够在不同的地方重用相同的格式化代码。其中一些比较简单(如以特定格式显示日期),但有些比较复杂(如根据另一个字段的值为一个字段显示不同的值) 我的问

我有几个包含原始数据的类,例如:

public interface Transaction {
   public double getAmount();
   public Date getDate();
}
我需要在几个地方输出这些数据的格式化版本。例如,我可能在网页上显示金额为
$1000
,或在Excel下载中显示金额为
1000.00
。我还希望能够在不同的地方重用相同的格式化代码。其中一些比较简单(如以特定格式显示日期),但有些比较复杂(如根据另一个字段的值为一个字段显示不同的值)

我的问题是:我应该把格式化代码放在哪里?我可以想到几个地方:

  • 向数据对象添加方法,如
    getAmountHTML()
    getAmountExcel()
    。方便,但这是否会使模型和视图的关系过于密切

  • 显示数据时,在模板中进行格式化。灵活,但由于它不在方法中,我无法在不同的地方轻松重用相同的格式

  • 为每个数据类创建一个格式化类,并为其提供对原始数据对象的引用


我将有很多数据对象需要格式化,所以我想提出一个好的方法。是否有人有相关经验可供分享?

在我看来,格式化数据是一个值得关注的问题。如果您使用的是JSTL,那么可以使用

我不喜欢选项1,因为这意味着您正在将视图关注点放入域对象中。这里有一个方法爆炸的可能性(如果你得到5种新格式,你会为每种格式创建一个方法吗?)

我也不喜欢选项3,因为您似乎正在为每种格式创建一个格式化类-这可能会导致类爆炸,原因如选项1所示


我喜欢选择2。您可以将选项3的某些方面合并到选项2中。您可以有一个
FormattingService
,它接受数据和格式并返回格式化数据。您可以通过在视图中使用的标记公开格式化方法。

我同意Vivin的观点,即您不应该向数据对象添加各种方法来处理所有可能的格式。让视图定义显示字符串是合适的

您还有另一个选项,它仍然允许视图定义格式化程序,那就是使用一种访问者模式。这里,您的
事务
对象接收一个格式化程序作为新方法的参数:

public String getFormattedString(Formatter f);

输出显然是一个格式化字符串。这将使每个视图都有一个单独的数字格式化程序,可以传递给每个不同的数据对象进行格式化

您是否认为数据对象只会将格式化委托给格式化程序,或者它们会有自己的格式化代码?对于每个要格式化的字段,您不需要这些方法中的一种吗?只是想了解你的想法。