我在哪里放置格式化逻辑?

时间:2010-08-26 22:34:34

标签: model-view-controller language-agnostic formatting

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

我同意Vivin的观点,你不应该为数据对象添加各种方法来处理每种可能的格式。让视图使用显示字符串是合适的。

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

public String getFormattedString(Formatter f);

输出显然是格式化的字符串。这将允许您为每个视图使用单个数字格式化程序,可以将其传递给每个不同的数据对象以进行格式化。

答案 1 :(得分:2)

IMO,格式化数据是一个视图问题。如果您使用的是JSTL,则可以使用<fmt:formatNumber>

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

我不喜欢选项3,因为它似乎正在为每种格式创建一个格式化类 - 由于选项1中确定的原因,这可能导致类爆炸。

我喜欢选项2.您可以将选项3的某些方面组合到选项2.您可以使用FormattingService获取数据和格式并返回格式化数据。您可以通过可在视图中使用的标记公开格式化方法。