[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