Archivo de la etiqueta: solid

¿Cuál es la diferencia entre el patrón strategy y state?

El jueves pasado estuvimos viendo temas de polimorfismo en el curso Elementos avanzados de arquitectura de software con objetos y, al cabo de un ejemplo, yo plantee que lo que habíamos visto era el patrón State. Hernán me puso cara de “no tanto” y sospecho que en próximas clases entenderé el porqué.

Sin embargo surgió un mini debate con unos de mis compañeros de curso: el argumentaba que en realidad lo que habíamos visto era el patrón Strategy. Creo que esta es una duda común porque ambos patrones son parecidos en algunos aspectos de la implementación y en el diagrama de clases pero son conceptualmente distintos, por lo tanto me pareció bueno escribir un pequeño post.

El patrón State permite hacer diferentes cosas dependiendo del estado del objeto. En otras palabras, lo que cambia de acuerdo al estado es que se hace. Además, todas las posibilidades están incluidas en el código del modelo. A la hora de agregar nuevos estados y su correspondiente acción asociada basta con agregar una subclase sin tocar las demás (observando el Open-Close principle).

En cambio el patrón Strategy permite hacer lo mismo de diferentes maneras. En otras palabras, lo que cambia es como se hace. Este patrón usualmente permite que la implementación específica (la estrategia) se pueda seleccionar por configuración, por el estado de cierto objeto, etc.

Les dejo algunos links en inglés que aportan mas detalles:

http://stackoverflow.com/questions/1658192/what-is-the-difference-between-strategy-design-pattern-and-state-design-pattern

http://www.c-sharpcorner.com/UploadFile/rmcochran/strategy_state01172007114905AM/strategy_state.aspx

http://c2.com/cgi/wiki?StrategyPattern

[PDF] http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf

Principios SOLID 1, ejemplo con SRP, DIP y OCP

Les presento el primero de una serie de videos donde repetiré los refactorings basados en principios SOLID que mostré en la VAN de AltNetHispano. La ventaja que tienen estos videos sobre los de la VAN es que estan particionados, uno para cada ejemplo y vienen acompañados con el código fuente antes y después del ejercicio.

El repositorio de código fuente podrán encontralo en aquí y, una vez descargado, deberían ejecutar el siguiente comando para que quede tal como lo ven al principio del ejemplo:

$ git checkout ejemplos-base

Este comando posiciona el repositorio en el tag “ejemplos-base”, para dejarlo tal como queda al final de este ejemplo:

$ git checkout ejemplos-verificador

Mas abajo comento ciertos momentos interesantes en el video para aquellos que deseen un acceso directo.

En el minuto 1:20 presento el ejemplo del verificador.

En el minuto 3:45 explico el refactoring aplicando el principio de responsabilidad única (SRP).

En el minuto 6:35, una vez concluido el refactoring anterior, comienzo a analizar el código para identificar otro problema de diseño. Explico el principio de inversion de dependencias (DIP) y como aplicarlo al ejemplo.

En el minuto 11:10 doy un paso más con un problema de diseño mas sutil que termina con la descripción y aplicación al ejemplo del principio abierto-cerrado (OCP).

En el minuto 16:15 repaso los refactorings aplicados.

Si tuvieran alguna consulta o duda, no duden en contactarme.

Nos vemos.

VAN sobre principios SOLID en AltNetHispano

El sábado pasado participé como ponente en una VAN (reunión virtual) de AltNetHispano sobre principios SOLID (uno de los temas que más me gusta de esta profesión). Aquí podrán encontrar el listado completo de videos de VANs o verla directamente aquí:

Presentación: aquí. Código antes de aplicar los refactorings: aquí.

Les dejo el video gentilmente editado por la gente de AltNetHispano, si quieren un adelanto, lean el resumen que dejo abajo.

Quiero compartir en este post es un breve resumen sobre los temas que surgieron como preguntas y las repercusiones con el fin de que sirva de guia para aquel que quiera ver el video de 2 horas y algo más.

Mostré 3 o 4 ejemplos de código real de alguno de mis proyectos o extractado de algún caso real de clientes de consultoría.

En el primer ejemplo transformamos una clase que violaba claramente el principio de responsabilidad única. Separamos el código en dos clases. Luego avanzamos un poco más sobre el caso analizando una violación al principio de inversión de la dependencia y también codificamos una solución.

En el segundo ejemplo tomamos como base una consulta hecha por Edgar Ramos la lista de AltNetHispano, en el que planteaba un problema que me pareció muy útil para demostrar el principio abierto-cerrado.

El tercer ejemplo vimos el principio de segregación de interfaces. Presenté una refactorización del patrón repositorio separándolo en un repositorio básico basado en generics y uno o más Enhanced Query Objects del gran @fabiomaulo (el gran ausente de la VAN, el pobre estaba sin PC, parece).

Hablando sobre el ejemplo anterior conté una anécdota sobre un reemplazo de repositorios que tuvimos que encarar (desde IBatis.NET a NHibernate) y nos costó bastante por estar en clara violación del principio de sustitucion de Liskov.

El cuarto ejemplo fue una respuesta a la consulta de un colega sobre un procesador de archivos basado en reglas que fuera configurable. Propuse una solución basada en interfaces y Windsor como container de inyección de dependencias.

Tanto durante la VAN como en twitter (aquí y aquí) surgieron comentarios interesantes y preguntas (ver repercusión aquí). Sobre todo esto trataré de escribir posts ampliando mis respuestas.

Por último los comentarios que me llenan de orgullo (aquí, aquí y aquí) puesto que vienen de mis colegas, a los cuales también respeto mucho.

Si lo desean pueden descargar la presentación y la

Referencias:

[1] http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
[2] http://en.wikipedia.org/wiki/Solid_(object-oriented_design)
[3] http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx
[4] http://blogs.msdn.com/b/cdndevs/archive/2009/07/15/the-solid-principles-explained-with-motivational-posters.aspx
[5] http://cdn.cloudfiles.mosso.com/c82752/pablos_solid_ebook.pdf
[6] http://www.hanselminutes.com/default.aspx?showID=163

Gracias a todos.