Domanda

Ho pensato un po 'di "buona prassi" per quanto riguarda la struttura pacchetto entro fasci OSGi. Attualmente, in media, abbiamo come 8-12 classi per ogni pacco. Uno di mia iniziativa / proposta è stata quella di avere due pacchetti; com.company_name.osgi.services.api (per le classi API correlati / interfacce (quali viene esportata esternamente) e un pacchetto com.company_name.osgi.services.impl di attuazione (non esportata)). Quali sono i pro contro di questo? Altri suggerimenti?

È stato utile?

Soluzione

Si potrebbe anche prendere in considerazione mettendo le interfacce in com.company_name.subsystem, e l'implementazione in com.company_name.subsystem.impl, il codice specifico OSGi, se c'è, potrebbe essere in com.company_name.subsystem.osgi. A volte si potrebbe avere molteplici attuazione delle stesse interfacce. In questo caso si potrebbe prendere in considerazione - com.company_name.subsystem.impl1 e com.company_name.subsystem.impl2, ad esempio:

com.company.scm        // the scm api
com.company.scm.git    // its git implementaton
com.company.scm.svn    // its subversion implementation
com.company.scm.osgi   // the place to put an OSGI Activator

In questa struttura pacchetto senso potrebbe essere agnostici OSGi, se in seguito il passaggio a un diverso contenitore, basta mettere un ulteriore

com.company.scm.sca     // or whatever component model you might think of

avendo sempre api e impl nel nome del pacchetto potrebbe essere fastidioso. In caso di dubbio uso impl ma non api.

Altri suggerimenti

Non è il numero di classi che è importante, ma i concetti. A mio parere si dovrebbe avere un'entità concettuale in un fascio. In alcuni casi, questo potrebbe essere solo un paio di classi in altri diversi pacchetti con 100s di classi.

Che cosa importante è che si separare l'API e l'implementazione. Un bundle contiene le API del vostro concetto e l'altro l'attuazione. Come questo si può fornire implementazioni diverse per un'API ben definito. In alcuni casi questo potrebbe essere ancora necessaria se si vuole accedere ai servizi da un fascio a distanza (per esempio usando R-OGSi)

I fasci API vengono poi utilizzati per la condivisione del codice e dei servizi da fasci di implementazione attraverso la condivisione di servizi. Il modo migliore per esplorare queste possibilità è quella di guardare ai ServiceTrackers.

Nel tuo caso si potrebbe avere l'implementazione nello stesso pacchetto, ma tutte le sue classi "pacchetto protetta". In questo modo, è possibile esportare il pacchetto e l'implementazione non sarebbe visibile verso l'esterno, anche quando non si utilizza OSGi (ma come un file jar regolare).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top