Frage

als Follow-up auf meiner vorherigen Frage Mit einer Funktion kombiniert mit generischen Grenzen wie zum Beispiel:

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

Da dies nicht gießbaren von einem nicht näher bezeichnete Objekt ist, müssen Sie Kenntnis von einem Objekt haben, die diese Schnittstellen tatsächlich implementiert. es scheint mir, dass die spezifische Art des Objekts Argument wissen zu müssen, um doStuff(T a) zu passieren eine Verletzung der Demeter-Gesetz ist.

Die Funktion gibt nicht die Notwendigkeit, die eigentliche Klasse wissen (es könnte viele unterschiedliche sein), und ich möchte wirklich nicht, es wissen, wie diese Klasse zu wissen, die Abhängigkeit in meinem Code-Basis erhöht.

wird mit diesen Grenzen ein Anti-Muster? und wenn ja, wie sollte man am besten vermeiden Sie es?

der Fall involvierte eine Schnittstelle das Objekt persistent ist und das andere angegebene Objekt mit einer verbundenen Einrichtung angeben. die doStuff(T a) Funktion in diesem Fall blieb die damit verbundene Einrichtung, wenn es beibehalten wurde. jedoch nicht persistente Entitäten können auch eine damit verbundene Einrichtung, aber nicht durch die doStuff(T a) Funktion verarbeitet werden

Keine korrekte Lösung

Andere Tipps

würde ich nicht generische Grenzen ein Anti-Muster kombiniert betrachten. Wenigstens habe ich habe einige Anwendungsmöglichkeiten für sie in meinem Code. Zum Beispiel findet der folgende Beispielcode die größte Anzahl Instanz in einer Sammlung compareTo vom Vergleichbaren Schnittstelle:

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

scheint es mir, dass die spezifische Art des Objekts Argument kennen zu müssen doStuff (T a) passieren wird eine Verletzung der Demeter-Gesetz

ich nicht zustimmen. Ich sehe nicht, wie

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

erfordert mehr Wissen über Argument dann passieren

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

Oder sogar mehr als nur

void doStuff(T argument) 

In allen Fällen müssen Sie etwas über Argument wissen, und ich glaube nicht, die ersten Fälle wird mehr Wissen fordern andere dann, weil es zwei Bezeichner hat.

Das anti-Muster wirft.

Allerdings Phantasie Generika einen schönen Angriff kann zu nicht-fortgeschrittene Programmierer verwirrend sein. Verwendung solcher Typen und Verfahren sollte viel einfacher sein, als deren Umsetzung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top