2010-02-24 19 views
7

Por lo que he leído sobre los métodos de extensión, se encontrará con problemas si la clase base decide agregar un método con el mismo nombre que su extensión. Para una clase específica, generalmente no es difícil elegir un nombre para evitar enfrentamientos, sin embargo, los métodos de extensión se pueden agregar a las interfaces, lo que agrega infinitamente más posibilidades de conflictos.¿Deben los métodos de extensión tener un prefijo?

En Objective-C (con su versión, categorías), este problema se evita al agregar un prefijo antes de cada método. Sé que podemos definir métodos de extensión en espacios de nombres para que podamos controlar si son importados o no, pero esto solo resuelve el problema de los choques entre los métodos de extensión, en lugar de los enfrentamientos entre un método de extensión y la clase base.

Actualización:

Nadie, en realidad menciona esto, pero los métodos de extensión aren't virtual. Eso significa que si puede i.myExtension() en una interfaz i, entonces siempre llamará al método de clases de interfaz, por lo que no se llamará al método de subclase (que podría tener un propósito diferente). Entonces, en general, usar métodos de extensión es bastante seguro.

Respuesta

8

El uso de un prefijo hará que el código feo, lo que elimina parte del valor de un método de extensión.

Lo recomiendo en cambio, teniendo cuidado de no crear una gran cantidad de métodos de extensión y usar nombres de método que tengan sentido. De esta forma, en el caso de un conflicto, es más probable que, por ejemplo, el método de extensión Where y el método conflictivo Where tengan una semántica similar.

+1

+1 ... Creo que los métodos de extensión se abusan con demasiada frecuencia. – Josh

6

La convención común es tenerlos en su propio espacio de nombres (generalmente en forma de <something>.Extensions) que luego puede usar para decidir si los usa en algún fragmento de código que contenga tipos que las extensiones operan normalmente. en.

Además, si tiene un conflicto, recuerde que los métodos de extensión son métodos estáticos, por lo que siempre puede llamarlos explícitamente en el caso de un conflicto de nombre.

Sin embargo, si encuentra que con frecuencia se encuentra con conflictos de nombres, puede que desee reconsiderar los nombres que está eligiendo para que no interfieran con los nombres que ya existen en el tipo.

Para resumir, no, no debe incluir los nombres de los métodos de extensión en C#, ya que solo sirven para ocultar su código y dificultar su mantenimiento.

5

Si la clase base implementa un método con el mismo nombre que su extensión, supongo que tendría una de estas dos situaciones:

  1. La clase base implementa la misma funcionalidad estuviera agregando a sí mismo con un método de extensión. Ya no necesitas el método de extensión. Eliminarlo y utilizar el método en la clase base en su lugar.
  2. La clase base implementó algo diferente de lo que quería pero le dio el mismo nombre. O usted o ellos están usando el nombre incorrecto. Probablemente tú. Cambie el nombre de su método de extensión a algo que describa lo que realmente hace la función.
+0

Existe una buena posibilidad de que los métodos con el mismo nombre hagan casi lo mismo, pero también es posible que difieran de una manera pequeña – Casebash

1

Me inclino a decir que no, a menos que tenga una buena razón para sospechar que la firma del método que está utilizando va a implementarse. La razón por la que creo que esto es ...

  • Es muy poco probable que la firma de su método se duplique en la mayoría de los casos.
  • Si lo hace, siempre se debe detectar en pruebas unitarias.
  • Debería ser trivial para solucionarlo.

Normalmente, opto por nombres de métodos relativamente detallados al implementar métodos de extensión para evitar confusiones.

Cuestiones relacionadas