У меня есть некоторые объекты, которые имеют десятичные свойства на них. Свойства этих объектов отображаются в нескольких местах по всему моему интерфейсу.
В настоящее время я занимаюсь:
litWeight.Text = person.Weight.ToString("0.00");
повсюду. Теперь я точно знаю, что в некоторых случаях и с подозрением ко многим другим, что клиент, скорее всего, захочет получить значения 3d.p. в будущем.
Есть ли какой-нибудь шаблон, который я могу использовать для обработки форматирования этого свойства Weight (и других свойств; не только десятичных, возможно, дат и т. Д.), Чтобы у меня было это форматирование в одном месте?
Я знаю, что можно использовать строку форматирования в webconfig или написать несколько методов расширения в пользовательском интерфейсе, но это не очень элегантные решения.
Было бы неплохо иметь некоторые объекты форматирования, которые привязаны к моим объектам, поэтому очевидно, какой форматтер использовать.
Спасибо,
Эндрю
Простейшим решением было бы создать служебный класс со статическими методами, которые соответствующим образом форматируют различные типы значений и вызывают их. Например:
litWeight.Text = Utility.FormatWeight(person.Weight);
Разве вы не можете добавить метод к объектам для форматирования тем? Затем каждый объект может делегировать объекту «стратегия», чтобы выполнить фактическое форматирование.
Причиной этого является возможность изменения десятичных разрядов и т. Д., Но также и возможность интернационализации - десятичное форматирование зависит от локали; некоторые страны используют десятичные запятые вместо точек или групповые цифры в наборах, отличных от тройки и т. д.
РЕДАКТИРОВАТЬ: Комментарий был, это помещает код представления в слой домена. Верно, поэтому примените стандартное исправление для всех проблем проектирования; добавить еще один слой косвенности :)
Возможно, вы не захотите иметь полный 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?
Вы можете создать очень простой пользовательский элемент управления - производный от метки или подобного, - который отвечает исключительно за отображение строки весов, поэтому у вас есть:
weightValue.DisplayValue(person.Weight);
и установщик форматирует десятичное число как требуется. Если это используется всякий раз, когда вы отображаете вес, то вам нужно всего лишь изменить пользовательский элемент управления, чтобы изменить все отображения веса.
Базовая версия может быть:
public void DisplayValue(decimal weight)
{
this.Text = weight.ToString("0.00");
}