Presentacion (Era Definir Listas Globales)

Andres Moya Andres.Moya en hispalinux.es
Mie Mar 10 10:41:35 CET 2004


El mié, 10-03-2004 a las 08:33, Antonio Castro escribió:

> Yo tuve un problema de diseño recientemente en el cual la solución
> parecía pasar por usar variables globales entre determinadas funciones
> y se me ocurrió meter una clase con sus métodos dentro de una función.

> La idea era que funcionPrincipal() era demasiado grande para hacerlo
> en una única funcion y parecía necesario la cooperacion de varias
> funciones que pompartieran variables globales.

Buf, esa solución a mí me parece más fea todavía :P Lo de las
clases-función sólo es aconsejable en algunos casos particulares, pero
en general contradice la teoría de orientación a objetos, que dice que
un objeto es un tipo abstracto de datos.

Este caso se puede solucionar de maneras mejores. Por ejemplo, usando un
estilo procedural típico, lo más fácil es pasar esas variables como
parámetro:

  def funcionPrincipal(...):
    var1 = ...
    var2 = ...
    fun1(var1, var2)

  def fun1(var1, var2):
    ... # Si la función modifica las variables, hay que devolverlas al
        # final con return (en python se pueden devolver varios valores)

También es perfectamente válido hacer una clase con todo el conjunto. Si
quieres que algo no sea visible, pues lo haces privado y ya está. Y si
no quieres que desde fuera se tengan que ocupar de instanciar la clase,
pues la haces "singleton", por ejemplo, haciendo todos los métodos
estáticos:

  class MiClase(object):

    __var1 = ...
    __var2 = ...

    def funcionPrincipal():
      MiClase.__var1 = ...
      MiClase.__var2 = ...
      MiClase.__funci1()

    funcionPrincipal = staticmethod(funcionPrincipal)

    def __funci1():
      ...MiClase.__var1...

    __funci1 = staticmethod(__funci1)


(Por cierto, no me gusta nada la sintaxis de Python para cosas como
miembros privados o estáticos, creo que contradice la filosofía básica
de hacer cosas sencillas y elegantes. A ver si se les ocurre algo para
Python 3).

Hay una tercera manera, incluso más orientada a objetos, que se puede
hacer si var1 y var2 forman una estructura homogénea de datos (por
ejemplo, en un sistema de simulación de naves a lo mejor var1 y var2 son
las coordenadas y tamaño de una de las naves simuladas). En ese caso
podemos crear una clase que contenga var1 y var2, y los métodos para
operar con esos datos (por ejemplo, para saber la distancia a un sitio,
moverse hacia un punto determinado, calcular la inercia...).

Y luego escribimos la función principal que, posiblemente, por estar los
cálculos "menudos" ahora dentro de la clase, ahora salga más corta e
incluso pueda caber todo el algoritmo dentro de una única función.

  class Nave(object):
    def __init__(self, var1, var2):
      self.__var1 = var1
      self.__var2 = var2
    ...

    def metodo1(self):
       ...

  def funcionPrincipal():
    n = Nave(var1 = ..., var2 = ...)
    ...
    n.metodo1()
    ...

(si siguen haciendo falta varias funciones, pues pasamos la nave como
parámetro :)

-- 
Andres Moya <Andres.Moya en hispalinux.es>

Contra la guerra global permanente.
Foro Social Mundial - Otro mundo es posible.

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es