Sono stato alle prese con questa domanda per un po '.
Sto pensando in particolare al modello di dominio orientato agli oggetti.
Diciamo che ho due entità. A supplier
e a customer
. Esiste una relazione che un supplier
può avere molti clienti e un customer
(in questo caso) può avere solo un supplier
.
Il problema che ho è che nessuno degli oggetti ha bisogno di alcun comportamento sull'altro oggetto, cioè l'oggetto fornitore non ha bisogno di usare alcun comportamento dell'oggetto cliente e viceversa.
C'è comunque ancora un'associazione tra di loro. Il motivo è che il dominio del problema richiede che tutti i clienti dei fornitori vengano distrutti se il fornitore viene distrutto. Dobbiamo anche essere in grado di recuperare una raccolta di tutti i clienti associati a un fornitore.
Come viene gestito nel modello di dominio OO? Chi è responsabile dell'associazione?
Alcuni potrebbero dire che ci dovrebbe essere un metodo getCustomers()
sull'oggetto supplier
e questo è dove si trova l'associazione. Non mi piace molto perché rende difficile chiudere la classe supplier
(violazione di Open Closed Principle). Ogni volta che creiamo un nuovo tipo di classe che ha un'associazione a supplier
, dobbiamo aggiungere un metodo get a supplier
.
Una cosa che penso possa essere utilizzata per modellare l'associazione sono i repository (dal libro di Driv Design di Eric Evens). Immagino che sarebbe il deposito a cui importa allora questa relazione? Potremmo chiamare selectCustomersFor(supplier_id)
etc
Modifica
L'unica ragione che posso vedere per avere l'associazione è per i criteri di recupero dell'oggetto o la distruzione dell'oggetto (ad esempio se l'utente viene distrutto, tutti i clienti verranno distrutti). Per me, non è responsabilità di nessuno dei due oggetti recuperare o distruggere se stesso. Potresti obiettare che il fornitore dovrebbe recuperare / distruggere un cliente, ma questo sicuramente viola la regola di Responsabilità Unica e potrebbe anche portare alla violazione di Open Closed.
Perché dovremmo preoccuparci di aggiungere la responsabilità dell'associazione a un oggetto che non lo usa? È inutile per l'oggetto. L'associazione non è inutile, ma sento che qualcos'altro dovrebbe esserne responsabile.