Betrachten Sie die folgende Klasse
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Für die Verwendung von GetComplexResult
müsste ein Verbraucher dieser Klasse wissen, dass er die A
y B
bevor Sie die Methode aufrufen. Wenn GetComplexResult
auf viele Eigenschaften zugreift, um sein Ergebnis zu berechnen, kann dies zu falschen Rückgabewerten führen, wenn der Verbraucher nicht zuerst alle geeigneten Eigenschaften einstellt. Sie könnten diese Klasse also stattdessen so schreiben
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
Auf diese Weise kann ein Aufrufer von GetComplexResult
ist gezwungen, alle erforderlichen Werte einzugeben, damit der erwartete Rückgabewert korrekt berechnet wird. Wenn jedoch viele Werte erforderlich sind, wird die Parameterliste immer länger, was ebenfalls nicht gut aussieht. Es scheint auch den Sinn der Kapselung zu verletzen A
, B
y GetComplexResult
in einer einzigen Klasse. Ich könnte sogar in Versuchung kommen, die GetComplexResult
statisch, da sie keine Instanz der Klasse benötigt, um ihre Arbeit zu verrichten. Ich möchte nicht herumlaufen und einen Haufen statischer Methoden erstellen.
Gibt es Begriffe, die diese beiden unterschiedlichen Arten der Klassenbildung beschreiben? Beide scheinen Vor- und Nachteile zu haben - gibt es etwas, das ich nicht verstehe, das mir sagen sollte, dass eine Methode besser ist als die andere? Welchen Einfluss hat das Unit Testing auf diese Entscheidung?