Да, есть эмпирические правила. Инструменты анализа кода - это хорошее начало для этого.
Некоторые Эмпирические правила о коде идет речь:
Его плохая практика, чтобы позволить сеттеров на свойства коллекции. Это связано с тем, что он просто обрабатывает пустые коллекции так же, как и полные в коде. Заставляя людей делать нулевые проверки в коллекциях, вы будете избиты. Рассмотрим следующий фрагмент кода:
public bool IsValid(object input){
foreach(var validator in this.Validators)
if(!validator.IsValid(input)
return false;
return true;
}
Этот код работает независимо от того, является ли коллекция валидаторов пустым или нет. Если вы хотите проверить, добавьте валидаторы в коллекцию. Если нет, оставьте коллекцию пустой. Просто. Учитывая свойство коллекции, чтобы быть неопределенные результаты в этой вонючей коде версии выше:
public bool IsValid(object input){
if(this.Validators == null)
return false;
foreach(var validator in this.Validators)
if(!validator.IsValid(input)
return false;
return true;
}
Больше строк коды, менее элегантные.
Во-вторых, для ссылочных типов, отличных от коллекций, вы должны учитывать, как ведет себя объект при определении того, хотите ли вы устанавливать значения свойств. Есть ли одно, очевидное значение по умолчанию для свойства? Или имеет значение null для свойства имеет действительное значение?
В вашем примере вы можете всегда проверить в настройщике значение «Имя» и установить его по умолчанию «(Нет имени)» при присвоении значения null. Это может облегчить привязку этого объекта к пользовательскому интерфейсу. Или имя может быть нулевым, потому что вы НЕВОЗМОЖНО иметь действительное имя, и вы будете проверять его и бросать InvalidOperationException, когда вызывающий объект пытается выполнить действие над объектом без предварительной установки имени.
Как и большинство вопросов в программировании, существует множество способов сделать что-то, половина из которых плохая, и каждый путь в другой половине хорош только в определенных обстоятельствах.
Часть с XmlSerialization это не совсем верно. Если вы объявляете свойство коллекции с помощью [XmlArray], он может быть полностью доступен только для чтения или {get;}. Поэтому ваше замечание относится только к типам свойств, которые не поддерживаются [XmlArray]. – OregonGhost 2008-10-30 13:43:23