Foros del Web » Programando para Internet » Python »

MVC o separar por módulos?

Estas en el tema de MVC o separar por módulos? en el foro de Python en Foros del Web. Se supone que la estructura Modelo-Vista-Controlador es más fácil de mantener pero en algunos casos tengo dudas y no se si es mejor aplicar la ...
  #1 (permalink)  
Antiguo 10/01/2013, 09:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
MVC o separar por módulos?

Se supone que la estructura Modelo-Vista-Controlador es más fácil de mantener pero en algunos casos tengo dudas y no se si es mejor aplicar la división por módulos clásica.

Por ejemplo si una parte del programa va a gestionar los usuarios, me parece que es más práctico (o tal vez más tradicional) tener todo lo referente a la gestión de usuarios en un mismo módulo independiente en lugar de tener las instrucciones desperdigadas en tres módulos diferentes (MVC)

De manera que cuando precise hacer cambios en esa parte del programa se que debo trabajar solo en ese módulo sin tocar los demás y no estar editando partes de código en tres módulos diferentes que además tienen instrucciones de otras partes del programa.

No se cuál es la experiencia de los demás.
  #2 (permalink)  
Antiguo 10/01/2013, 10:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: MVC o separar por módulos?

El concepto básico de MVC es mantener separado tu programa en 3 partes (o probablemente mas partes), que son la lógica y el almacenamiento (modelos), la presentación (vista) y la parte donde atas los eventos con los modelos y vistas (controladores).

En tu ejemplo en tu aplicación, podrías tener la gestión de usuario en 3 partes, donde es la lógica y almacenamiento de gestión de usuarios, la presentación que puede ser desde una interfaz en CLI o GUI hasta una plantilla web y los controladores que son los encargos de responder a ciertos eventos que el usuario haga. Por ejemplo click en un botón o submit en un formulario.

Otra propiedad importante de MVC es que trata que hagas las cosas independiente una de otra (mutuamente exclusivas).

Por ejemplo el hecho que modifiques un modelo, no va a afectar un controlador o a una vista. Así para cada uno de las 3 partes.

MVC ademas aplica la modularización (división por módulos) al igual que (regularmente) muchos patrones de diseño.

Por ultimo, no hay formas correctas o incorrectas de hacer las cosas en programación solamente hay formas. Pero solamente es la experiencia la que te dirá cual es la forma indicada.
  #3 (permalink)  
Antiguo 10/01/2013, 10:43
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Cita:
Iniciado por razpeitia Ver Mensaje
El concepto básico de MVC es mantener separado tu programa en 3 partes (o probablemente mas partes), que son la lógica y el almacenamiento (modelos), la presentación (vista) y la parte donde atas los eventos con los modelos y vistas (controladores).
Entiendo perfecto tu aporte y sobre todo

"Por ultimo, no hay formas correctas o incorrectas de hacer las cosas en programación solamente hay formas. Pero solamente es la experiencia la que te dirá cual es la forma indicada."

Tiene sentido.

Recomiendas algún libro o manual sobre técnicas de diseño de software? Me refiero en general, independiente del lenguaje?
  #4 (permalink)  
Antiguo 10/01/2013, 11:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: MVC o separar por módulos?

Te recomiendo solo los libros que he leído:

The pragmatic programmer
Code Complete 2
Design patterns elements of reusable object-oriented software

Regularmente estos libros usan ejemplos en C++, VB, Java o Scala pero son conceptos que te sirven para cualquier lenguaje.
  #5 (permalink)  
Antiguo 11/01/2013, 15:30
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Cita:
Iniciado por razpeitia Ver Mensaje
Te recomiendo solo los libros que he leído:

The pragmatic programmer
Code Complete 2
Design patterns elements of reusable object-oriented software

Regularmente estos libros usan ejemplos en C++, VB, Java o Scala pero son conceptos que te sirven para cualquier lenguaje.


The pragmatic programmer es de 1999 sigue estando vigente?

Design patterns elements of reusable object-oriented software es de 1994, supongo mismo caso que el anterior.

Tal vez me compre este
http://www.amazon.com/Code-Complete-...hu-rd_add_1_dp

Gracias por las recomendaciones, ya separé mi programa en MVC a ver como me va.

  #6 (permalink)  
Antiguo 11/01/2013, 17:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: MVC o separar por módulos?

Cita:
Iniciado por tecafede Ver Mensaje
The pragmatic programmer es de 1999 sigue estando vigente?
Si, esta vigente.

Cita:
Iniciado por tecafede Ver Mensaje
Design patterns elements of reusable object-oriented software es de 1994, supongo mismo caso que el anterior.
Sigue mas vigente de lo que piensas.

