Мы проводим много модульного тестирования и рефакторинга наших бизнес-объектов, и у меня, похоже, совсем другие мнения о дизайне классов, чем у других коллег.
Пример класса, который я не фанат:
public class Foo
{
private string field1;
private string field2;
private string field3;
private string field4;
private string field5;
public Foo() { }
public Foo(string in1, string in2)
{
field1 = in1;
field2 = in2;
}
public Foo(string in1, string in2, string in3, string in4)
{
field1 = in1;
field2 = in2;
field3 = in3;
}
public Prop1
{ get { return field1; } }
{ set { field1 = value; } }
public Prop2
{ get { return field2; } }
{ set { field2 = value; } }
public Prop3
{ get { return field3; } }
{ set { field3 = value; } }
public Prop4
{ get { return field4; } }
{ set { field4 = value; } }
public Prop5
{ get { return field5; } }
{ set { field5 = value; } }
}
В «реальном» классе они не все строковые, но в некоторых случаях у нас есть 30 вспомогательных полей для полностью открытых свойств.
Я ненавижу этот класс, и я не знаю, привередничаю ли я. Несколько примечаний:
- Частные поля поддержки без логики в свойствах, кажутся ненужными и раздувают класс
- Несколько конструкторов (несколько хорошо), но в сочетании с
- все свойства, имеющие открытый сеттер, я не фанат.
- Потенциально никаким свойствам не будет присвоено значение из-за пустого конструктора, если вызывающий объект не знает, вы можете получить некоторые очень нежелательные и сложные для проверки поведения.
- Это слишком много свойств! (в 30 случае)
Я нахожу гораздо сложнее действительно понять, в каком состоянии находится объект Foo
в любой момент времени, как реализатор. Был выдвинут аргумент: «У нас может не быть необходимой информации для установки Prop5
во время создания объекта. Хорошо, я думаю, я могу это понять, но если это так, сделайте Prop5
общедоступным только сеттер, а не всегда до 30 свойств в классе.
Я просто придирчив и / или сумасшедший из-за того, что мне нужен класс, который «прост в использовании», а не «легко писать (все публично)»? Классы, подобные приведенным выше, кричат мне, я не знаю, как это будет использоваться, поэтому я просто собираюсь обнародовать все на всякий случай .
Если я не очень требователен, каковы хорошие аргументы для борьбы с этим типом мышления? Я не очень хорош в формулировании аргументов, потому что я очень расстроен, пытаясь донести свою точку зрения (не намеренно, конечно).
get
или set
:-)