Ми проводимо багато тестування та рефакторинг наших бізнес-об’єктів, і, здається, у мене дуже різні думки щодо дизайну класів, ніж інші колеги.
Приклад класу, який я не шанувальник:
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
:-)