2010-02-02 17 views
9

Me gustaría saber si el método de extensión C# se basa en cualquier patrón de diseño existente.C# Métodos de extensión - patrones de diseño

+0

No utilice en exceso los métodos de extensión, consulte esta entrada Blog de Eric Lipperts "foreach V's ForEach" http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

Respuesta

11

Un patrón de diseño es simplemente un paradigma bien conocido, es decir, "cuando quiere lograr X, haga Y". Un paradigma bien conocido en lenguajes orientados a objetos como C# es "cuando desee actuar sobre el estado de un objeto, llame a un método en una instancia de este".

Sin embargo, antes de crear métodos de extensión, no podía invocar su propio método en una instancia de un objeto al que no podía agregar una implementación (por ejemplo, interfaces porque no pueden tener implementaciones o clases de biblioteca porque ya están compiladas)) Los métodos de extensión llenan este vacío al permitir que los métodos que aparezcan como se puedan llamar en instancias de objetos, mientras se definen externamente para la implementación del objeto.

Así que sí, podría decirse que los métodos de extensión se basan en este patrón de diseño muy simple, que hace que los métodos que actúan sobre el estado de un objeto parezcan exigibles a partir de una instancia de este.

4

No. Es solo una característica de idioma.

+0

Puede ser ambos. Por ejemplo, los delegados son una característica del lenguaje C# que habilita el patrón Publisher-Subscriber. – Anthony

0

Por supuesto, puede utilizar los métodos de extensión C# si desea implementar ciertos patrones de diseño. Por ejemplo, simule mixins en C#.

0

no me etiquetar métodos de extensión como cualquiera de los patrones de diseño comunes, pero puede ser utilizado para implementar patrones como, decorador y el adaptador etc ..

1

Ellos no se basan en un patrón de diseño existente. Cuando esta 'característica' se introdujo por primera vez en Delphi, bajo el nombre 'class helpers', Borland incluso advirtió a los usuarios que se alejaran de ellos. They were considered a bit of a hack, pero ahora que el polvo se ha asentado, han encontrado un lugar propio.

Como todo lo demás, utilícelo cuando corresponda.

1

No, no lo son, porque solo son azúcar sintáctico.

+0

bien hablando, los métodos de extensión son _not_ azucarero. Pero su capacidad para llamarlos con la misma sintaxis que los métodos de instancia es. –

+1

Si no me cree, puede simplemente intentar encontrar en google esta frase: "métodos de extensión es azúcar sintáctico" y puede encontrar cientos de enlaces que prueban mi opinión. –

+1

Runa, sin esta capacidad los métodos de extensión son solo métodos estáticos regulares. "Su capacidad para llamarlos con la misma sintaxis que los métodos de instancia" * es * la única característica de los métodos de extensión, y como usted mismo dijo, esta característica es azúcar sintáctica. –

8

Los métodos de extensión se pueden considerar como un reemplazo del Visitor Pattern. También se propone que se puedan usar como Adapters.

En general, los idiomas evolucionan para hacer que la necesidad de patrones de diseño sea menos necesaria. Hay una cita, por ejemplo, que Lisp no necesita patrones de diseño, porque todo está construido en el lenguaje. Entonces, la pregunta correcta será, ¿qué patrones de diseño reemplazan los métodos de extensión?

+1

Más exactamente, los idiomas (buenos) tienden a evolucionar para agilizar el uso de patrones de diseño populares. También tenga en cuenta que nunca puede evitar el uso de patrones de diseño, cada diseño es un patrón de diseño de algún tipo, el lenguaje de los patrones de diseño es solo una manera de formalizar esta idea y promover el uso de ciertos patrones bien conocidos y probados (de la misma manera que un arco o un contrafuerte es un patrón de diseño bien conocido en la arquitectura). – Wedge

1

No, pero los métodos de extensión son excelentes para implementar ciertos patrones de diseño de GoF (p. Ej., Prototipo).

0

El mejor patrón de diseño que coincide con el método de extensión es el patrón de fachada. Mi razón: Usualmente usamos métodos de extensión para no introducir una nueva funcionalidad más allá de la responsabilidad de la clase objetivo, pero simplificando el uso de la clase objetivo existente. Debido a que la simplificación del uso de la clase de destino es la preocupación del patrón de fachada, los métodos de extensión alternativamente se pueden implementar utilizando el patrón de fachada. Existen algunos problemas para extender y probar los métodos de extensión de prueba. Así que creo que la implementación del patrón de fachada es un mejor enfoque contra el uso de métodos de extensión. Sin embargo, es posible implementar algunos métodos de extensión que envuelven la interfaz de fachada para proporcionar un recurso de codificación para los códigos de cliente.

+0

¿Podría elaborar su respuesta para explicar por qué? – slfan