it-swarm.com.de

Was ist Generika-Missbrauch?

Während ich einen Code überprüfte, bemerkte ich die Möglichkeit, ihn zu ändern, um Generika zu verwenden. Der (verschleierte) Code sieht folgendermaßen aus:

public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
    var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
    ...
}

Dieser Code könnte wie folgt durch Generika ersetzt werden:

public void DoAllTheThings<T>(object[] possibleTargets[0])
{
    var someProperty = type(T).getProperty(possibleTargets[0]);
    ...
}

Bei der Untersuchung der Vor- und Nachteile dieses Ansatzes fand ich einen Begriff namens generischer Missbrauch . Sehen:

Meine Frage besteht aus zwei Teilen:

  1. Gibt es irgendwelche Vorteile, wenn Sie auf solche Generika umsteigen? (Leistung? Lesbarkeit?)
  2. Was ist Generika-Missbrauch? Und wird jedes Mal, wenn ein Typparameter vorliegt, ein generischer Missbrauch verwendet?
36
SyntaxRules

Wenn Generika entsprechend angewendet werden, entfernen Code, anstatt ihn nur neu anzuordnen. Der Code, den Generika am besten entfernen können, sind in erster Linie Typecasts, Reflection und dynamische Typisierung. Daher könnte der Missbrauch von Generika lose als das Erstellen von generischem Code definiert werden, ohne dass die Typumwandlung, Reflexion oder dynamische Typisierung im Vergleich zu einer nicht generischen Implementierung wesentlich reduziert wird.

In Bezug auf Ihr Beispiel würde ich einen angemessenen Einsatz von Generika erwarten, um das object[] zu einem T[] oder ähnlich, und vermeiden Sie Type oder type insgesamt. Dies erfordert möglicherweise an anderer Stelle erhebliche Umgestaltungen. Wenn in diesem Fall die Verwendung von Generika angemessen ist, sollte dies insgesamt einfacher sein, wenn Sie fertig sind.

87
Karl Bielefeldt

Ich würde die No-Nonsense-Regel verwenden: Generics, wie alle anderen Programmierkonstrukte, existieren, um ein Problem zu lösen. Wenn es kein Problem gibt, das für Generika zu lösen ist, ist ihre Verwendung Missbrauch.

Im speziellen Fall von Generika existieren sie meistens, um von konkreten Typen abzuweichen, sodass Codeimplementierungen für die verschiedenen Typen zu einer generischen Vorlage zusammengefasst werden können (oder wie auch immer Ihre Sprache es nennt). Angenommen, Sie haben Code, der den Typ Foo verwendet. Sie können diesen Typ durch ein generisches T ersetzen, aber wenn Sie diesen Code nur für die Arbeit mit Foo benötigen, gibt es einfach keinen anderen Code, mit dem Sie ihn zusammenfalten können. Somit besteht kein zu lösendes Problem, so dass die Indirektion des Hinzufügens des Generikums nur dazu dienen würde, die Lesbarkeit zu verringern.

Infolgedessen würde ich vorschlagen, den Code nur ohne Verwendung von Generika zu schreiben, bis Sie die Notwendigkeit sehen, sie einzuführen (da Sie eine zweite Instanziierung benötigen). Dann und nur dann ist es an der Zeit, den Code für die Verwendung von Generika umzugestalten. Jede Verwendung vor diesem Punkt ist Missbrauch in meinen Augen.


Das scheint etwas zu pedantisch zu klingen, also möchte ich Sie daran erinnern:
Es gibt keine Regel ohne Ausnahmen bei der Programmierung. Diese Regel enthalten.

Der Code sieht seltsam aus. Aber wenn wir es aufrufen, sieht es besser aus, den Typ als generisch anzugeben.

https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp

Persönlich mag ich diese Verzerrungen nicht, die den aufrufenden Code hübsch aussehen lassen. Zum Beispiel die ganze 'fließende' Sache und die Erweiterungsmethoden.

Aber Sie müssen zugeben, dass es eine beliebte Anhängerschaft hat. Sogar Microsoft verwendet es zum Beispiel in Einheit

container.RegisterType<IInterface,Concrete>()
0
Ewan

Für mich sieht es so aus, als ob Sie hier auf dem richtigen Weg waren, aber den Job nicht beendet haben.

Haben Sie darüber nachgedacht, das object[] Parameter zu Func<T,object>[] für den nächsten Schritt?

0
sq33G