Attualmente il nostro servizio è implementato utilizzando un'architettura multistrato che divide l'intero servizio in tre:
- API
- Affari
- Persistenza
Tuttavia questo introduce molta ridondanza all'interno del nostro sistema. Un comune adagio nel settore è "DRY" (Do not Repeat Yourself). La ridondanza ha aumentato i tempi di sviluppo e reso il sistema più fragile e ingombra il nostro codice con metodi di "copia".
Per dare un'idea migliore, diciamo che abbiamo un servizio Person
. Ciò richiederebbe quanto segue:
-
Person
entity - Classe annotata JPA per ORM - Richiesta del servizio di repository - contiene i valori dei campi da perseguire dell'oggetto Dominio persona con opzioni di persistenza aggiuntive
- Risposta del servizio di repository - contiene i valori di campo dell'entità Person
-
Person
- classe con business logic, campi di dominio e campi calcolati - Richiesta del servizio di dominio - contiene valori di campo di
Person
risorsa e opzioni aziendali aggiuntive - Risposta al servizio di dominio - contiene valori di campo di
Person
oggetto business esclusi quelli che non dovrebbero essere visibili agli utenti API -
Person
risorsa - classe che rappresenta ciò che dovrebbe essere visibile agli utenti API
E le cose peggiorano quando si prendono in considerazione oggetti nidificati.
Il design attuale facilita la differenza tra preoccupazioni (business, API, persistenza), tuttavia:
- Attualmente le differenze sono molto piccole. Questo ci sta causando classi molto simili con solo piccole differenze
- Servizi di ritorno oggetti di risposta del servizio con campi anziché solo gli oggetti esso stesso ostacola altri servizi a seconda di altri servizi
Domande:
- Ne vale la pena di portare a termine questo design?
- Quali sono le nostre alternative?
- Che cosa potremmo cambiare per migliorare la nostra situazione?