Где я могу поставить логику форматирования? - PullRequest
3 голосов
/ 27 августа 2010

У меня есть несколько классов с необработанными данными, например:

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

Мне нужно вывести отформатированные версии этих данных в нескольких местах. Например, я могу отобразить сумму как $1,000 на веб-странице или 1000.00 при загрузке в Excel. Я также хочу иметь возможность повторно использовать один и тот же код форматирования в разных местах. Некоторые из них будут простыми (например, отображение даты в определенном формате), но некоторые будут более сложными (например, отображение разных значений для одного поля в зависимости от значения другого поля).

У меня вопрос: куда мне поместить код форматирования? Я могу придумать несколько мест:

  • Добавить методы к объекту данных, такие как getAmountHTML() или getAmountExcel(). Удобно, но делает ли это модель и вид слишком тесно связанными?

  • Выполните форматирование в шаблоне при отображении данных. Гибкий, но так как его нет в методе, я не могу легко использовать одно и то же форматирование в разных местах.

  • Создайте класс форматирования для каждого класса данных и дайте ему ссылку на исходный объект данных.

У меня будет много объектов данных для форматирования, поэтому я хотел бы предложить хороший подход. Есть ли у кого-нибудь опыт, которым можно поделиться?

Ответы [ 2 ]

4 голосов
/ 27 августа 2010

Я согласен с Vivin, что вам не следует добавлять различные методы в ваш объект данных для обработки всех возможных форматов.Имея вид, различают отображаемую строку.

Другой имеющейся у вас опцией, которая позволяет представлению определять форматтер, является использование своего рода шаблона Visitor.Здесь ваш Transaction объект получает средство форматирования в качестве параметра нового метода:

public String getFormattedString(Formatter f);

Вывод, очевидно, является отформатированной строкой.Это позволило бы вам иметь единый числовой форматер для каждого представления, который можно было бы передать каждому другому объекту данных для форматирования.

2 голосов
/ 27 августа 2010

IMO, форматирование данных вызывает беспокойство.Если вы используете JSTL, вы можете использовать <fmt:formatNumber>.

Мне не нравится вариант 1, потому что это означает, что вы вкладываете заботы о представлении в свой объект домена.Там есть потенциал для взрыва метода (что если вы получите 5 новых форматов - вы собираетесь создать метод для каждого из них?).

Мне тоже не нравится вариант 3, потому что кажется, что вы 'создание класса форматирования для каждого формата - это может привести к взрыву класса по причинам, указанным в варианте 1.

Мне нравится вариант 2. Вы можете объединить некоторые аспекты варианта 3 в вариант 2. У вас может бытьFormattingService, который принимает данные и формат и возвращает отформатированные данные.Вы можете выставить метод форматирования через тег, который вы можете использовать в своем представлении.

...