Elimina sentencias if/else y switch con el Patrón Estrategia

Elimina sentencias if/else y switch con el Patrón Estrategia

Deja una respuesta

Comment as a guest.

  1. Excelente Post! Me ayudó para implementar un switch como de 31 condiciones para autenticación y registro que a su vez se factorizó a un menor número de condiciones gracias a haber desglosado así por partes. «Divide y vencerás».

  2. Fabuloso, ya estoy pensando en aplicarlo en una app de transacciones donde tienen varios tipos y cada una tiene una lógica diferente.

  3. Muy buen contenido de altisima calidad! Solo para agregar esto aparte nos ayuda a tener implementaciones abiertas a modificaciones, osea nuevos tipos de cupon, pero cerrado a modoficaciones y tambien a mantener en algun grado responsabilidades divididas hasta cierto punto permite la implementacion de la S y la O jajaja para los que les gusta SOLID que para mi es una orientacion mas no veo positivo tener todas las letras, me facino el articulo y solo pregunta llama a tipodecupon::aplicar por el facades que crea una nueva instancia del objeto verdad?

    1. Muchas gracias loco! Si, tal cual como dice se está utilizando la S y la O de los principios SOLID. Y si, no es necesario aplicar todos los principios en una misma implementación.
      Si, estoy utilizando una fachada en tiempo real por eso utilizo directamente TipoDeCupon::aplicar().
      Lo que hace internamente Laravel con las fachadas en tiempo real es crear una clase para manejar los métodos de tu clase (en este caso TipoDeCupon) cómo métodos estáticos.
      Básicamente, nos ahorra tener que instancias la clase 😄

  4. Hola, no le veo el beneficio, solo basta que te digan que el cupón debe estar en la base de datos, y no estar haciendo archivos, eso ya lo implementa Magento, Prestashop, Shopify, creas los cupones y dependiendo de varios factores se aplica, y no lo hacen de la manera que pones

    1. Estás hablando de algo muuuy diferente. Cuando te toque implementar una lógica compleja de programación y no un CMS capaz la veas. Saludos.

  5. Muy buen articulo, este tipo de patrón estrategia, seria utilizable también para hacer una selección de tipo de pago en el caso de aceptar pagos por ejemplo con paypal via api, stripe, diferentes tipos de criptomonedas… Cierto?

  6. Excelente! Me dio una idea bastante más clara de como abordar una aplicación donde cada objeto debe tener una lógica diferente, pero pertenecer a la misma clase. Saludos!

  7. Hola Matias, dos preguntas. Por qué la clase contexto ? Desde la misma clase TiposDeCupon no era suficiente para llamar el tipo de cupón que se necesita ? la segunda ? Porque pasas una variable cupon de tipo Cupon como parámetro en el método aplicar de TiposdeCupon ? Cuál sería la intención de eso ? Gracias

    1. Cómo estas Joel?
      Tu primer pregunta surge bastante seguido así que, muchas gracias por hacerla. Como vos decís, en este si se podría haber obviado la clase Contexto y, si lo hubiera obviado, el contexto sería el método aplicar(). ¿Qué quiere decir esto? Que los patrones no deben aplicarse a raja tabla como están expuestos en el libro de Erich Gamma. Si no serían muy poco flexibles. En mi ejemplo puse la versión «full» como la que figura en el libro para que se entienda la idea. Lo importante es eso, entender la idea de cada patrón.

      Con respecto a la segunda pregunta, paso la variable $cupon porque el descuento se va a aplicar a dicho cupón. Mira la clase DosPorUnoEstrategia donde trato la variable $cupon.

      Cualquier duda, vuelve a preguntar.
      Saludos.

  8. Buen dia Matias, esto tambien lo puedes realizar con el patron factoria, entonces cual es la diferencias? los multiples if? ya que por el tipo de cupon necesitas una clase diferente y tambien usando el patron factory igualmente esta desacoplado ya que si se tiene que modificar diferentes tipos de cupones se puede modificar de forma independiente, entonces tambien se podria hacerlo de esa forma o no estaria bien aplicar este patron?

    1. Claro, es valido lo que decís porque varios patrones se parecen entre sí. Es más, si mal no recuerdo, el diagrama del patrón States es exactamente igual al de Strategy.
      Entonces, ¿qué patrón usar? La decisión te la definición del patrón.
      Primero que el Factory es un patrón de los llamados de «Construcción» y los otros dos son de «Comportamiento».
      Entonces el Factory acá no aplica porque no tenemos que construir objetos para solucionar el problema.
      ¿Y el State? Tampoco, porque el State aplica una lógica cuando el estado de un objeto cambia.
      ¿Y por qué el Strategy? Porque el patrón dice, cuando tengas varios comportamientos distintos, separalos en distintas clases.
      Su definición aplica justo para el problema que se intenta resolver.

      Espero haber respondido tu consulta. Y si no, volve a preguntar 🙂

  9. Buenisimo, amigo. Muchas veces habia lidiado con códigos que usaban ese patron, y me era muy dificil comprenderlo. Y mas dificil aun tratar de adactarme, ya lo has dejado todo muy claro y con un ejemplo practico secillo y bien explicado. Me interesa muchisimo seguir practicas de programación orientada a exponer la secilles y escalado de la codificación. Nos abre puertas, no dude en recomendarme otras lecturas. Mis saludos y gracias por este articulo.

Sliding Sidebar

Matias Echazarreta

¡Hola!

Mi nombre es Matias Echazarreta.
Soy desarrollador web con más de 12 años de experiencia. Amante de Laravel, de los libros y del rock de los ’90. Te puedes comunicar conmigo  por trabajos de contratación, haciendo click aquí.

Nuestro Patreon

Desde Patreon puedes solicitar asesoria personalizado. ¡Ir a Patreon!

Suscríbete a nuestra lista de correo