Scorrendo il codice che ho scritto, mi sono imbattuto nel seguente costrutto che mi ha fatto pensare. A prima vista, sembra abbastanza pulito. Sì, nel codice attuale il getLocation()
metodo ha un nome leggermente più specifico che descrive meglio quale posizione ottiene.
service.setLocation(this.configuration.getLocation().toString());
In questo caso, service
è una variabile di istanza di tipo noto, dichiarata all'interno del metodo. this.configuration
deriva dall'essere passato al costruttore della classe ed è un'istanza di una classe che implementa un'interfaccia specifica (che impone un getLocation()
metodo pubblico ). Quindi, this.configuration.getLocation()
è noto il tipo restituito dell'espressione ; specificamente in questo caso, è un java.net.URL
, mentre service.setLocation()
vuole un String
. Poiché i due tipi String e URL non sono direttamente compatibili, è necessaria una sorta di conversione per adattarsi al piolo quadrato nel foro rotondo.
Tuttavia , secondo la Legge di Demetra, come citato nel codice pulito , un metodo f nella classe C dovrebbe chiamare solo i metodi su C , oggetti creati da o passati come argomenti di f , e oggetti tenuti nelle variabili di istanza C . Tutto ciò che va oltre (il finale toString()
nel mio caso particolare sopra, a meno che non si consideri un oggetto temporaneo creato come risultato dell'invocazione del metodo stesso, nel qual caso l'intera Legge sembra essere discutibile) è vietato.
Esiste un ragionamento valido per cui una chiamata come quella sopra, dati i vincoli elencati, dovrebbe essere scoraggiata o addirittura vietata? O sto solo diventando troppo pignolo?
Se dovessi implementare un metodo URLToString()
che chiama semplicemente toString()
un URL
oggetto (come quello restituito da getLocation()
) passato ad esso come parametro e restituisce il risultato, potrei avvolgere la getLocation()
chiamata in esso per ottenere esattamente lo stesso risultato; efficacemente, sposterei la conversione di un passo verso l'esterno. Ciò in qualche modo lo renderebbe accettabile? (Mi sembra , intuitivamente, che non dovrebbe fare alcuna differenza in entrambi i modi, poiché tutto ciò che fa è spostare le cose un po '. Tuttavia, andando dalla lettera della Legge di Demetra come citata, sarebbe accettabile, dal momento che io opererebbe quindi direttamente su un parametro per una funzione.)
Farebbe differenza se si trattasse di qualcosa di leggermente più esotico rispetto toString()
a un tipo standard?
Quando rispondi, tieni presente che alterare il comportamento o l'API del tipo di cui service
è variabile la variabile non è pratico. Inoltre, per ragioni di argomento, supponiamo che anche l'alterazione del tipo di ritorno getLocation()
sia impraticabile.