Ci ho pensato tempo fa e recentemente è riemerso mentre il mio negozio sta realizzando la sua prima vera app web Java.
Come intro, vedo due principali strategie di denominazione dei pacchetti. (Per essere chiari, non mi riferisco all'intera parte 'domain.company.project' di questo, sto parlando della convenzione del pacchetto sottostante.) Ad ogni modo, le convenzioni di denominazione dei pacchetti che vedo sono le seguenti:
Funzionale: denominazione dei pacchetti in base alla loro funzione architettonicamente piuttosto che alla loro identità in base al dominio aziendale. Un altro termine per questo potrebbe essere la denominazione in base a "livello". Quindi, avresti un pacchetto * .ui e un pacchetto * .domain e un pacchetto * .orm. I tuoi pacchetti sono fette orizzontali anziché verticali.
Questo è molto più comune della denominazione logica. In effetti, non credo di aver mai visto o sentito parlare di un progetto che fa questo. Questo ovviamente mi rende diffidente (un po 'come pensare di aver trovato una soluzione a un problema NP) poiché non sono molto intelligente e presumo che tutti debbano avere ottime ragioni per farlo nel modo in cui lo fanno. D'altra parte, non sono contrario al fatto che le persone perdano solo l'elefante nella stanza e non ho mai sentito un argomento reale per nominare i pacchetti in questo modo. Sembra solo essere lo standard de facto.
Logico: denominare i pacchetti in base alla loro identità di dominio aziendale e inserire in quel pacchetto ogni classe che ha a che fare con quella fetta verticale di funzionalità.
Non l'ho mai visto o sentito, come ho detto prima, ma per me ha molto senso.
Tendo ad avvicinarmi ai sistemi verticalmente piuttosto che orizzontalmente. Voglio entrare e sviluppare il sistema di elaborazione degli ordini, non il livello di accesso ai dati. Ovviamente, ci sono buone probabilità che tocchi il livello di accesso ai dati nello sviluppo di quel sistema, ma il punto è che non la penso in questo modo. Ciò significa, ovviamente, che quando ricevo un ordine di modifica o voglio implementare qualche nuova funzionalità, sarebbe bello non dover andare in giro in un mucchio di pacchetti per trovare tutte le classi correlate. Invece, guardo solo nel pacchetto X perché quello che sto facendo ha a che fare con X.
Dal punto di vista dello sviluppo, vedo come una grande vittoria avere i tuoi pacchetti documentare il tuo dominio aziendale piuttosto che la tua architettura. Sento che il dominio è quasi sempre la parte del sistema che è più difficile da capire mentre l'architettura del sistema, specialmente a questo punto, sta diventando quasi banale nella sua implementazione. Il fatto che io possa arrivare a un sistema con questo tipo di convenzione di denominazione e immediatamente dalla denominazione dei pacchetti sapere che si tratta di ordini, clienti, imprese, prodotti, ecc. Sembra davvero utile.
Sembra che questo ti consenta di sfruttare molto meglio i modificatori di accesso di Java. Ciò consente di definire in modo molto più pulito le interfacce nei sottosistemi piuttosto che nei livelli del sistema. Quindi, se hai un sottosistema di ordini che desideri sia persistente in modo trasparente, in teoria potresti non far sapere a nient'altro che è persistente non dovendo creare interfacce pubbliche per le sue classi di persistenza nel livello dao e invece impacchettando la classe dao in solo con le classi di cui si occupa. Ovviamente, se volessi esporre questa funzionalità, potresti fornire un'interfaccia per essa o renderla pubblica. Sembra che tu perda molto di questo avendo una fetta verticale delle funzionalità del tuo sistema suddivisa su più pacchetti.
Suppongo che uno svantaggio che posso vedere è che rende un po 'più difficile strappare gli strati. Invece di eliminare o rinominare un pacchetto e poi rilasciarne uno nuovo con una tecnologia alternativa, devi entrare e cambiare tutte le classi in tutti i pacchetti. Tuttavia, non vedo che questo sia un grosso problema. Potrebbe essere dovuto a una mancanza di esperienza, ma devo immaginare che il numero di volte in cui sostituisci le tecnologie impallidisce rispetto al numero di volte in cui entri e modifichi sezioni di funzionalità verticali all'interno del tuo sistema.
Quindi immagino che la domanda ti verrebbe posta, come si nominano i pacchetti e perché? Per favore, capisci che non penso necessariamente di essere incappato nell'oca d'oro o qualcosa del genere qui. Sono abbastanza nuovo in tutto questo con un'esperienza prevalentemente accademica. Tuttavia, non riesco a individuare i buchi nel mio ragionamento, quindi spero che lo possiate tutti così che io possa andare avanti.