2009-08-18 2 views
6

XML sembra essere la lingua del giorno, ma non è sicuro dal tipo (senza uno strumento esterno per rilevare i problemi) e si finisce per fare la logica in XML. Perché non farlo nella stessa lingua del resto del progetto. Se è java puoi semplicemente costruire un barattolo di configurazione e metterlo sul classpath.Cosa c'è di sbagliato nel fare la configurazione di Dipendenza iniezione nel codice?

Mi manca qualcosa di profondo.

+0

Cosa intendi per "configurazione"? –

+3

Ho trovato quello che ti manca: la conformità alle parole chiave. ;-) –

+0

In primavera, la configurazione sarebbe il cablaggio insieme dei fagioli solitamente eseguiti tramite il file XML applicationContext.xml –

risposta

9

Lo svantaggio principale della configurazione DI nel codice è che si impone una ricompilazione per modificare la configurazione. Utilizzando file esterni, la riconfigurazione diventa una modifica di runtime. I file XML forniscono inoltre una separazione extra tra il codice e la configurazione, che molti apprezzano molto.

Questo può rendere più semplice il test, la manutenibilità, l'aggiornamento su sistemi remoti, ecc. Tuttavia, con molte lingue, è possibile utilizzare il caricamento dinamico del codice in questione ed evitare alcuni aspetti negativi, nel qual caso i vantaggi diminuiscono .

+8

Trovo che un poliziotto sia fuori discussione. Il 99% delle volte, se si desidera modificare la configurazione DI, è una modifica abbastanza profonda da richiedere comunque una ricompilazione. e fintanto che impacchettate le vostre classi di configurazione separatamente, c'è pochissima differenza tra la modifica di un file xml e la sostituzione di config-test con la produzione di configurazione. I benefici, d'altro canto, si riferiscono a un linguaggio che è effettivamente leggibile e uno con cui abbiamo carichi di strumenti altamente evoluti con cui lavorare. –

+0

