Recentemente ho contestato al mio collega la seguente situazione:
Ho sviluppato un framework che elabora le risorse (in java, anche se non è molto importante). Va (semplificato, pseudo-codice) come questo:
class Algorithm {
Processor processor = ...;
execute() {
forEach(Resource r : readResourceNamesFromFileSystem()) {
DomainObject do = convertResourceToDomainObject(r);
processor.process(do);
}
}
}
interface Processor {
process(DomainObject do);
}
Class Algorithm è un punto di accesso al mio framework. La risorsa è una rappresentazione di alcuni contenuti nel filesystem (ha metodi per leggere i dati dal file e il nome del file, che è importante)
Classe DomainObject (la dichiarazione è omessa) è una rappresentazione java del contenuto del file rappresentato da Resource. DomainObject ha solo dati e non ha un nome file all'interno.
Classe Processore rappresenta il livello della business logic, DomainObject può essere elaborato, archiviato nel Database e così via.
I dati del contenuto sono forniti da altri, sappiamo solo che questi file contengono i dati che possono essere convertiti in DomainObject (s), che è un oggetto reale con cui lavoriamo nel framework. Archiviamo un DomainObject in un file.
Ora discutiamo sul nome del file. Il mio collega desidera che il nome del file venga propagato nel processore e potenzialmente a tutti i livelli perché è facile stampare il messaggio di registrazione / generare un'eccezione che contiene un nome file se qualcosa va storto durante l'elaborazione, o forse scrivere il messaggio come "l'oggetto dominio archiviato nel file ( qui__comes__filename ) è stato elaborato correttamente".
Vedo il punto del mio collega (convenienza) ma sono sicuro che rompe il design e l'incapsulamento perché il modulo del processore non dovrebbe realmente essere a conoscenza della "origine" di DomainObject (oggi li memorizziamo in file uno DomainObject per file, domani useremo forse qualcos'altro, qualcosa che non ha necessariamente un nome file).
Affermo che è meglio catturare l'eccezione nel metodo Algorithm.execute e rilanciare l'eccezione con un nome file / registrare il nome file. Il file di registro sarà meno leggibile ma l'incapsulamento non verrà interrotto.
Secondo me è un design contro la chiarezza. Potresti per favore condividere la tua opinione, chi ha ragione, chi ha torto? Dovrei sacrificare il design per la chiarezza dei log?
BTW Ho promesso al mio collega di fare questa domanda in modo da leggere insieme le possibili risposte:)
Grazie mille in anticipo e buona giornata