2010-08-26 56 views
3

我有几类原始数据,例如:我在哪里放置格式化逻辑?

public interface Transaction { 
    public double getAmount(); 
    public Date getDate(); 
} 

我需要在几个地方该数据的输出格式的版本。例如,我可能在网页上显示金额为$1,000,或在Excel下载中显示金额为1000.00。我也希望能够在不同的地方重复使用相同的格式代码。其中一些会很简单(例如以某种格式显示日期),但有些会更复杂(例如根据另一个字段的值显示一个字段的不同值)。

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

  • 方法添加到数据对象像getAmountHTML()getAmountExcel()。方便,但它是否使模型和视图密切相关?

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

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

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

回答

2

IMO,格式化数据是一个观点关注。如果您使用的是JSTL,则可以使用<fmt:formatNumber>

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

我不喜欢的选项3可能是因为它似乎正在创建每种格式格式化类 - 这可能会导致爆炸类中选择确定的原因1.

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

4

我同意Vivin,你不应该添加各种方法到你的数据对象来处理每一个可以想象的格式。使视图与显示字符串相符是适当的。

您拥有的另一个选项仍然允许视图定义格式化程序,即使用某种访问者模式。在这里,您Transaction对象接收到一个格式化的参数去的新方法:

public String getFormattedString(Formatter f); 

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

+0

+1我喜欢这样 - 不知道游客模式! – 2010-08-27 16:16:34

+0

您是否认为数据对象只是将格式委派给Formatter - 或者他们是否有一些自己的格式代码?你不想为每个你想要格式化的领域需要这些方法之一吗?只是想了解你的想法。 – 2010-08-30 17:43:50