Estamos fazendo muitos testes de unidade e refatoração de nossos objetos de negócios, e eu pareço ter opiniões muito diferentes sobre o design de classe do que outros pares.
Um exemplo de classe da qual eu não sou fã:
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; } }
}
Na classe "real", eles não são todos string, mas em alguns casos, temos 30 campos de apoio para propriedades completamente públicas.
Eu odeio essa aula e não sei se estou sendo exigente. Algumas coisas a serem observadas:
- Campos de apoio privados, sem lógica nas propriedades, parecem desnecessários e incham a classe
- Vários construtores (um pouco ok), mas juntamente com
- todas as propriedades com um setter público, eu não sou fã.
- Potencialmente, nenhuma propriedade receberia um valor devido ao construtor vazio; se um chamador não souber, você poderá obter algo muito indesejável e difícil de testar quanto ao comportamento.
- São muitas propriedades! (no caso 30)
Acho muito mais difícil realmente saber em que estado o objeto Foo
está a qualquer momento, como implementador. O argumento foi formulado "talvez não tenhamos as informações necessárias para definir Prop5
no momento da construção do objeto. Ok, acho que posso entender isso, mas se for esse o caso, torne apenas o Prop5
setter público, nem sempre até 30 propriedades em uma classe.
Estou apenas sendo exigente e / ou louco por querer uma aula que seja "fácil de usar" em vez de ser "fácil de escrever (tudo público)"? Classes como a acima gritam para mim, eu não sei como isso será usado, então apenas tornarei tudo público para o caso .
Se não estou sendo muito exigente, quais são os bons argumentos para combater esse tipo de pensamento? Não sou muito bom em articular argumentos, pois fico muito frustrado ao tentar expressar meu ponto de vista (não intencionalmente, é claro).
get
ou set
:-)