Nel mio attuale lavoro stanno definendo una nuova architettura aziendale per lo sviluppo di java. È qualcosa del genere:
- ProjectView: livello vista JSF. Utilizza delegati sul livello ProjectClient.
- ProjectClient: definisce i delegati e le facciate. Lo fa per cercare gli EJB sul livello aziendale.
- ProjectBusiness: implementa le facciate definite dal livello client come EJB remoti. Contiene anche il modello e il livello DAO.
Il livello aziendale associa le entità alle DTO in modo che il client e la vista siano a conoscenza solo delle cloche di DTO.
La mia preoccupazione
Diciamo che abbiamo un'entità Car con attributi horsePower, numberOfDoors, engineType e releaseDate. Ora, abbiamo bisogno di cercare le auto con 3 porte e più di 120 CV. Con la visione iniziale dell'architettura dovrei scrivere le funzioni necessarie in tutti i livelli che portano questo agli argomenti.
Ma se ho bisogno di 3 porte e più di 120 CV o di un motore diesel? La risposta è stata: costruire un'altra funzione. Quello è nel delegato, nell'interfaccia della facciata, nella facciata impl e nel dao.
Ma le nostre entità non hanno 4 campi. Più di 30. IMHO sarà il caos e le persone moriranno quando inizieremo a scrivere app complete, con centinaia di funzioni dappertutto. La modifica del modello non è un'opzione.
La mia soluzione
Ho creato un prototipo ispirato in queryDsl per creare query dinamiche dalla vista che segue il pattern layer in modo da poter scrivere qualcosa come questo in un bean manager da JSF. È necessario creare solo una classe nel livello ProjectClient.
ClientQuery query = new ClientQuery();
QCar qcar = QCar.qcar;
query.and(qcar.model.eq(model)).and(qcar.horsePower.get(minumuHp));
return carService.searchCars(query);
Il prototipo mantiene separati i livelli e il livello dao può scegliere con il generatore di query da utilizzare in base a una query generica.
La mia domanda
Questo approccio ha senso? Non ho trovato nulla su questo argomento quindi sto affermando di pensare che forse è un anti-modello o un qualche tipo di cattiva pratica. Se ha senso, c'è qualche struttura / libreria o modello per guardare oltre?
Ho caricato il prototipo su Github e posso condividere il link se richiesto.