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?
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:
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.
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).
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:
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.
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.
Tags und Links .net c# generics vb.net overloading