Pregunta

como seguimiento de mi pregunta anterior Tener una función con límites genéricos combinados como:

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

Debido a que esto no se puede convertir desde un objeto no especificado, debe tener conocimiento de algún objeto que realmente implemente estas interfaces. Me parece que la necesidad de conocer el tipo específico del argumento objeto para pasar a doStuff (T a) es una violación de la ley de Demeter.

La función no especifica la necesidad de conocer la clase real (podría haber muchas diferentes), y realmente no quiero saberlo ya que saber que esta clase aumenta la dependencia en mi base de código.

¿está usando estos límites un anti patrón? y si es así, ¿cómo debería uno evitarlo?

el escenario del caso involucra una interfaz que especifica que el objeto es persistente y el otro objeto especificado que tiene una entidad relacionada. la función doStuff (T a) en este caso persistió la entidad relacionada cuando persistió. sin embargo, las entidades no persistentes también pueden tener una entidad relacionada, pero no deben ser procesadas por la función doStuff (T a)

No hay solución correcta

Otros consejos

No consideraría los límites genéricos combinados como un antipatrón. Al menos tengo algunos usos para ellos en mi código. Por ejemplo, el siguiente código de ejemplo encuentra la instancia de Number más grande en una colección usando compareTo desde la interfaz Comparable:

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

me parece que la necesidad de conocer el tipo específico del argumento objeto para pasar a doStuff (T a) es una violación de la ley de Demeter

No estoy de acuerdo. No veo cómo

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

requiere más conocimiento del argumento para pasar entonces

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

O incluso más que solo

void doStuff(T argument) 

En todos los casos necesita saber algo sobre argumentos y no creo que los primeros casos exijan más conocimiento que otros porque tiene dos identificadores.

El antipatrón es la conversión.

Sin embargo, el juego de pies genérico elegante puede ser confuso para los programadores no avanzados. El uso de tales tipos y métodos debería ser mucho más fácil que su implementación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top