2009-02-27 8 views
8

Ho appena ereditato un'applicazione Java e dopo aver esaminato il codice, sto vedendo che IMHO è una bastardizzazione del framework Spring. Vedete, il team di Java sembra avere un'avversione per le interfacce, così si finisce con le cose in questo modo:Primavera come fabbrica glorificata; è accettabile?

@Autowired 
private SomeConcreteFinalClass _myField; 

Non c'è nessuna configurazione di Primavera, non fagiolo definito, nessuna possibilità che io possa provare l'oggetto che contiene in isolamento . Questa è essenzialmente una fabbrica basata su annotazioni con il sovraccarico di Spring.

Sono fuori linea, o è come usare una pistola ad elefante per uccidere le mosche? Devo solo avere un controllo di realtà dal tutti gli altri membri del team pensano che questo sia perfettamente accettabile.

Modifica In molti casi queste fabbriche annotate vengono visualizzate in classi di elaborazione complesse che trarrebbero un vantaggio immenso da test isolati. Tuttavia, il team disapprova anche i test.

Non c'è mistero qui, spero. Se ho una classe concreta, non è dietro un'interfaccia, e non c'è un bean Spring corrispondente per "configurare" l'oggetto, quindi è indiscutibilmente una fabbrica glorificata che può essere implementata con 10 linee di codice.

La molla non viene utilizzata in alcun altro modo nel sistema; questo è.

I miei obiettivi in ​​questo momento:

  • istituire una politica di test
  • Educare la squadra sulle virtù del componente isolamento
  • spostare questi campi Autowired dietro interfacce

I Immagino che l'ultima domanda sia: c'è qualche vantaggio nel mantenere questi campi Autowired se non siamo testin g o in qualsiasi altro modo utilizzando la struttura. Mi piacerebbe anche new l'oggetto se la dipendenza è immutabile.

+0

Ovviamente: un elefante è l'arma preferita per uccidere le mosche mutanti di dimensioni elefante –

risposta

4

Sono d'accordo con te che si tratta di un abuso di ciò che la Primavera può fare (al contrario di ciò che la Primavera DEVE fare). La persona che ha progettato l'applicazione in questo modo? Sarebbe interessante sentire la loro giustificazione per la costruzione di un'applicazione in questo modo.

1

Non posso dire di vedere completamente il punto. Dopotutto, sarebbero probabilmente poche righe di codice per cablare il sistema in un metodo main e non avresti la dipendenza da Spring.

E sì, sono d'accordo sul fatto che non iniettare interfacce è un po 'inutile. Tendo a non eseguire una grande quantità di test delle unità ma, anche così, perderei ogni flessibilità nel cambiare le implementazioni in seguito (o avere implementazioni diverse delle classi in diverse distribuzioni - ad esempio, test di integrazione).

4

Limita certamente ciò che è possibile, ma non è neanche una totale perdita di tempo.

Dal momento che il tipo in questione è final, non può essere facilmente analizzato con mock-up per test isolati.

Tuttavia, le istanze di quel tipo possono ancora essere altamente configurabili attraverso le loro proprietà.L'utilizzo di Spring per iniettare un'istanza correttamente configurata in fase di runtime semplifica immensamente la classe contenente. La classe può concentrarsi sulle sue responsabilità, affidandosi a Spring per fornirgli i collaboratori di cui ha bisogno.

Interfacce sono usate; questa potrebbe essere una risposta a questo. Penso che iniziare con classi finali concrete per molti tipi, quindi utilizzare strumenti di refactoring prontamente disponibili per estrarre le interfacce in un secondo momento, quando viene identificata una specifica esigenza, è una posizione difendibile in molti contesti.

+0

Se il tipo è definitivo, potrebbe esserci un'interfaccia per l'isolamento per l'estensibilità e la testabilità. In molti casi queste fabbriche annotate appaiono in classi di elaborazione complesse che potrebbero trarre enormi benefici da test isolati. Hanno anche disapprovato i test. –

+0

+1 per un ragionevole argomento del contatore. –

+0

"Aggrottare le sopracciglia", eh? Temo di non poter parlare in loro difesa lì! ;) – erickson

1

Mi dispiace, ma non posso dire se si tratta di un abuso di Spring basato sulle due righe di codice che hai postato e dubito che chiunque altro possa farlo.

Se ti lamenti del fatto che il tipo statico di quell'oggetto non è un'interfaccia potresti avere un punto. Ma anche questo è difficile da capire da quella singola riga di codice. È davvero una classe di servizio o repository senza un'interfaccia? Se è così, sono d'accordo. In caso contrario, avrei bisogno di saperne di più.

Se la tua squadra si acciglia ai test, è un peccato. Avrei pensato che uno dei motivi per Spring sarebbe quello di facilitare i test.

Si potrebbe avere un punto, ma non posso essere sicuro dalla tua domanda originale. Forse puoi modificare più dettagliatamente.

Se questo è un esempio di come comunichi con i tuoi compagni di squadra, forse sarebbero giustificati se dicessero che non ti sei spiegato molto bene. Assicurati di non essere solo fuori per l'auto-ingrandimento qui.

+0

Grazie per il tuo feedback. In genere fornisco abbastanza dettagli in modo che gli esperti nell'area possano essere in grado di raccoglierli insieme o chiedere maggiori dettagli. Il jab sulle mie capacità comunicative era un po 'fuori luogo, ma +1 per evidenziare la necessità di maggiori dettagli. –

+1

"Generalmente fornisco abbastanza dettagli" - non questa volta. E solo i tuoi compagni di squadra possono fornirti un feedback significativo sul fatto che le tue capacità comunicative siano sufficienti. Preoccupati meno di ciò che penso e di più su di loro. Ti suggerirei di prenderlo in considerazione invece di presumere che si sbagliano. – duffymo

Problemi correlati