Абстрагирование форматирования данных интерфейса

У меня есть некоторые объекты, которые имеют десятичные свойства на них. Свойства этих объектов отображаются в нескольких местах по всему моему интерфейсу.

В настоящее время я занимаюсь:

litWeight.Text = person.Weight.ToString("0.00");

повсюду. Теперь я точно знаю, что в некоторых случаях и с подозрением ко многим другим, что клиент, скорее всего, захочет получить значения 3d.p. в будущем.

Есть ли какой-нибудь шаблон, который я могу использовать для обработки форматирования этого свойства Weight (и других свойств; не только десятичных, возможно, дат и т. Д.), Чтобы у меня было это форматирование в одном месте?

Я знаю, что можно использовать строку форматирования в webconfig или написать несколько методов расширения в пользовательском интерфейсе, но это не очень элегантные решения.

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

Спасибо,

Эндрю

10.12.2008 11:49:11
3 ОТВЕТА
РЕШЕНИЕ

Простейшим решением было бы создать служебный класс со статическими методами, которые соответствующим образом форматируют различные типы значений и вызывают их. Например:

litWeight.Text = Utility.FormatWeight(person.Weight);
2
10.12.2008 12:07:38

Разве вы не можете добавить метод к объектам для форматирования тем? Затем каждый объект может делегировать объекту «стратегия», чтобы выполнить фактическое форматирование.

Причиной этого является возможность изменения десятичных разрядов и т. Д., Но также и возможность интернационализации - десятичное форматирование зависит от локали; некоторые страны используют десятичные запятые вместо точек или групповые цифры в наборах, отличных от тройки и т. д.

РЕДАКТИРОВАТЬ: Комментарий был, это помещает код представления в слой домена. Верно, поэтому примените стандартное исправление для всех проблем проектирования; добавить еще один слой косвенности :)

Возможно, вы не захотите иметь полный MVC, но концепция View и Model все еще кажется подходящей. Возможно, для каждой сущности определите класс View, чтобы PersonView сохранял ссылку на объект Person и имел свойства format_weight и т. Д. Для каждого интересующего его свойства Person? Он все еще должен использовать шаблон стратегии для фактического форматирования.

Таким образом, ваш пример будет

PersonView pv = new PersonView(person)

litWeight.Text = pv.format_weight();

(прошу прощения за синтаксические ошибки, я не говорю на C #)

Если вы хотите, вы можете сделать так, чтобы PersonView заменил Person, либо переопределив методы / свойства и разделив его на Person, на который ссылаются, либо унаследовав от Person при создании PersonView?

1
10.12.2008 13:31:03
Да, но потом я помещаю код уровня представления в слой домена, что не очень приятно
Andrew Bullock 10.12.2008 12:16:37
Да, я думал, что декоратор, но я бы не стал делегировать все, и наследование не вариант. Кроме того, я не хочу оборачивать каждую сущность только для того, чтобы ее можно было визуализировать. Может быть, я в конечном итоге сделаю это таким образом, я просто не могу не чувствовать, что есть лучшее решение там ...
Andrew Bullock 10.12.2008 15:29:13
Если Weight (например) не является концепцией, которая стоит моделировать себя как класс, то в конечном итоге мне кажется, что у вас есть только два варианта - расширить класс Person некоторым способом, чтобы узнать, как форматировать веса, или предоставить статический набор функции форматирования, которые умеют. Больше негде его поставить?
The Archetypal Paul 10.12.2008 15:36:15

Вы можете создать очень простой пользовательский элемент управления - производный от метки или подобного, - который отвечает исключительно за отображение строки весов, поэтому у вас есть:

weightValue.DisplayValue(person.Weight);

и установщик форматирует десятичное число как требуется. Если это используется всякий раз, когда вы отображаете вес, то вам нужно всего лишь изменить пользовательский элемент управления, чтобы изменить все отображения веса.

Базовая версия может быть:

public void DisplayValue(decimal weight)
{
    this.Text = weight.ToString("0.00");
}
1
10.12.2008 15:31:23
Мне нравится эта идея. Я думаю, что я бы расширил WebControl, присвоил ему свойство десятичного веса и поместил форматирование в OnRender (). Я всегда использую литерал во всех местах, где я имел в виду его использование, поэтому UC является возможным решением :)
Andrew Bullock 10.12.2008 15:35:18