Basically my question is ErrorAccumulator a pattern or anti-pattern?
Con alcune eccezioni, un design può essere buono o cattivo a seconda del contesto (alcuni disegni sono orribili, non importa come li usi). Un motivo può rendere davvero unico un disegno, ma può essere applicato erroneamente in un altro design per peggiorarlo. Il contesto conta .
In generale, è una buona idea che le funzioni non modifichino i loro parametri. Ecco come funzionano le funzioni matematiche e rende il codice più chiaro a causa di un minor numero di effetti collaterali.
Tuttavia: devi guardare ogni oggetto e il suo scopo. Quando vedo ErrorAccumulator
vedo un oggetto progettato da modificare per un capriccio. Solo per il suo nome, mi dice "Sono un secchio per lanciare i tuoi errori, e puoi scaricarli più tardi."
Or better yet just log errors inside of the function?
Ci sono alcuni buoni motivi per non che lo fanno in questo modo, ma qui ci sono alcuni problemi che sono intrecciati.
- Gli errori di registrazione funzionano correttamente se il codice può recuperare da un errore stesso e gli errori possono semplicemente passare a un file di registro e non all'utente.
- Le eccezioni potrebbero essere migliori se il codice non può essere ripristinato dall'errore stesso, ma il codice più in alto nello stack delle chiamate può fare qualcosa di utile.
- Accumulare errori in un oggetto può essere una buona idea se il codice può recuperare dagli stessi errori, ma è necessario creare un elenco di tutti gli errori da mostrare all'utente come un'unica unità.
Riguardo all'ultimo punto, un buon modo per visualizzarlo è un modulo web. Diversi campi devono essere convalidati: forse alcuni consentono solo numeri, altri devono seguire uno schema specifico (ad esempio, abbinare un'espressione regolare). In questo caso, può essere sensato usare qualcosa come quel ErrorAccumulator
per compilare un elenco di errori, che può quindi essere stampato come una unità da visualizzare all'utente.
Basically my question is ErrorAccumulator a pattern or anti-pattern?
Torna a questa domanda: entrambi. Se usato correttamente, può risolvere un problema specifico nel software. Se usato in modo errato, può risolvere il problema in modo errato e creare confusione.