(non voglio dire abbastanza "aggressivo" come quello che ho suonato, ti ho votato perché è per questo che xml è usato per questo. Non sono proprio d'accordo con la vista) –

+0

Heh, non lo faccio necessariamente sempre d'accordo anche con questo. Nel mio attuale progetto, eseguiamo molta configurazione DI (più la configurazione ORM) nel codice contro XML, perché ha senso per noi. Tuttavia, questo è un argomento spesso propagandato, e ha il suo posto, ed è per questo che ne parlo. Personalmente, preferisco la configurazione in codice poiché si ottiene il controllo del tempo di compilazione invece di dover fare affidamento sui controlli di runtime dei file di configurazione, ma questa è una preferenza personale e non direttamente una risposta alla domanda. –

2

Non c'è nulla di intrinsecamente sbagliato nel fare la configurazione nel codice, è solo che la tendenza è usare XML per fornire una separazione.

C'è una convinzione diffusa che in qualche modo avere la configurazione in XML ti protegge dal dover ricostruire dopo una modifica. La realtà nella mia esperienza è che è necessario riconfezionare e ridistribuire l'applicazione per fornire i file XML modificati (nel caso dello sviluppo Web), quindi è possibile modificare semplicemente alcuni file di "configurazione" Java. Yo potrebbe rilasciare semplicemente i file XML sul server Web e aggiornare, ma nell'ambiente in cui lavoro, l'audit sarebbe opportuno se lo facessimo.

La cosa principale che consente di utilizzare la configurazione XML a mio parere è costringere gli sviluppatori a pensare all'iniezione di dipendenza e alla separazione delle preoccupazioni. in primavera (tra gli altri), fornisce anche un comodo gancio per appendere i proxy AOP e simili. Entrambi possono essere raggiunti in configurazione Java, è solo meno ovvio dove vengono disegnate le linee e la tendenza potrebbe essere quella di reintrodurre dipendenze dirette e codice spaghetti.

Per informazioni, c'è un Spring project per consentire di eseguire la configurazione nel codice.

Il progetto Spring Java Configuration (JavaConfig in breve) fornisce un'opzione Java puro sicura per tipo per la configurazione del contenitore IoC Spring. Mentre XML è un approccio di configurazione ampiamente utilizzato, la versatilità di Spring e la gestione interna basata su metadati delle definizioni di bean significa che le alternative alla configurazione XML sono facili da implementare.

+0

Grazie a un gruppo per il collegamento Spring Project. Era completamente inconsapevole. –

+0

Prego, ma vale la pena notare che non è ancora in versione 1.0 –

0

XML non è pensato per avere la logica, ed è lontano dall'essere un linguaggio di programmazione.

XML è utilizzato per memorizzare i dati in un modo facile da capire e modificare.

Si può dire che è spesso utilizzato per memorizzare definizioni, non per logica aziendale.

+0

D'accordo, che dovrebbe essere, ma in primavera fa molto di più. È abbastanza possibile iniettare i bean in modo condizionale e quindi la logica è nel file XML. –

0

Fa male perché rende i test più difficili.

Se si sta scrivendo il codice e si utilizzano metodi come getApplicationContext() per ottenere le dipendenze, si sta buttando via di alcuni dei vantaggi dell'integrazione delle dipendenze.

Quando i tuoi oggetti e servizi non hanno bisogno di sapere come creare o acquisire le risorse da cui dipendono, sono più liberamente accoppiati a tali dipendenze.

L'accoppiamento allentato significa test dell'unità più semplice. È difficile ottenere qualcosa in una junit se è necessario creare un'istanza di tutte le sue dipendenze. Quando una classe omette le assunzioni sulle sue dipendenze, i suoi oggetti di simulazione facili da usare al posto di quelli reali ai fini del test.

Inoltre, se si può resistere all'impulso di utilizzare getApplicationContext() e altre tecniche DI basate su codice, allora è possibile (a volte) fare affidamento su autowiring a molla, il che significa che significa anche meno lavoro di configurazione. La configurazione funziona sia in codice che in XML è noioso, giusto?

+0

Se è così che dovresti implementarlo, allora non stai facendo un'iniezione di dipendenza. Anche se stai usando xml per la configurazione, devi comunque costruire la tua fabbrica di fagioli. –

+0

In effetti, sto discutendo contro l'uso di getApplicationContext(). – nont

0

Hai citato Spring in un commento alla tua domanda, quindi questo suggerisce che potresti essere interessato al fatto che Spring 3 ti permette di express your application contexts in Java rather XML.

È un po 'un rompicapo, ma la definizione dei bean e le loro interdipendenze possono essere eseguite in Java. Mantiene comunque una netta separazione tra configurazione e logica, ma la linea diventa un po 'più sfocata.

0

XML è principalmente un formato di dati (nome). Il codice è principalmente un formato di elaborazione (verbo). Dal punto di vista del design, ha senso avere la tua configurazione in XML se è principalmente sostantivi (indirizzi, impostazioni del valore, ecc.) E codice se è principalmente verbi (elaborazione di flag, configurazioni del gestore, ecc.).

1

In base alla mia esperienza, è possibile promuovere una stretta comunicazione tra il team di sviluppo e il team di infrastruttura rilasciando frequentemente. Più rilascerai, più saprai effettivamente quale sia la variabilità tra i tuoi ambienti. Ciò consente anche di rimuovere la configurabilità non necessaria.

Un corollario alla legge di Conway si applica qui: i file di configurazione saranno simili alla varietà di ambienti in cui la tua app è dispiegata (pianificata o effettiva).

Quando ho un team che distribuisce applicazioni interne, tendo a guidare verso la configurazione del codice per tutti i problemi di architettura (pool di connessioni, ecc.) E config nei file per tutte le configurazioni ambientali (nomi utente, stringhe di connessione, indirizzi IP). Se ci sono diversi problemi architettonici tra diversi ambienti, allora li incapsulerei in una classe, e renderò quella parte classname dei file di configurazione - ad es.

container.config = FastInMemoryConfigurationForTesting container.config = ProductionSizedConfiguration

Ognuno di questi userà qualche configurazione comune, ma supera/sostituire quelle parti dell'architettura che devono essere sostituite.

Tuttavia, questo non è sempre appropriato. Ci sono diverse cose che influenzeranno la tua scelta:

1) il tempo necessario dopo il rilascio di una nuova goccia prima che venga distribuito correttamente in ogni ambiente di produzione e si riceve un feedback su tale ambiente (tempo di ciclo) 2) La variabilità in ambienti distribuiti 3) L'accuratezza del feedback raccolto dagli ambienti di produzione.

Quindi, quando si ha un cliente che distribuisce l'app ai propri team di sviluppo per l'implementazione, è necessario rendere l'app molto più configurabile rispetto a quando si esegue il live. È possibile che contenga ancora config nel codice, ma ciò richiede che il pubblico di destinazione comprenda il proprio codice. Se si utilizza un approccio di configurazione comune (ad esempio Spring), è più semplice per gli utenti finali adattarsi e risolvere i problemi nella loro produzione.

Ma una rubrica è: la configurabilità è un sostituto per la comunicazione.