Vor kurzem habe ich darüber nachgedacht, einen Teil meines Codes zu sichern. Ich bin gespannt, wie man sicherstellen kann, dass ein Objekt niemals direkt erstellt werden kann, sondern nur über eine Methode einer Factory-Klasse. Angenommen, ich habe eine "Geschäftsobjekt" -Klasse und möchte sicherstellen, dass jede Instanz dieser Klasse einen gültigen internen Status hat. Um dies zu erreichen, muss ich einige Überprüfungen durchführen, bevor ich ein Objekt erstelle, wahrscheinlich in seinem Konstruktor. Dies ist alles in Ordnung, bis ich beschließe, dass diese Überprüfung Teil der Geschäftslogik sein soll. Wie kann ich also veranlassen, dass ein Geschäftsobjekt nur mit einer Methode in meiner Geschäftslogikklasse erstellt werden kann, jedoch niemals direkt? Der erste natürliche Wunsch, ein gutes altes "Freund" -Schlüsselwort von C ++ zu verwenden, wird mit C # nicht erfüllt. Wir brauchen also andere Optionen ...
Versuchen wir ein Beispiel:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
Es ist alles in Ordnung, bis Sie sich daran erinnern, dass Sie die MyBusinessObjectClass-Instanz weiterhin direkt erstellen können, ohne die Eingabe zu überprüfen. Ich möchte diese technische Möglichkeit insgesamt ausschließen.
Was denkt die Community darüber?
CreateBusinessObject
Methode besteht darin, Argumente in einem einzelnen Methodenaufruf zu validieren UND (ein neues gültiges Objekt zurückzugeben ODER einen Fehler zurückzugeben), wenn ein Aufrufer nicht sofort weiß, ob Argumente für die Übergabe an den Konstruktor gültig sind.
Distance
Instanz mit einem negativen Argument sollte ArgumentOutOfRangeException
beispielsweise eine auslösen. Sie würden nichts davon profitieren, wenn Sie eine Instanz erstellen DistanceFactory
, die dieselbe Prüfung durchführt. Ich sehe immer noch nicht, was Sie hier gewinnen können.