Betrachten Sie die folgende KlasseShould Klassenmethoden akzeptieren Parameter oder Verwendung Klasseneigenschaften
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Um GetComplexResult
ein Verbraucher dieser Klasse zu verwenden, würde wissen müssen A
und B
zu setzen, bevor die Methode aufgerufen wird. Wenn GetComplexResult
auf viele Eigenschaften zugreift, um sein Ergebnis zu berechnen, kann dies zu falschen Rückgabewerten führen, wenn der Konsument nicht alle entsprechenden Eigenschaften zuerst festlegt. So können Sie diese Klasse schreiben wie diese statt
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
diese Weise kann ein Anrufer GetComplexResult
ist gezwungen, in allen erforderlichen Werte zu übergeben, der erwartete Rückgabewert sichergestellt wird, korrekt berechnet. Wenn es jedoch viele erforderliche Werte gibt, wächst auch die Parameterliste, und das scheint auch kein gutes Design zu sein. Es scheint auch den Punkt der Kapselung von A
, B
und GetComplexResult
in einer einzigen Klasse zu brechen. Ich könnte sogar versucht sein, GetComplexResult
statisch zu machen, da es keine Instanz der Klasse benötigt, um seine Arbeit zu erledigen. Ich möchte nicht eine Reihe von statischen Methoden machen.
Gibt es Begriffe, um diese 2 verschiedenen Möglichkeiten zum Erstellen von Klassen zu beschreiben? Beide scheinen Vor- und Nachteile zu haben - gibt es etwas, das ich nicht verstehe, das mir sagen sollte, dass der eine Weg besser ist als der andere? Wie beeinflusst Unit Testing diese Wahl?
Ich versuche immer, Getter aufzurufen, anstatt direkt auf Mitglieder zuzugreifen, und im Getter protokolliere ich eine Nachricht, wenn ich einen Nullwert zurückgebe. Früher habe ich Assertions verwendet, aber dann haben wir festgestellt, dass einige unserer Kunden mit in der Produktion aktivierten Behauptungen arbeiten (!). – TMN