我有几个包含原始数据的类,例如:
public interface Transaction {
public double getAmount();
public Date getDate();
}
我需要在几个地方输出这些数据的格式化版本。例如,我可能会在网页上显示金额为$1,000
,或在Excel下载时显示1000.00
。我还希望能够在不同的地方重用相同的格式代码。其中一些很简单(比如以某种格式显示日期),但有些会更复杂(比如根据另一个字段的值显示一个字段的不同值)。
我的问题是:我应该在哪里放置格式代码?我可以想到几个地方:
向数据对象添加方法,如getAmountHTML()
或getAmountExcel()
。方便,但它是否使模型和视图过于密切相关?
显示数据时,在模板中进行格式化。灵活,但由于它不在方法中,我不能轻易地在不同的地方重复使用相同的格式。
为每个数据类创建一个格式化类,并为其提供对原始数据对象的引用。
我将要有很多数据对象要格式化,所以我想提出一个好的方法。是否有人有相关经验可以分享?
答案 0 :(得分:4)
我同意Vivin的观点,你不应该为数据对象添加各种方法来处理每种可能的格式。让视图使用显示字符串是合适的。
您拥有的另一个选项(仍允许视图定义格式化程序)是使用一种访问者模式。在这里,您的Transaction
对象接收格式化程序作为新方法的参数:
public String getFormattedString(Formatter f);
输出显然是格式化的字符串。这将允许您为每个视图使用单个数字格式化程序,可以将其传递给每个不同的数据对象以进行格式化。
答案 1 :(得分:2)
IMO,格式化数据是一个视图问题。如果您使用的是JSTL,则可以使用<fmt:formatNumber>
。
我不喜欢选项1,因为这意味着您将视图关注点放入域对象中。那里有方法爆炸的可能性(如果你得到5种新格式,你会为每种格式创建一种方法吗?)。
我不喜欢选项3,因为它似乎正在为每种格式创建一个格式化类 - 由于选项1中确定的原因,这可能导致类爆炸。
我喜欢选项2.您可以将选项3的某些方面组合到选项2.您可以使用FormattingService
获取数据和格式并返回格式化数据。您可以通过可在视图中使用的标记公开格式化方法。