Sto lavorando con un sistema legacy che ha un modello di dominio anemico .Rifacturazione della logica di dominio che accede ai repository in un sistema legacy
Il dominio ha le seguenti classi di entità: Car
, CarType
, CarComponent
, CarComponentType
.
Per ognuno di questi, c'è un repository separato. C'è anche un numero di servizi che accedono a questi repository e contengono fondamentalmente tutta la logica.
Ho bisogno di implementare un metodo che determina se un produttore può sostituire CarComponentType
. La logica è la seguente: un componente può essere interrotto solo se non ci sono automobili esistenti con quel componente oggi.
Inizialmente, l'ho implementato in una classe di servizio.
public boolean canBeDiscontinued(CarComponentType carComponentType) {
List<Car> cars = carRepository.getCarsWithComponent(carComponentType);
return cars.isEmpty();
}
Questo funziona, ma questa logica viene utilizzata da diversi altri punti del codice. Potrebbe crescere, e sembra qualcosa che potrebbe andare bene all'interno classe CarComponentType
invece:
public boolean canBeDiscontinued() {
List<Car> cars = carRepository.getCarsWithComponent(this);
return cars.isEmpty();
}
Tuttavia, non posso metterlo lì, dal momento che ha bisogno di accedere al repository (e se ho capito bene è un antipattern molto serio per le entità di essere a conoscenza del livello di accesso ai dati). Quando carico un tipo di componente, non posso caricare tutte le macchine di quel tipo poiché potrebbero essere migliaia di oggetti. Non stiamo utilizzando alcun ORM, quindi creare una raccolta lenta non solo è ingombrante ma anche molto soggetta a errori.
È più appropriato avere effettivamente questo metodo in una classe di servizio come ho fatto per la prima volta? Non è importante? C'è un'altra alternativa? Devo iniziare il refactoring da un altro punto di partenza?
C'è una domanda simile here. Ma la mia domanda riguarda Java, quindi non penso che la soluzione sia applicabile nel mio caso. Inoltre, mi dispiace in anticipo per l'utilizzo di auto e componenti come il mio modello di dominio. :)
In quale livello dovrei inserire l'implementazione della specifica? Infrastruttura? – Chris
La specifica è parte integrante del livello Dominio, poiché i "concetti di dominio" sono implementati nelle specifiche. –