Mi capita spesso di incontrare situazioni in cui voglio creare un'istanza di un oggetto passandogli alcuni dati o forse un altro oggetto ma i dati o l'oggetto devono essere validi o nello stato giusto. Sono sempre un po 'incerto sul modo "corretto" di farlo. Qui è il mio esempio:Quale schema di progettazione utilizzare per convalidare i dati e creare un oggetto
Data questa classe:
class BusinessObject()
{
const Threshold = 10;
public BusinessObject(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
{
// performance some business logic
// set properties
}
}
}
E 'possibile incorrere in alcuni problemi se si esegue questa operazione:
var setofdata = new SetOfData<SomeType>();
// if data is not valid then the object will be created incorrectly
var businessObject = new BusinessObject(setofdata);
Quindi le mie soluzioni sono sempre stati:
class BusinessObjectBuilder()
{
public BusinessObject Build(SetOfData<SomeType> setofdata)
{
// an example of some validation
if (setofdata.count > Threshold)
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
}
Oppure rendere privato il costruttore e aggiungere un metodo di produzione statico:
class BusinessObject()
{
const Threshold = 10;
public static Create(SetOfData<SomeType> setofdata)
{
if (setofdata.count > Threshold)
{
return new BusinessObject(setofdata);
}
else
{
return null;
}
}
private BusinessObject(SetOfData<SomeType> setofdata)
{
// performance some business logic
// set properties
}
}
idealmente non vorrei un'eccezione se i dati non è valido, come ci potrebbe essere più oggetti di business essere creati in un unico processo e non voglio che l'intero processo di fallire se uno convalida non riesce e la cattura e sopprimere le eccezioni non va bene.
Inoltre, tutti gli esempi che ho letto del metodo Factory o Factory Abstract implicano il passaggio in qualche tipo o enum e un oggetto corretto che viene costruito e restituito. Non sembrano mai coprire questo scenario.
Quindi quali sono le convenzioni in questo scenario? Qualsiasi consiglio sarebbe molto apprezzato.
Solo una nota, le fabbriche non hanno bisogno di avere "qualche tipo o enum" passato; possono prendere qualsiasi tipo di dati (anche un 'SetOfData') o nessun dato (senza parametri). Gli esempi tendono ad usarli perché è un modo abbastanza comune/semplice di usarli/descriverli. Se lo desideri, potresti sempre creare un 'BusinessObjectValidator' affinché la factory possa fare leva su quali verificherebbero i parametri, ma vorrei lanciarla nel metodo di creazione di fabbrica, se il controllo è semplice come descrivi. –