Cita:
Iniciado por tecafede Ver Mensaje
Gracias por las recomendaciones, ya separé mi programa en MVC a ver como me va.
aaaahhhh, se me olvidaba MVC data de los 70s de la mano de smalltalk y si, también sigue vigente.
  #7 (permalink)  
Antiguo 12/01/2013, 07:53
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Una duda, al iniciar el programa debo chequear si la base de datos ya está creada o no.

En caso de que no esté creada la creo y lleno ciertos datos automáticamente.

En caso de que ya está creada simplemente la abro de nuevo.

El código con el cual lo resuelvo es:

Código:
    import os.path
    if os.path.isfile("basededatos"):
        #EXISTE Y SOLO CREO LA BASE DE DATOS
        CreoBaseDatos()
    else:
        #NO EXISTE ASI QUE CREO LA BASE DE DATOS E INICIALIZO USUARIOS
        CreoBaseDatosb()
        InicioUsuarios()
Ahora bien, para cumplir con el modelo MVC ese código debería estar en el archivo MAIN (el primero que ejecuto) o debería ser un módulo aparte contenido en CONTROLERS y llamarlo desde el MAIN?
  #8 (permalink)  
Antiguo 12/01/2013, 09:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: MVC o separar por módulos?

Preferentemente en un controlador y después llamarlo desde el main.

De hecho puedes hacer un controlador llamado "start_up" u "on_start" que sea lo primero que se ejecute en el main, así puedes usar ese controlador para hacer las tareas de inicio.
  #9 (permalink)  
Antiguo 12/01/2013, 10:49
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Cita:
Iniciado por razpeitia Ver Mensaje
Preferentemente en un controlador y después llamarlo desde el main.

De hecho puedes hacer un controlador llamado "start_up" u "on_start" que sea lo primero que se ejecute en el main, así puedes usar ese controlador para hacer las tareas de inicio.
Genial, gracias!
  #10 (permalink)  
Antiguo 13/01/2013, 06:17
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Cita:
Iniciado por razpeitia Ver Mensaje
Preferentemente en un controlador y después llamarlo desde el main.

De hecho puedes hacer un controlador llamado "start_up" u "on_start" que sea lo primero que se ejecute en el main, así puedes usar ese controlador para hacer las tareas de inicio.
Estoy enredado.

Mi módulo controlers básicamente tiene todo lo relacionado a wxpython, o sea

class Main:
def __init__(self, app):

y luego cada def: está relacionado con la gestión de eventos de la interfase gráfica

es allí que debo agregar otro def: y poner el código de inicializar o no la base de datos?

en ese caso cómo lo llamo desde el principal?

porque mi principal lo llama como

app = wx.PySimpleApp()
Main(app)
app.MainLoop()

pero de esa forma no me estaría ejecutando el código de inicializació, sino que el control del progama fluye a través de los eventos de la interfase del wxpython
  #11 (permalink)  
Antiguo 13/01/2013, 19:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: MVC o separar por módulos?

No necesariamente.

Te dejo varias posibilidades:

Opcion 1:
En tu archivo "main.py" (o como sea que se llame) haces lo siguiente:
Código Python:
Ver original
  1. if __name__ == '__main__':
  2.     app = wx.PySimpleApp()
  3.     Main(app)
  4.     app.MainLoop()
Y dentro de tu __init__ de la clase Main llamar a un método definido por ejemplo "on_start" donde hagas las tareas de inicio de tu programa.

Segunda opción:
Definir una función on_start (o similar) en tu archivo de controladores y en tu main harías lo siguiente:
Código Python:
Ver original
  1. from controllers import on_start # Ejemplo
  2.  
  3. if __name__ == '__main__':
  4.     on_start()
  5.     app = wx.PySimpleApp()
  6.     Main(app)
  7.     app.MainLoop()
  #12 (permalink)  
Antiguo 15/01/2013, 04:49
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: MVC o separar por módulos?

Opté por la primer solución y funcionó sin problemas.

Ahora el Main de Controlers luce así:

Código Python:
Ver original
  1. class Main:
  2.     def __init__(self, app):
  3.  
  4.         #Defino la rutina que se ejecuta al iniciar el programa
  5.         def OnStart():
  6.             import os.path
  7.             from models import CreateDb, InicioUsuarios
  8.             if os.path.isfile("basedatos"):
  9.                 #print "EXISTE Y SOLO CREO LA BASE DE DATOS"
  10.                 CreateDb()
  11.             else:
  12.                 #print "NO EXISTE ASI QUE CREO LA BASE DE DATOS E INICIALIZO USUARIOS"
  13.                 CreateDb()
  14.                 InicioUsuarios()
  15.  
  16.  
  17.        
  18.         OnStart()
  19.  
  20.         self.myFrame = MyFrame()

Etiquetas: mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:24.