El uso excesivo de métodos de extensión es malo por la misma razón que el uso excesivo de operadores sobrecargados es malo. Déjame explicarte.
Primero veamos el ejemplo de sobrecarga del operador. Cuando vea el código:
var result = myFoo + myBar;
que le gustaría esperar que myFoo
y myBar
son tipos numéricos, y la operator +
es la realización de adición. Esto es lógico, intuitivo, fácil de entender. Pero una vez que la sobrecarga del operador entra en escena, ya no puede estar seguro de lo que myFoo + myBar
está realmente haciendo - el operador + podría estar sobrecargado en significar cualquier cosa. No puede simplemente leer el código y descubrir qué sucede sin tener que leer todo el código subyacente a los tipos implicados en la expresión. Ahora, operator +
ya está sobrecargado para tipos como String
o DateTime
- sin embargo, hay una interpretación intuitiva de lo que significa Además en esos casos. Más importante aún, en esos casos comunes, agrega mucho poder expresivo al código. Por lo tanto, vale la pena la posible confusión.
Entonces, ¿qué tiene que ver todo esto con los métodos de extensión? Bueno, los métodos de extensión introducen una situación similar.Sin métodos de extensión, cuando vean:
var result = myFoo.DoSomething();
se puede asumir que DoSomething()
es o bien un método de myFoo
o uno de ellos es las clases base. Esto es simple, fácil de entender, incluso intuitivo. Pero con los métodos de extensión, DoSomething()
podría definirse en cualquier lugar - y peor, la definición depende del conjunto de declaraciones using
en el archivo de código y traer potencialmente muchas clases a la mezcla, cualquiera de las cuales podría alojar la implementación de DoSomething()
.
Ahora no me malinterprete. Tanto la sobrecarga del operador como los métodos de extensión son funciones de lenguaje útiles y potentes. Pero recuerde: con gran potencia viene con una gran responsabilidad. Debe usar estas características cuando mejoran la claridad o la capacidad de la implementación. Si comienzas a usarlos indiscriminadamente, agregarán confusión, complejidad y posiblemente defectos a lo que intentas crear.
Tan irónico como este es, ese método de extensión podría colocarse justo al lado de mi método '.ForEach'! Me parece fácil de entender y mucho menos detallado que el bucle for, también sería imposible introducir accidentalmente el error off por 1 usando i
@Chris: En ese caso, solo usa foreach. La excelente publicación de Eric aquí explica los problemas con ForEach - http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –
Y, sin embargo, F # incluye 'Seq.iter' que es exactamente equivalente a un método de extensión 'IEnumerable .ForEach'. Conozco un lenguaje diferente, una filosofía de diseño diferente, pero el argumento sobre la producción de efectos secundarios aún podría aplicarse, y F # está mucho más cerca de ser funcionalmente "puro" que C#. –