Domanda

come follow-up sulla mia domanda precedente Avere una funzione con limiti generici combinati come:

<T extends Foo & Bar> void doStuff(T argument) {
  //do stuff wich should only be done if arguments is both foo and bar
}

Poiché non è possibile calcolarlo da un oggetto non specificato, è necessario conoscere alcuni oggetti che implementano effettivamente queste interfacce. mi sembra che la necessità di conoscere il tipo specifico dell'argomento oggetto da passare a doStuff (T a) sia una violazione della legge di Demetra.

La funzione non specifica la necessità di conoscere la classe effettiva (potrebbero essercene molte diverse) e non voglio davvero conoscerla poiché conoscere questa classe aumenta la dipendenza nella mia base di codice.

sta usando questi limiti un anti pattern? e se sì, come si dovrebbe evitarlo nel modo migliore?

lo scenario del caso ha interessato un'interfaccia che specifica l'oggetto è persistente e l'altro oggetto specificato che ha un'entità correlata. la funzione doStuff (T a) in questo caso ha persistito l'entità correlata quando era persistente. tuttavia anche le entità non permanenti possono avere un'entità correlata, ma non devono essere elaborate dalla funzione doStuff (T a)

Nessuna soluzione corretta

Altri suggerimenti

Non considererei i limiti generici combinati un anti-pattern. Almeno ho alcuni usi per loro nel mio codice. Ad esempio, il seguente codice di esempio trova l'istanza Number più grande in una raccolta utilizzando compareTo dall'interfaccia Comparable:

<T extends Number & Comparable<T>> T max(Collection<T> numbers)
  

Mi sembra che la necessità di conoscere il tipo specifico dell'argomento oggetto da passare a doStuff (T a) sia una violazione della legge di Demetra

Non sono d'accordo. Non vedo come

T<? extends Foo & Bar> void doStuff(T argument) 

richiede quindi una conoscenza più approfondita dell'argomento da superare

T<? extends Foo> void doStuff(T argument) 

O anche di più quindi solo

void doStuff(T argument) 

In tutti i casi devi sapere qualcosa sull'argomento e non credo che i primi casi richiedano ulteriori conoscenze rispetto ad altri perché ha due identificatori.

L'anti-pattern sta lanciando.

Tuttavia, il footwork generico di fantasia può confondere i programmatori non avanzati. L'uso di tali tipi e metodi dovrebbe essere molto più semplice della loro implementazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top