Beim Überprüfen von Code habe ich festgestellt, dass die Möglichkeit besteht, ihn auf die Verwendung von Generika umzustellen. Der (verschleierte) Code sieht folgendermaßen aus:
public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
...
}
Dieser Code könnte 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:
- Schutz des Uneingeweihten (Entwicklers) vor Generika
- https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics
- https://codereview.stackexchange.com/q/60695
Meine Frage besteht aus zwei Teilen:
- Gibt es irgendwelche Vorteile, wenn Sie auf solche Generika umsteigen? (Leistung? Lesbarkeit?)
- Was ist Generika-Missbrauch? Und ist die Verwendung eines Generikums jedes Mal, wenn es einen Typparameter gibt, ein Missbrauch ?
Antworten:
Wenn Generika richtig angewendet werden, entfernen sie Code, anstatt ihn nur neu anzuordnen. Der Code, den Generika am besten entfernen können, ist in erster Linie Typumwandlung, Reflexion und dynamisches Schreiben. Daher könnte generischer Missbrauch im Vergleich zu einer nicht generischen Implementierung lose als das Erstellen von generischem Code definiert werden, ohne die Typisierung, Reflektion oder dynamische Typisierung wesentlich zu verringern.
In Bezug auf Ihr Beispiel würde ich eine angemessene Verwendung von Generika erwarten, um die
object[]
in eineT[]
oder ähnliche zu ändern und zu vermeidenType
odertype
insgesamt. Dies erfordert möglicherweise an anderer Stelle erhebliche Umgestaltungen. Wenn jedoch die Verwendung von Generika in diesem Fall angemessen ist, sollte dies insgesamt einfacher ausfallen, wenn Sie fertig sind.quelle
object[]
zuT[]
.Ich würde die No-Nonsense-Regel verwenden: Generics existieren, wie alle anderen Programmierkonstrukte, um ein Problem zu lösen . Wenn es kein Problem gibt, das für Generika gelöst werden kann, ist deren Verwendung Missbrauch.
Im speziellen Fall von Generika werden diese meistens von konkreten Typen weg abstrahiert, 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 einen Typ verwendet
Foo
. Sie können diesen Typ durch einen generischen ersetzenT
, aber wenn Sie diesen Code nur zum Arbeiten benötigenFoo
, gibt es einfach keinen anderen Code, mit dem Sie ihn zusammenfalten können. Es gibt also kein Problem, das gelöst werden muss. Die Indirektion des Hinzufügens des Generikums würde also nur dazu dienen, die Lesbarkeit zu verringern.Folglich würde ich vorschlagen, den Code nur ohne Verwendung von Generika zu schreiben, bis Sie die Notwendigkeit sehen, sie einzuführen (weil 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 in meinen Augen Missbrauch.
Das klingt ein bisschen zu umständlich, also möchte ich Sie daran erinnern:
Es gibt keine Regel ohne Ausnahmen bei der Programmierung. Diese Regel enthalten.
quelle
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 das ganze "fließende" Ding und die Erweiterungsmethoden.
Aber Sie müssen zugeben, dass es eine beliebte Anhängerschaft hat. Sogar Microsoft verwendet es zum Beispiel in Unity
quelle
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, den
object[]
ParameterFunc<T,object>[]
für den nächsten Schritt auf zu ändern ?quelle