Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Alex_bro en 3 Abril 2015, 18:00 pm



Título: [Resuelto] Ayuda con separar clases relacionadas
Publicado por: Alex_bro en 3 Abril 2015, 18:00 pm
Buenas,

Siempre me ha ocurrido que he empezado un proyecto pequeño, y poco a poco le iba añadiendo funciones al mismo archivo... y construía archivos monstruosos. He buscado mucho sobre MVC y POO, pero estoy algo pillado, seguro que ustedes pueden darme el empujón que necesito. Les pongo un ejemplo:

Proyecto de Tienda con un "Modulo" de Productos, otro de Pedidos, otro de Loquesea.
index.php
-> carga un archivo moduloNombreModulo.php dependiendo de la petición.
moduloNombreModulo.php
-> Este se encarga de cargar una classModulo.php y a base de if y elseif recoge las variables introducidas por el usuario, las limpia, y llama a la funcíon correspondiente dentro de la clase.
Digamos que es mi particular controller, pero no es una clase.
classModulo.php
-> Aqui encontramos funciones como addProducto, editProducto... addCategoria, editCategoria... addProveedor, editProveedor..
Cada función dentro de esta clase, realiza las comprobaciones correspondientes a los datos que le pasa desde moduloNombreModulo.php y si esta todo correcto hace lo que deba a través de otra clase encargada de ejecutar consultas a la DB etc.

Después de todo esto, desde moduloNombreModulo.php se ejecuta una función para manejar plantillas, ya que el contenido de vistas esta separado en otra carpeta.

El primer problema que vi es que se va agrandando demasiado la clase, pensé en separar en otras clases mas pequeñas, pero por ejemplo al añadir un Producto, addProducto comprueba si existen las categorias, proveedores, etc. y se reutilizan así funciones compartidas, ya que estas comprobaciones aparecen en casi todas.

Pero ahora me encuentro otro problema más, y es que al crear un modulo de Pedidos (ejemplo), éste necesita de funciones de la clase del otro módulo, como verificar si existe un producto, categoría, añadir un producto en algunos casos desde ese módulo, etc.

Lo que no quiero es tener que incluir e instanciar 4 o 5 clases en cada función dentro de otra clase, no se si a lo mejor estoy yo equivocado y esa es la forma correcta.

Como pensais que debería hacerlo?
Gracias!


Título: Re: Ayuda con separar clases relacionadas
Publicado por: EFEX en 4 Abril 2015, 00:26 am
No se como llevaras el codigo.. pero sobre lo que explicaste necesitas aplicar Herencia, extender la clase, quizas aplicar el diseño de pratón Factory , asi instaciar las demas clases a una clase padre..

Lo que no entiendo por que desde modulo Pedidos necesitar crear un Producto? y lo de verificar si hay stock podria ser propio de Pedidos.

Si expones codigo, hacelo resumido y vemos, haber si otros quieran meterse, no todos pensamos igual y puede aplicarse diferentes ideas :).


Título: Re: Ayuda con separar clases relacionadas
Publicado por: Alex_bro en 4 Abril 2015, 00:45 am
Gracias por contestar.

Llevo toda la tarde intentando rediseñar la estructura del proyecto, pues la verdad es que está algo avanzado, pero bueno mejor hacerlo ahora que no cuando sea demasiado tarde.

Lo de crear un Producto desde Pedidos era un ejemplo, me refería a funciones que son compartidas en las dos clases (o modelos) como por ejemplo el metodo checkExisteProducto() puede ser útil en el módulo (o controller) de Pedidos (para verificar que se inserta uno que exista de verdad) pero también en las páginas de ver y editar Producto (verificar si existe o no ese producto antes de verlo o editarlo). Éste es un ejemplo de unas cuantas funciones que se comparten, y duplicarlas en las distintas clases rompe totalmente el concepto de reusabilidad.

Voy a mirarme lo que me comentas de patrón Factory y te digo.

Gracias de nuevo.
Saludos.

Edito:
Después de ver muchos ejemplos, acabo de darme cuenta de que mi problema era que aplicaba mal el patrón MVC al incluir parte de la lógica en los modelos (lo que yo llamaba classPedidos etc.) y parte de la lógica en los controllers (mis moduloPedidos etc.), lo que me impedia cualquier forma de reutilización.

Estoy reorganizando todo el código desde el principio, es mucho trabajo, pero creo que merece la pena de cara al futuro.

Muchas gracias por la ayuda!