Progettazione per modulo java riutilizzabile che utilizza connessioni DB

2

Ho il compito di cambiare qualche codice procedurale Java nel modulo riutilizzabile Object Oriented. Si tratta di un'utilità di generatore XML che utilizza la velocità per la generazione XML. Esistono anche arricchimenti delle regole aziendali, tutti configurabili nelle tabelle del database. Ho già rimosso enormi istruzioni if-else per le regole e le ho trasformate in oggetti Rule con classi e interfacce astratte che altre applicazioni possono estendere e implementare. Tuttavia mi trovo in difficoltà con la riprogettazione della classe generale - XMLGeneratorUtil, che prende una connessione JDBC, Logger e Properties nel suo costruttore e fa un sacco di cose nel costruttore come la costruzione di strutture dati differenti (contenenti dati statici) dal database .

Ora, so che non è bello connettersi al Database da Costruttore, ma se cambio qualche cosa come sotto:

XMlGeneratorUtil xmlUtil = new XMLGeneratorUtil();
xmlUtil.initialize(Conenriches conn, Properties prop , Logger logger) // Do DB Connections and all initializations here
xmlUtil.generateXML(data); // Data is a HashMap containing busines data that goes into the XML
  1. Come posso essere sicuro che gli utenti della mia chiamata di utilità inizializzino prima di chiamare generateXML? Devo creare un Wrapper che crea internamente un oggetto leggero e poi lo inizializza senza che l'utente lo sappia?

  2. Inoltre, è utile che la mia libreria riutilizzabile accetti Connection come parametro? L'idea è che l'applicazione chiamante della mia utility può scegliere di gestire la propria connessione, quindi la passano alla mia API

  3. Contro l'SRP (principio di Responsabilità Unica) il XMLGeneratorUtil manipola i dati aziendali (che alla fine entrano nei dati XML) e genera XML. L'arricchimento dei dati dovrebbe essere esposto come API diversa? (E poi l'utente chiama XMLGeneratorUtil)

posta Plaiska 26.04.2014 - 14:36
fonte

2 risposte

1

Risposte ai tuoi punti:

How can I be sure that the users of my utility call initialize before they call generateXML? Should I create some Wrapper that internally creates a lightweight object and then initializes it without the user knowing it?

No. Sarebbe essenzialmente la stessa cosa che invocare il database dal costruttore. Invece, fare generateXML gettare un'eccezione se l'oggetto si trova nello stato sbagliato (ad esempio, initialize hasnt' stato chiamato).

Also , is it good for my re-usable library to accept Connection as a parameter? Idea is that the calling Application of my utility may choose to manage their own Connection , so they just pass it to my API

Probabilmente no. Considera di iniettare qualcosa un po 'meno a basso livello. Sicuramente la dipendenza dell'oggetto Rules non è l'intero database, ma semplicemente un sottoinsieme dei suoi dati. Questo sottoinsieme potrebbe essere rappresentato come un deposito? In altre parole, se l'oggetto Regole richiede tirando le regole dal database, non consegnarlo a dbConnection , consegnatelo a RulesRepository .

Non posso rispondere alla terza domanda perché non sono sicuro di cosa intendi con "arricchisce i dati aziendali".

Ma, ad alto livello, la risposta a questa domanda è:

Ripensa le dipendenze degli oggetti. L'iniezione di una connessione al database è molto ampia e consente al tuo oggetto Regole di fare molto di più con i tuoi dati che dovrebbero essere in grado di.

Considerare l'iniezione di classi che espongono solo ciò che è necessario dal database. L'utilizzo di un repository ti aiuterà a farlo e ti separerà anche dal supporto di persistenza dei dati. Così, nel caso improbabile che si fosso database e spostare su un altro supporto di memorizzazione, avrete solo bisogno di aggiornare i repository e non tutti i loro consumatori.

    
risposta data 26.04.2014 - 15:08
fonte
0

Perché non rendere l'intera costruzione del costruttore in una classe e passare solo quella classe nel costruttore? Quindi puoi anche astrarlo come interfaccia, quindi la generazione XML non dipende nemmeno da DB e può accettare qualsiasi dato.

    
risposta data 26.04.2014 - 17:02
fonte

Leggi altre domande sui tag