[pyar] Patrones de diseño: Strategy

ivan almandoz alialmandoz en gmail.com
Mar Feb 20 19:56:20 -03 2018


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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180220/1a55fcc3/attachment-0001.html>


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