Wir führen viele Unit-Tests und Refactoring-Vorgänge für unsere Geschäftsobjekte durch, und ich habe anscheinend ganz andere Meinungen zum Klassendesign als andere Kollegen.
Eine Beispielklasse, von der ich kein Fan bin:
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; } }
}
In der "echten" Klasse sind sie nicht alle Zeichenfolgen, aber in einigen Fällen haben wir 30 Hintergrundfelder für vollständig öffentliche Eigenschaften.
Ich hasse diese Klasse und ich weiß nicht, ob ich nur wählerisch bin. Ein paar bemerkenswerte Dinge:
- Private Sicherungsfelder ohne Logik in den Eigenschaften scheinen unnötig und blähen die Klasse auf
- Mehrere Konstruktoren (etwas in Ordnung), aber gekoppelt mit
- Alle Immobilien haben einen öffentlichen Setter, ich bin kein Fan.
- Möglicherweise wird aufgrund des leeren Konstruktors keinen Eigenschaften ein Wert zugewiesen. Wenn ein Aufrufer dies nicht weiß, kann dies möglicherweise zu unerwünschten und schwer zu testenden Verhaltensweisen führen.
- Es sind zu viele Eigenschaften! (im Fall 30)
Ich finde es viel schwieriger , als Implementierer wirklich zu wissen, in welchem Zustand sich das Objekt Foo
zu einem bestimmten Zeitpunkt befindet. Das Argument lautete: "Wir haben möglicherweise nicht die erforderlichen Informationen, um sie Prop5
zum Zeitpunkt der Objektkonstruktion festzulegen. Ok, ich denke, ich kann das verstehen, aber wenn dies der Fall ist, machen Sie nur Prop5
Setter öffentlich, nicht immer bis zu 30 Eigenschaften in einer Klasse."
Bin ich nur wählerisch und / oder verrückt danach, eine Klasse zu wollen, die "einfach zu bedienen" ist, anstatt "einfach zu schreiben (alles öffentlich)"? Klassen wie die oben genannten schreien mir zu, ich weiß nicht, wie das verwendet werden soll, also werde ich einfach alles für alle Fälle öffentlich machen .
Wenn ich nicht besonders wählerisch bin, was sind gute Argumente, um diese Art des Denkens zu bekämpfen? Ich bin nicht sehr gut darin, Argumente zu artikulieren, da ich sehr frustriert bin, wenn ich versuche, meinen Standpunkt zu vermitteln (natürlich nicht absichtlich).
get
oder set
:-)