Microsoft указала в качестве руководства по разработке структуры, что свойства должны быть независимыми друг от друга и не полагаться на установку в каком-либо конкретном порядке.
Предположим, у вас есть класс треугольника, который должен поддерживать размеры и расчет площади. Как бы вы смоделировали это?
Это, конечно, дизайн, который считается неряшливым, потому что Area зависит от базы и высоты, которые устанавливаются первыми:
class Triangle{
public double Base {get;set;}
public double Height {get;set;}
public double Area {
get{
return (Base * Height) / 2;
}
}
}
Предполагая, что вы используете конструктор, вы можете обеспечить значения по умолчанию для этого случая, но правильный ли это подход?
class Triangle{
public Triangle(double b, double h){
Base = b;
Height = h;
}
public double Base {get;set;}
public double Height {get;set;}
public double Area {
get{
return (Base * Height) / 2;
}
}
}
У вас все еще есть свойство, которое зависит от других свойств. Чтобы быть пуристом, я вижу только несколько подходов (думаю, их можно объединить):
Make Base / Height имеет элементы только для чтения, которые могут быть установлены только в конструкторе
Превратите расчет площади в метод.
Используйте некоторый тип фабричного шаблона + элементы только для чтения, чтобы гарантировать, что, хотя зависимость может существовать, значения могут быть установлены только методом, который создает экземпляр класса Triangle.
Вопросы:
Является ли руководство практическим (нужно ли вам моделировать много сложностей в ваших классах, чтобы их поддерживать)?
[например, класс SqlConnection позволяет вам инициализировать свойство строки подключения, но позволяет изменять его отдельные части, такие как время ожидания команды]
Как вам удается поддерживать независимость своих свойств друг от друга?
Дополнительно для людей, которые используют архитектуру типов Silverlight / MVVM. Принимаете ли вы зависимости в свойствах из-за того, как привязка данных работает с объектом? Например, привязка экземпляра треугольника, который показывает высоту, основание и площадь на экране.