Sto scrivendo un componente aggiuntivo per un altro software tramite la sua API. Le classi restituite dall'API possono essere accessibili solo tramite il software nativo e l'API. Quindi sto scrivendo i miei oggetti POCO/DTO stand-alone che si associano alle classi API. Sto lavorando a una funzione che leggerà in un file nativo e restituirò una raccolta di questi oggetti POCO che posso rubare altrove. Attualmente sto usando JSON.NET per serializzare queste classi su JSON se questo è importante.Design pattern per includere errori con valori di ritorno
Per esempio potrei avere un DTO come questo
public class MyPersonDTO
{
public string Name {get; set;}
public string Age {get; set;}
public string Address {get; set;}
}
..e un metodo come questo di leggere le "Persone" nativi nella mia DTO oggetti
public static class MyDocReader
{
public static IList<MyPersonDTO> GetPersons(NativeDocument doc)
{
//Code to read Persons from doc and return MyPersonDTOs
}
}
Ho installato unit test con un file di test, tuttavia continuo a incontrare problemi imprevisti durante l'esecuzione dell'esportazione su altri file. A volte gli oggetti nativi avranno valori inattesi, o ci saranno errori flat nell'API che generano eccezioni quando non c'è motivo.
Attualmente, quando si verifica qualcosa di "eccezionale", registro l'eccezione e l'esportazione non riesce. Ma ho deciso che preferirei esportare quello che posso e registrare gli errori da qualche parte.
L'opzione più semplice sarebbe quella di registrare e ingoiare le eccezioni e restituire ciò che posso, tuttavia in questo caso il codice di chiamata non sarebbe stato in grado di sapere quando si è verificato un problema.
Un'opzione che sto considerando è la restituzione di un dizionario di errori come parametro separato. La chiave identifica la proprietà che non può essere letta e il valore conterrà i dettagli dell'eccezione/errore.
public static class MyDocReader
{
public static IList<MyPersonDTO> persons GetPersons(NativeDocument doc, out IDictionary<string, string> errors)
{
//Code to read persons from doc
}
}
In alternativa, stavo anche considerando di archiviare gli errori nell'oggetto di ritorno stesso. Questo gonfia la dimensione del mio oggetto, ma ha il vantaggio di archiviare gli errori direttamente con i miei oggetti. Quindi più tardi, se l'esportazione di qualcuno genera un errore, non devo preoccuparmi di rintracciare il file di registro corretto sul proprio computer.
public class MyPersonDTO
{
public string Name {get; set;}
public string Age {get; set;}
public string Address {get; set;}
public IDictionary<string, string> Errors {get; set;}
}
Come viene gestito in genere? C'è un'altra opzione per riportare gli errori insieme ai valori di ritorno che non sto considerando?
A seconda dell'implementazione, Martin Fowler considera l'ultima opzione la più valida. Esiste anche il modo Eccezione, in cui si genera un'eccezione quando qualcosa va storto. – Fals
Ti capita di avere un link a un post sul blog o una presentazione in cui Martin parla di questo? –
Esiste il collegamento per il post: http://martinfowler.com/articles/replaceThrowWithNotification.html – Fals