Recentemente ho pensato di proteggere parte del mio codice. Sono curioso di sapere come si possa essere sicuri che un oggetto non possa mai essere creato direttamente, ma solo tramite un metodo di una classe factory. Diciamo che ho una classe "oggetto business" e voglio assicurarmi che ogni istanza di questa classe abbia uno stato interno valido. Per ottenere ciò dovrò eseguire qualche controllo prima di creare un oggetto, probabilmente nel suo costruttore. Va tutto bene finché non decido che voglio che questo controllo faccia parte della logica aziendale. Quindi, come posso fare in modo che un oggetto aziendale sia creabile solo tramite un metodo nella mia classe di logica aziendale ma mai direttamente? Il primo desiderio naturale di usare una buona vecchia parola chiave "amico" di C ++ fallirà con C #. Quindi abbiamo bisogno di altre opzioni ...
Proviamo qualche esempio:
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;
}
}
Va tutto bene finché non ti ricordi che puoi ancora creare l'istanza MyBusinessObjectClass direttamente, senza controllare l'input. Vorrei escludere del tutto questa possibilità tecnica.
Allora, cosa ne pensa la comunità di questo?
CreateBusinessObject
metodo è convalidare gli argomenti AND a (restituire un nuovo oggetto valido O restituire un errore) in una singola chiamata al metodo quando un chiamante non sa immediatamente se gli argomenti sono validi per il passaggio al costruttore.
Distance
un'istanza con un argomento negativo dovrebbe generare un, ArgumentOutOfRangeException
ad esempio, non guadagneresti nulla creando un DistanceFactory
che esegue lo stesso controllo. Continuo a non vedere cosa hai da guadagnare qui.