Properties vs Convertors

Привет всем кто спит, кто уже не спит и кто еще не спит (как я). Сегодня в очередной раз хотим поговорить о Windows Phone и Silverlight.

Недавно в очередной раз возник вопрос, что лучше использовать, дополнительные свойства или конверторы. Аргументами были производительность, расход памяти, удобство. В этот раз решили опять забить расставить все точки над и. Написали небольшой тест, в котором биндим большое количество элементов через свойства и конверторы.

Представьте себе следующий случай, где есть класс, описывающий пользователя:

public class UserInfo
{
	public string Name { get; set; }
	public int Age { get; set; }
}

Допустим нам по требованиям необходимо вывести большой список пользователей в указанном в спецификации формате «Name = {Name} is {Age} years old». Тут у нас есть два варианта:

1. Использовать новое свойство, которое нужным нам образом вернет данные:

public string ShortInfo
{
	get
	{
		return string.Format("Name = {0} is {1} years old", Name, Age);
	}
}

2. Создать новый конвертер, специфический для этого случая, и сгенерировать текст там:

public class ShortInfoConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
	{
		var info = ((UserInfo)value);
	return string.Format("Name = {0} is {1} years old", info.Name, info.Age);
	}
...
}

Хватит слов, больше дела. А лучше цифр. Генерируем 10,500,2к,10к элементов и биндим к ItemsControl. Получаем (время и память в зависимости от количества элементов, красная колонка завершалась с OutOfMemory):

 

Что тут можно сказать? Правильно, разницы нет. Значит смотрим лишь на:

  1. правильную архитектуру (не нужно засорять сущности всякими UI  наростами)
  2. удобство написания кода (тут в зависимости от количества таких свойств и конверторов будут варианты)
  3. удобство его поддержки – код, конечно, лучше и быстрее читается, если какой-нибудь атрибут (как ShortInfo в нашем случае) находится прямо в описании класса а не в конверторе, но не всегда это правильно с архитектурной стороны (например делать свойство типа Visibility в классах DTO)

Хотите попробовать свой тест? Конечно, пожалуйста..

Это всего лишь наши рассуждения, а что Вы думаете по этому поводу?