Sto armeggiando con OOP nella creazione di semplici sistemi CRUD.
Ho deciso di concentrarmi sull'uso del Pattern del repository per separare la logica di business dell'oggetto e la persistenza dei dati dell'oggetto (in realtà il salvataggio l'oggetto in un archivio dati persistente, cioè un database).
Il salvataggio di un oggetto semplice è immediato
class Customer {
setData(data) {
this.data = data;
}
}
// PUT Customer
customer = new Customer();
customer.setData(data);
customerRepo.save(customer);
Ma il salvataggio di un oggetto composito diventa un po 'complicato
Ma cosa succede se la mia classe Customer include ora anche altri oggetti che devono essere mantenuti nel DB?
Nell'esempio seguente, l'impostazione dei dati di un cliente deve anche creare un
AuditTrail
che è un insieme di differenze tra i dati precedenti e i nuovi dati passati in customer.setData()
.
AuditTrail
è una classe e in questo esempio è un classico ha una relazione tra Customer
e AuditTrail
class Customer {
setData(data) {
// instantiate an auditTrailCalculator with some constants from the DB
auditTrail = auditTrailRepo.create();
// 'calculate()' produces a diff between the previous data and the new data
this.auditTrail = auditTrail.calculate(this.data, data);
}
getAuditTrail() {
return this.auditTrail;
}
}
// PUT customer
customer = Customer();
customer.setId(customerId);
customer.setData(data);
customerRepo.update(customer);
auditTrailRepo.insert(customer.getAuditTrail());
L'esempio sopra sembra maldestro.
- Sto istanziando l'oggetto
AuditTrail
usando il repository dall'oggettoCustomer
. - Per eseguire in modo maldestro l'intero aggiornamento di un cliente:
- Crea un'istanza di un nuovo cliente
- Imposta i suoi dati
- Scarica il suo auditTrail che è stato generato all'interno dell'oggetto
- Salva AuditTrail sul DB utilizzando
AuditTrailRepo
- Salva il cliente nel DB utilizzando
CustomerRepo
Le mie domande:
- È corretto creare un'istanza di oggetti dai relativi repository da all'interno di altri oggetti?
- Dovrei invece creare una funzione factory, che istanzia entrambi gli oggetti,
Customer
&AuditTrail
e restituisce una composizione del 2? - Come dovrei gestire il salvataggio di questo oggetto composito?