Überlädt gegen allgemeine Argumente

7

Ich habe eine Frage. In dem Rahmen, der größtenteils geschrieben wurde, bevor die Generika kamen, sieht man oft eine Funktion mit vielen Überladungen, um etwas mit verschiedenen Typen zu machen.

a)

%Vor%

Das scheint in Ordnung zu sein, da es hilft, den Code für jede Methode und so klein zu halten. Auf der anderen Seite, jetzt mit Generika können Sie Folgendes tun:

b)

%Vor%

und dann eine Art von ifs / switch-Anweisungen mit typeof (), um zu versuchen, zu folgern, was die Typen sind und was damit zu tun ist.

Was ist die beste Vorgehensweise? Oder was sind die Ideas, die mir helfen würden zwischen a) und b) zu wählen?

    
devoured elysium 24.08.2009, 16:04
quelle

5 Antworten

18

IMHO, wenn Sie If / Switch-Anweisungen benötigen, sollten Sie besser überladen. Generics sollten verwendet werden, wenn die Implementierung nicht vom konkreten Typ abhängig ist, um sie wiederzuverwenden.

Also als eine allgemeine Regel:

  • überladen, wenn für jeden Typ eine eigene Implementierung vorhanden ist
  • Verwenden Sie Generika, wenn Sie eine einzige Implementierung haben, die für alle möglichen Typen funktioniert.
Stefan Steinegger 24.08.2009, 16:11
quelle
7

Code Geruch.

Wenn du " irgendeine Art von if / switch " hast, ist das ein Code-Geruch, der nur Polymorphismus schreit . Es legt nahe, dass Generika nicht die Lösung für dieses Problem sind. Generics sollten verwendet werden, wenn der Code nicht von den konkreten Typen abhängt, die Sie verwenden.

Sehen Sie sich dieses Google Tech Talks-Video an: " Clean Code Talks - Vererbung, Polymorphismus und Testen ". Es befasst sich speziell mit dem, worüber Sie sprechen.

    
Robert Cartaino 24.08.2009 16:13
quelle
4

Das Muster, das beschreibt, wo die Verwendung von Generika zu einer Reihe von ifs / switch-Anweisungen führt, ist ein Anti-Pattern.

Eine Lösung hierfür ist die Implementierung eines Strategie-Patterns, das es Ihnen ermöglicht, Generika zu verwenden, aber gleichzeitig Probleme der Parse-Methode zu isolieren, um nicht mit jedem Fall vertraut zu sein.

Beispiel:

%Vor%

und dann könntest du jede der Strategien, die du entwickelst, weitergeben. Dies würde es Ihnen ermöglichen, Ihre Bedenken über mehrere Klassen hinweg korrekt zu isolieren und SRP nicht zu verletzen (Single-Responsibility-Prinzip).

    
Joseph 24.08.2009 16:12
quelle
2

Ein Problem hier - wenn Sie if / switch-Anweisungen benötigen, damit Generika funktionieren, haben Sie wahrscheinlich ein größeres Problem. In dieser Situation ist es sehr wahrscheinlich, dass das generische Argument für JEDEN Typ nicht korrekt funktioniert, sondern nur für eine festgelegte Menge von Typen, die Sie bearbeiten. In diesem Fall sind Sie besser in der Lage, Überladungen bereitzustellen, um die spezifischen Typen einzeln zu behandeln.

Das hat viele Vorteile:

  • Es besteht keine Chance auf Missbrauch - Ihr Benutzer kann kein ungültiges Argument übergeben
  • Es gibt mehr Klarheit in Ihrer API - es ist sehr offensichtlich, welche Typen geeignet sind
  • Generische Methoden sind komplizierter zu verwenden und nicht so offensichtlich für Anfänger
  • Die Verwendung eines Generikums legt nahe, dass jeder Typ gültig ist - sie sollten wirklich auf jedem Typ funktionieren
  • Die generische Methode wird wahrscheinlich leistungsmäßig langsamer sein

Wenn Ihr Argument mit irgendeinem Typ arbeiten kann, wird dies weniger klar. In diesem Fall würde ich oft noch die Überladungen sowie eine generische Fallback-Methode für Typen in Betracht ziehen. Dies bietet eine Leistungssteigerung, wenn Sie einen "erwarteten" Typ an die Methode übergeben, aber Sie können immer noch mit anderen, nicht erwarteten Typen arbeiten.

    
Reed Copsey 24.08.2009 16:19
quelle
1

Es gibt zwar keine allgemeingültige Regel, aber Generika sollten verwendet werden, wenn der spezifische Typ irrelevant ist . Das heißt nicht, dass Sie den Typ nicht einschränken können, aber dieser spezielle Typ spielt keine Rolle. In diesem Fall hängt das Parsing-Verfahren vollständig von jedem Typ ab (und unterscheidet sich davon). Generika scheinen hier keine gute Lösung zu sein.

    
Adam Robinson 24.08.2009 16:13
quelle

Tags und Links