python - software - strategy pattern django
Python: elegir entre módulos y clases (7)
¿Por qué no ir con una instancia de esa clase? De esta forma, es posible que incluso más adelante pueda ejecutar 2 "sesiones" diferentes, dependiendo de la instancia que utilice. Podría hacerlo más flexible. Tal vez agregue algún método get_appstate()
al módulo para que instancia la clase una vez. Más adelante, si desea varias instancias, puede cambiar este método para eventualmente tomar un parámetro y usar algún diccionario, etc., para almacenar esas instancias.
También podría usar decoradores de propiedades para que todo sea más legible y tenga la flexibilidad de almacenarlo cómo y dónde quiera que se almacene.
Estoy de acuerdo en que sería más pitónico usar el enfoque de módulo en lugar de classmethods.
Por cierto, no soy tan fanático de tener cosas disponibles globalmente por alguna "magia". Prefiero usar alguna llamada explícita para obtener esa información. Entonces sé de dónde vienen las cosas y cómo depurarlo cuando las cosas fallan.
En mi aplicación, tengo que mantener algunos métodos globales de estado de aplicación y de aplicación global, como los usuarios conectados actualmente, el número total de respuestas, crear un archivo de configuración de aplicación, etc. Hay dos opciones:
Cree un archivo appstate.py separado con variables globales con funciones sobre ellos. Se ve bien al principio, pero parece que me falta algo en la claridad de mi código.
Cree un AppState de clase con funciones de clase en un archivo appstate.py, todos los demás módulos han sido definidos por sus trabajos específicos. Esto se ve bien. Pero ahora tengo que escribir una línea más larga como appstate.AppState.get_user_list (). Además, los métodos no están tan relacionados entre sí. Puedo crear clases separadas, pero eso sería demasiadas clases.
EDITAR: Si uso clases, usaré classmethods. No creo que sea necesario crear una instancia de la clase para un objeto.
Considera este ejemplo:
configuration
|
+-> graphics
| |
| +-> 3D
| |
| +-> 2D
|
+-> sound
La verdadera pregunta es: ¿Cuál es la diferencia entre clases y módulos en esta jerarquía, ya que podría representarse por ambos medios?
Las clases representan tipos. Si implementa su solución con clases en lugar de módulos, puede verificar un objeto de gráficos por su tipo correcto, pero escribir funciones gráficas genéricas.
Con las clases puedes generar valores parametrizados. Esto significa que es posible inicializar de manera diferente la clase de sonidos con un constructor, pero es difícil inicializar un módulo con diferentes parámetros.
El punto es que realmente es algo diferente desde el punto de vista del modelado.
Definitivamente iría por la segunda opción: después de haber usado la primera, ahora estoy obligado a refactorizar, ya que mi aplicación evolucionó y tengo que soportar más construcciones modulares, por lo que ahora necesito manejar múltiples ''configuraciones'' simulaneas.
El segundo enfoque es, IMO, más flexible y a prueba de futuro. Para evitar las líneas de código más largas, puede usar from appstate import AppState
lugar de simplemente import appstate
.
El segundo enfoque es solo significativamente diferente del primer enfoque si tiene el estado de la aplicación almacenado en una instancia de AppState, en cuyo caso su reclamo no se aplica. Si solo estás almacenando cosas en una clase y usando métodos estáticos / de clase, tu clase no es diferente a un módulo, y sería pitónico tenerla como un módulo en realidad.
El segundo enfoque parece mejor. Usaría el primero solo para archivos de configuración o algo así.
De todos modos, para evitar el problema, siempre puedes:
from myapp.appstate import AppState
De esa forma ya no tienes que escribir la línea larga.
Me gustaría ir con la ruta de clases ya que organizará mejor tu código. Recuerde que para la legibilidad puede hacer esto:
from appstate import AppSate
Suena como el enigma clásico :-) En Python, no hay nada sucio o vergonzoso sobre elegir usar un módulo si ese es el mejor enfoque. Después de todo, los módulos, funciones y similares son, de hecho, ciudadanos de primera clase en el idioma y ofrecen introspección y otras propiedades que muchos otros idiomas usan para obtener objetos.
La forma en que describió sus opciones, parece que en este caso no está demasiado loco por un enfoque basado en la clase.
No sé si usaste el marco de trabajo de Django, pero si no echas un vistazo a su documentación sobre cómo manejan la configuración. Estos son para toda la aplicación, están definidos en un módulo y están disponibles globalmente. La forma en que analizan las opciones y las exponen globalmente es bastante elegante, y puede encontrar un enfoque que inspire sus necesidades.