Diciamo che ho una classe SelectableEntity<T extends Entity>
che ha tre metodi, select
, deselect
, isSelected
e count
.
Per fare un esempio un po 'forzato, diciamo che sto costruendo un'applicazione di messaggistica di emergenza che mi consente di inviare messaggi ai residenti durante incendi, inondazioni e altri disastri naturali.
Posso selezionare più entità di tipi diversi (ma tutte per lo stesso motivo). Diciamo che queste entità sono House
, Street
e Suburb
.
Ora diciamo che ho una classe chiamata MessageRecipients
che contiene un SelectableEntity<House>
, SelectableEntity<Street>
, SelectableEntity<Suburb>
.
Ci sono due modi in cui posso codificarlo:
Il primo modo è creare getter (cioè houses
, streets
, suburbs
) e selezionare / deselezionare i destinatari in quel modo .: messageRecipients.streets.select(aStreet)
.
L'altro modo sarebbe nascondere il fatto che MessageRecipients
utilizza SelectableEntity
e creare semplicemente metodi 'proxy' per ogni metodo su SelectableEntity
(cioè selectHouse
, deselectHouse
, selectStreet
, ecc.)
Il primo metodo sembra violare la legge di Demeter mentre il secondo metodo richiede fondamentalmente di creare un intero gruppo di metodi su MessageRecipients
che invochino direttamente l'istanza rilevante di SelectableEntity
(e richiede un intero gruppo di test aggiuntivi per garantire che vengano invocati i metodi corretti).
La mia domanda è, è il primo esempio di un esempio standard di violazione della Legge di Demetra e sarebbe preferibile addormentare tutta la duplicazione e la verbosità e scendere il secondo approccio (una supposizione una domanda successiva è ciò che costituisce un valido motivo per rompere la legge di Demetra, se non altro)?
Nota: l'esempio che ho dato è truccato e sono consapevole che potrebbe essere abbattuto in determinate situazioni (ad esempio, le strade e i sobborghi contengono case - se aggiungo una strada che ha la casa XYZ e chiamo messageRecipients.houses().isSelect(houseXYZ)
dovrebbe restituire true). Per il gusto di questa discussione, il caso dovrebbe essere ignorato in quanto non si applica allo scenario reale con cui ho a che fare.