2015-05-06 33 views
6

So che questo ha diversi post associati, ma ho alcune domande specifiche che spero di poter ottenere aiuto. Scusate se sono molto semplici ..Denominazione libreria package-by-feature package-by-layer VS?

Ecco un esempio di problema - molto semplificato, ma si ottiene l'immagine - Ho diversi oggetti, che hanno alcune funzioni comuni ad es. reparti di un'azienda farmaceutica: neurologia, oncologia, infezione, ecc. Tutti devono analizzare i file dei documenti dei pazienti e caricare i dati nel database. Naturalmente la natura dei dati è leggermente diversa per ogni dipartimento. Se Ho usato package-by-feature, avrei

com.company.neurology 
     Neurology.java 
     NeurologyDocument.java 
     NeurologyDAO.java 

com.company.infection 
     Infection.java 
     InfectionDocument.java 
     InfectionDAO.java 

ecc Il problema è che devo una classe astratta che le classi documento devono estendersi esempio

AbstractDocument.java 
public class AbstractDocument 
{ 
     public void validateDocument(){...} 
     public void readDocumentHeader(){...} 
     public void readDocumentFooter(){...} 
     ... 
} 

Alcuni file di accesso ai dati, ad es.

DBConnection.java 
    public class DBConnection 
    { 
     public void makeConnectionToDB() {... } 
     public void createCache() {... } 
     public void closeConnectionToDB() {... } 
    } 

alcune classi di errore

ParseError.java, PatientNotFoundException etc. 

Se i pacchetti sono di funzione, da dove vengono queste classi comuni/interfacce andare?

+1

com.company.common? –

+0

Immagino che si possa fare questo, ma ci sarebbero un sacco di classi molto estranee in un pacchetto così "comune". – user2689782

risposta

0

Suggerirei di mantenere le cose semplici. A patto che non vi agitiate, inserirli in com.company è una soluzione ragionevole.

L'avvertimento qui è che questo richiede che la disciplina li trasferisca in pacchetti separati ogni volta che noti gruppi di comunanza organizzativa.

Nel caso del tuo esempio, hai già iniziato a fare questi collegamenti - Il tuo post è di per sé segmentato suggerire questi pacchetti aggiuntivi:

com.company.dataaccess 
com.company.error 

AbstractDocument.java probabilmente non merita è proprio pacchetto - ancora . Se si finisce per creare interfacce/classi più correlate, spostarle in un pacchetto appropriato, ma non prendere in prestito problemi preoccupandoci finché non diventa un problema.

+0

Se creo com.company.dataaccess e com.company.error, estenderei il codice attraverso i pacchetti (non consigliato!). Anche com.company.dataaccess non conterrà i file DAO in quanto questi sarebbero nei singoli file del dipartimento. Quindi il codice relativo è distribuito. Immagino che non ci sia un design perfetto ... – user2689782

+0

Penso che tu stia pensando al pacchetto come un principio OOP, piuttosto che un pacchetto Java (che è più di uno spazio dei nomi). L'estensione tra i file 'jar' non è consigliata, ma l'estensione tra i pacchetti non è necessariamente una cattiva progettazione. Detto questo, i messaggi di errore sono probabilmente meglio tenuti più vicino alla classe che li utilizza. Avevo dedotto, apparentemente in modo errato, che si trattava di tipi di errore/eccezione che sarebbero stati utilizzati liberamente nell'applicazione. – Morgen

+0

Ciao, gli errori verrebbero usati liberamente, quindi hai ragione di parlare di tenerlo in una posizione centrale. Ho letto "Effective Java" di Bloch, che sostiene di mantenere sottoclassi nello stesso pacchetto della classe genitore, ma ovviamente, non si può obbedire a tutti i principi del design tutto il tempo .... – user2689782

1

Non credo che nel tuo caso dovresti creare un pacchetto common. Immagino che qualcosa non funzioni con le astrazioni usate.

È necessario trovare un modo per unire classi con lo stesso scopo in alcuni pacchetti e posizionare questo pacchetto sotto com.company.shared.<feature_name>.

Nel tuo caso potrebbe essere:

  • com.company.shared.database
  • com.company.shared.data_parsing

non è un problema per un pacchetto contenga solo una o due classi. Ma dovrebbe unire solo le classi con lo stesso scopo e avere un nome parlante chiaro.

Evitare tali nomi per entrambi i pacchetti e le classi come common. Un nome dovrebbe parlare da solo.

Problemi correlati