2009-06-11 11 views
23

Me pregunto cuáles son los pros/contras de usar delegado vs OOP al implementar el patrón de diseño de estrategia?C# Patrón de diseño de estrategia por delegado vs OOP

¿Cuál recomienda? ¿o qué tipo de problema resuelve un delegado? y ¿por qué deberíamos usar OOP si OOP es mejor?

Gracias!

-tep

Respuesta

36

Ambas técnicas pueden ser poderosas y valiosas. Estas son algunas de mis opiniones sobre cuándo usarlas.

uso de un enfoque de interfaz/Aplicación cuando la estrategia:

  1. mantiene el estado de configuración
  2. necesidades
  3. utiliza la inyección de dependencia
  4. necesita ser configurado por un IoC contenedor (pensar ConnectionProvider)
  5. combina múltiples responsabilidades (piense DataAdapter de ADO.NET)
  6. es demasiado complejo o siempre que un único método
  7. es probable que sea una subclase para crear nuevas estrategias
  8. necesidades para devolver información de estado a la persona que llama
  9. necesidades de acceso a partes internas del objeto se aplica a
  10. requeriría demasiados parámetros directos

de lo contrario, tienden a utilizar delegados basados ​​en Func <> Acción o <>, especialmente si

  1. No es probable que sean una gran variedad de estrategias (piensa ordenar expresiones)
  2. La estrategia se expresa mejor como como lambda
  3. Hay un método existente que desea aprovechar
2

me gusta usar una interfaz de abstraer mi estrategia. Mis implementaciones concretas tienen un archivo visible para cada estrategia. Cuando trabajas con una clase en lugar de un método, te brinda más flexibilidad. Puedo usar los simulacros de Rhino para burlarme de la estrategia para probar a su alrededor. También puedo usar marcos de DI como Ninject para enlazar la aplicación de estrategia de forma muy sencilla. Uso Delegados para extraer la implementación principalmente en cuadros de diálogo de WinForm.

15

En favor de los delegados:

  • Los delegados son más fáciles de implementar de una manera ligera utilizando expresiones lambda y métodos dinámicos
  • delegados pueden crearse a partir de métodos "normales" con la firma derecha
  • Los delegados son multi-echados puede ser útil a veces (aunque relativamente rara fuera de concurso completo)

A favor de las interfaces:

  • un objeto puede implementar una interfaz y todavía lo hacen otras cosas: un delegado es simplemente un delegado
  • un interfac e puede tener múltiples métodos; un delegado solo tiene un

Podría ir en cualquier dirección:

  • Con interfaces que terminan con dos nombres: la interfaz y el método. Con los delegados solo tienes uno. A menudo me parece que las interfaces de un solo método de repetir el mismo nombre dos veces (con variaciones) o el nombre del método es muy soso

Personalmente soy un gran fan de los delegados por su flexibilidad, pero realmente depende de la situación.

6

En mi opinión, si usa delegados, entonces en realidad no está implementando el Strategy pattern. En realidad está implementando algo más parecido al Observer pattern. El objetivo de los patrones de diseño es que cuando dices "he utilizado el patrón de estrategia aquí", todos tienen mucho contexto sobre lo que has hecho. Cuando comienzas a decir cosas como "He usado el patrón de Estrategia, excepto con mis propias modificaciones personales", entonces las cosas se ponen feas.

Pero, si entiendo lo que está tratando de decir, una de las cosas buenas del patrón de estrategia que no es tan clara entre los delegados es que puede tener una jerarquía de objetos que implementen una estrategia.

Digamos que estoy probando algún software. Quiero probarlo usando el mouse y usando el teclado. Así que implementaré un patrón de Estrategia para conectar el método de interfaz que se usará para cada caso de prueba ... para poder escribir el caso de prueba una vez y ejecutarlo completamente utilizando MouseStrategy y KeyboardStrategy. Desde allí puedo implementar especializaciones como MouseExceptForDialogsStrategy, una especialización de MouseStrategy. Este tipo de jerarquía, cómo extenderlo y anularlo es fácil de entender para cualquiera que esté familiarizado con los conceptos de OOP ... mientras que la forma de lograr y extender lo mismo con los delegados es mucho más complicado y mucho más oscuro.

Como en muchas cosas ... no se trata de "¿puedes hacerlo?", Sino de "¿deberías hacerlo?".

Cuestiones relacionadas