Estamos haciendo muchas pruebas unitarias y refactorizando nuestros objetos comerciales, y parece que tengo opiniones muy diferentes sobre el diseño de la clase que otros pares.
Una clase de ejemplo de la que no soy fanático:
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; } }
}
En la clase "real", no todas son cadenas, pero en algunos casos tenemos 30 campos de respaldo para propiedades completamente públicas.
Me gusta esta clase, y no sé si estoy siendo quisquilloso. Algunas cosas notables:
- Los campos de respaldo privados sin lógica en las propiedades, parecen innecesarios e hinchan la clase
- Múltiples constructores (algo bien) pero junto con
- Todas las propiedades tienen un setter público, no soy un fanático.
- Potencialmente, a las propiedades no se les asignaría un valor debido al constructor vacío, si una persona que llama no lo sabe, podría obtener algunos comportamientos no deseados y difíciles de probar.
- ¡Son demasiadas propiedades! (en el caso 30)
Me resulta mucho más difícil saber realmente en qué estado se encuentra el objeto Foo
en un momento dado, como implementador. El argumento se hizo "podría no tener la información necesaria para establecer Prop5
en el momento de la construcción del objeto. Ok, supongo que puedo entender eso, pero si ese es el caso, haga Prop5
público solo el setter, no siempre hasta 30 propiedades en una clase.
¿Estoy siendo quisquilloso y / o loco por querer una clase que sea "fácil de usar" en lugar de ser "fácil de escribir (todo público)"? Clases como las anteriores me gritan, no sé cómo se va a usar esto, así que voy a hacer todo público por si acaso .
Si no estoy siendo muy exigente, ¿cuáles son buenos argumentos para combatir este tipo de pensamiento? No soy muy bueno para articular argumentos, ya que me siento muy frustrado al tratar de expresar mi punto de vista (no intencionalmente, por supuesto).
get
o set
:-)