[pyar] Patrones de diseño: Strategy

Luis Andraschnik luis.andraschnik en gmail.com
Mie Feb 21 08:19:51 -03 2018


Hola Ivan

Esoes muy parecido a lo que hice sólo con funciones, ya que lo que quiero
evitar es a priori saber que función tengo que utilizar sin recurrir a
if..else, y que el programa "calcule" que función va a usar según el
contexto.

Saludos!
Luis

El 20 de febrero de 2018, 19:56, ivan almandoz <alialmandoz en gmail.com>
escribió:

> hola luis, te paso un snipet que te dejaría hacer lo que necesitas.
> espero te sirva:
>
> class StrategyEjemplo:
>     def __init__(self, func=None):
>         if func:
>             self.execute = func
>
>     def execute(self):
>         print("ningun formato elegido")
>
>
> def leer_png(archivo):
>     print('leyendo formato {0}'.format(archivo))
>
>
> def leer_jpg(archivo):
>     print('leyendo formato {0}'.format(archivo))
>
>
> def leer_pdf(archivo):
>     print('leyendo formato {0}'.format(archivo))
>
>
> if __name__ == "__main__":
>     strat0 = StrategyEjemplo()
>     strat1 = StrategyEjemplo(lambda: leer_jpg('jpg'))
>     strat2 = StrategyEjemplo(lambda: leer_pdf('pdf'))
>     strat3 = StrategyEjemplo(lambda: leer_png('png'))
>
>     strat0.execute()
>     strat1.execute()
>     strat2.execute()
>     strat3.execute()
>
>
>
> El 20 de febrero de 2018, 16:44, Luis Andraschnik <
> luis.andraschnik en gmail.com> escribió:
>
>> Hola grupo!!
>>
>> Leí sobre el patrón de diseño Strategy, más allá de que puede ser
>> implementado por funciones sin necesidad de recurrir a clases y que los
>> patrones de diseño son lenguaje-dependientes, veo que en muchos textos
>> indica que evita el uso de un largo if ..else if ...,
>>
>> No obstante no veo que se evite if ...else if ...  , salvo que se
>> invoquen explícitamente las funciones. Por ejemplo :
>>
>> def leer_png(archivo):
>>
>>     print(''leí {} png".format(archivo))
>>
>> def leer_jpg():
>>
>>     print('leí {} jpg".format(archivo))
>>
>> def leer_pdf():
>>
>>     print('leí {} pdf".format(archivo))
>>
>>
>> def imprimir(file, leer):
>>
>>     leer(file)
>>
>>
>> Ejemplo de llamado explícito
>>
>> imprimir("archivo.pdf", leer_pdf)
>>
>> bárbaro pero muy poco util porque yo no sé de antemano que voy a leer,
>> entonces redefino imprimir()
>>
>>
>> def imprimir(archivo_cualquiera):
>>
>>     if archivo_cualquiera.endswith(".jpg"):
>>
>>         leer = leer_jpg
>>
>>     else if archivo_cualquiera.endswith(".png"):
>>
>>             leer=leer_png
>>
>>     else if archivo_cualquiera.endswith(".pdf"):
>>
>>             leer=leer_pdf
>>
>>     leer(archivo_cualquiera)
>>
>>
>> y entonces dónde es que se evita el if ..else. Y si quiero leer 80
>> formatos distintos???
>>
>>
>> Sé que puede implementarse un diccionario de funciones, similar a una
>> sentencia switch, pero no creo que se refieran a eso.
>>
>> Los ejemplos que leí siempre hacen un llamado explícito, pero en realida
>> dlo que interesa es como seleccionar la función que se pasa como parámetro
>> ...
>>
>> Me quedé pensando en esto y no le encuentro la solución o estoy
>> interpretando algo mal.
>>
>> Saluti
>>
>> Luis
>>
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180221/370e02b6/attachment-0001.html>


Más información sobre la lista de distribución pyar