Sollten Erweiterungsmethoden ein Präfix haben?

6

Nach dem, was ich über Erweiterungsmethoden gelesen habe, werden Sie Probleme bekommen, wenn die Basisklasse beschließt, eine Methode mit demselben Namen wie Ihre Erweiterung hinzuzufügen. Für eine bestimmte Klasse ist es normalerweise nicht schwierig, einen Namen zu wählen, um Konflikte zu vermeiden, jedoch können Erweiterungsmethoden zu Schnittstellen hinzugefügt werden, was unendlich mehr Konfliktpotential hinzufügt.

In Objective-C (mit ihrer Version, Kategorien) wird dieses Problem vermieden, indem vor jeder Methode ein Präfix hinzugefügt wird. Ich weiß, dass wir Erweiterungsmethoden in Namespaces definieren können, so dass wir kontrollieren können, ob sie importiert werden oder nicht, aber dies löst nur das Problem von Konflikten zwischen Erweiterungsmethoden und nicht zwischen einer Erweiterungsmethode und der Basisklasse.

Aktualisierung:

Niemand hat das tatsächlich erwähnt, aber die Erweiterungsmethoden sind nicht virtuell . Das heißt, wenn Sie i.myExtension () auf einer Schnittstelle i ausführen können, ruft sie immer die Methode interface classes auf, so dass die Methode der Unterklasse (die eine andere Absicht haben könnte) nicht aufgerufen wird. Insgesamt ist die Verwendung von Erweiterungsmethoden ziemlich sicher.

    
Casebash 24.02.2010, 22:37
quelle

4 Antworten

8

Die Verwendung eines Präfixes wird den Code hässlich machen, was etwas von dem Wert einer Erweiterungsmethode entfernt.

Ich empfehle stattdessen, darauf zu achten, keine große Anzahl von Erweiterungsmethoden zu erstellen und sinnvolle Methodennamen zu verwenden. Auf diese Weise ist es im Falle eines Konflikts wahrscheinlicher, dass zum Beispiel die Erweiterung Where -Methode und die in Konflikt stehende Where -Methode eine ähnliche Semantik haben.

    
John Saunders 24.02.2010, 22:42
quelle
6

Die allgemeine Konvention besteht darin, sie in einem eigenen separaten Namespace (normalerweise in der Form <something>.Extensions ) zu haben, mit dem Sie entscheiden können, ob Sie sie in einem bestimmten Codeabschnitt verwenden, der normalerweise die Typen der Erweiterungen enthält weitermachen.

Wenn Sie einen Konflikt haben, denken Sie daran, dass Erweiterungsmethoden immer noch statische Methoden sind, sodass Sie sie im Falle eines Namenskonflikts immer explizit aufrufen können.

Wenn Sie jedoch feststellen, dass häufig Namenskonflikte auftreten, sollten Sie die Namen, die Sie auswählen, überdenken, damit sie die bereits vorhandenen Namen nicht stören.

Zusammenfassend no sollten Sie die Namen der Erweiterungsmethoden in C # nicht als Präfix verwenden, da sie nur dazu dienen, Ihren Code zu verschleiern und die Pflege schwieriger zu machen.

    
casperOne 24.02.2010 22:42
quelle
5

Wenn die Basisklasse eine Methode mit demselben Namen wie Ihre Erweiterung implementiert, würde ich vermuten, dass Sie eines dieser beiden Szenarien haben:

  1. Die Basisklasse hat dieselbe Funktionalität implementiert, die Sie selbst mit einer Erweiterungsmethode hinzugefügt haben. Sie benötigen die Erweiterungsmethode nicht mehr. Löschen Sie es und verwenden Sie stattdessen die Methode für die Basisklasse.
  2. Die Basisklasse hat etwas anderes als das, was Sie wollten, implementiert, aber sie hat denselben Namen erhalten. Entweder du oder sie benutzen den falschen Namen. Wahrscheinlich du. Benennen Sie Ihre Erweiterungsmethode in etwas um, das beschreibt, was die Funktion tatsächlich tut.
Mark Byers 24.02.2010 22:43
quelle
1

Ich bin geneigt, nein zu sagen, sie sollten nicht, außer Sie haben einen guten Grund zu vermuten, dass die von Ihnen verwendete Methodensignatur implementiert wird. Der Grund, warum ich das denke, ist ...

  • Es ist sehr unwahrscheinlich, dass Ihre Methodensignatur in den meisten Fällen dupliziert wird.
  • Wenn dies der Fall ist, sollte es immer in Komponententests erkannt werden.
  • Sollte einfach zu beheben sein.

Normalerweise wähle ich bei der Implementierung von Erweiterungsmethoden normalerweise relativ ausführliche Methodennamen, um Verwechslungen zu vermeiden.

    
Paul Creasey 24.02.2010 22:44
quelle

Tags und Links