Duda POO

Hola compañeros:

Estoy retomando la Programación Orientada a Objetos, y conociendo ya las bases y demás, me surje una duda a la hora de encarar un proyecto.

Imaginemos que tengo una empresa con distintos puestos, cada uno de los cuales trabaja con unas referencias, que se almacenan en unas estanterías, y cada puesto cuenta con sus propios empleados.

La cosa es, si yo cargo un objeto del puesto 1, ¿debería cargar todos los objetos relacionados?. Si mi clase Puesto tiene un campo que es una lista de objetos tipo Referencias, ¿al cargar el puesto 1 debería cargar en esa lista todas las Referencias de ese puesto?. Y lo mismo para el resto de cosas, si la clase Puesto tiene un campo que es una lista de trabajadores... ¿Tendría que cargar la lista de trabajadores, cargando a su vez los posibles objetos relacionados de la clase Trabajador?. Direcciones por ejemplo.

No sé si es una manera correcta de trabajar, o es mejor cargar los Puestos y según necesite ir cargando y descargando las listas. Si quisiera cargar todos los puestos, tendría en memoría muchísimos datos, y no sé si eso está bien.

Gracias.
Por lo que pones entiendo lo siguiente:

1) Tienes 1 Empresa formada por 'n' Puestos.
2) 1 Puesto tiene 'n' Empleados. 1 Empleado tiene sus datos particuales.
3) 1 Puesto tiene 'n' Referencias. (No sé si serán referencias de artículos/productos. Pero éstas se almacenan en distintas estanterias).

Lo que puedes hacer es tener en 1 Puesto y en éste guardar una relación hacía las claves que identifiquen el empleado concreto. Después si es necesario ya accederás mediante esa clave a toda la información del empleado, pero no es necesario que tengas en todo momento toda la información del empleado en memoria, si ni siquiera sabes si vas a acceder a esa información; con tener sólo el listado mediante claves de los empleados que hay en ese puesto sería suficiente.

Puedes tener una relación de Referencia - Estantería por un lado, puedes cargar el listado de Referencias que tiene 1 Puesto determinado y podrías sacar la estantería a la que pertenece.

Realmente va ser necesario cargar todos los puestos de manera simultánea? Voy a acceder siempre a 1 puesto determinado o va ser más frecuente cargar todos los puestos? Tengo que realizar una búsqueda entre todos los puestos? En qué entorno se va ejecutar tu aplicación? [La memoría es crítica?]
Se puede hacer de muchas formas, sería interesante saber el lenguaje. Pero si tienes una lista de referencias y estas trabajando en c++ podrías crear una estructura de datos tipo arbol por ejemplo para esas referencias o trabajadores, que reduce la complejidad en O(logn) y simplemente adjuntar un puntero a esa estructura.
Si estas trabajando con java es un poco más complejo de optimizar, ya que por defecto java facilita estas cosas de una forma no tan óptima, pero se puede utilizar el mismo concepto.

Un saludo.
En realidad lo más normal sería tener eso en una base de datos con sus relaciones y desde la app de turno vas cargando con consultas según necesites.
Muchas gracias a todos por las respuestas.

Estoy utilizando el lenguaje .NET (porque es el que tengo mas reciente) y es una aplicación de Escritorio.

Como comentáis, mi empresa tiene n Puestos, cada Puesto tiene n Estanterías y cada Estantería tiene asignadas n Refernecias. A su vez cada Puesto lo pueden atender n Trabajadores.

La cosa es, por ejemplo: instalo la aplicación en un equipo que representa un Puesto. El programa se encarga de gestionar las Estanterías, Referencias... y Peticiones, que no lo he comentado, pero ahora mismo no vienen al caso.

Mi duda era si al arrancar el programa para el Puesto 1, tenía que cargar todas sus Estanterías, y por cada Estantería todas sus Referencias. No sabía si era necesario tenerlo todo en memoria, puesto que la Clase Puesto tiene una propiedad List of(Estanterias).

Ayer estuve leyendo sobre Lazy Loading y Eagerly Loading, y en este caso en concreto no es mucha la información que se tiene que gestionar (no hay miles de Estanterías en un Puesto, ni cada Estantería tiene miles de Referencias), pero me gustaría aprender haciendolo de la manera correcta y no aprender con mis propios vicios que después se convierten en lastres.

¿Cargo y descargo las listas de objetos "secundarios" según los vaya necesitando?
DevilKeeper escribió:Muchas gracias a todos por las respuestas.

Estoy utilizando el lenguaje .NET (porque es el que tengo mas reciente) y es una aplicación de Escritorio.

Como comentáis, mi empresa tiene n Puestos, cada Puesto tiene n Estanterías y cada Estantería tiene asignadas n Refernecias. A su vez cada Puesto lo pueden atender n Trabajadores.

La cosa es, por ejemplo: instalo la aplicación en un equipo que representa un Puesto. El programa se encarga de gestionar las Estanterías, Referencias... y Peticiones, que no lo he comentado, pero ahora mismo no vienen al caso.

Mi duda era si al arrancar el programa para el Puesto 1, tenía que cargar todas sus Estanterías, y por cada Estantería todas sus Referencias. No sabía si era necesario tenerlo todo en memoria, puesto que la Clase Puesto tiene una propiedad List of(Estanterias).

Ayer estuve leyendo sobre Lazy Loading y Eagerly Loading, y en este caso en concreto no es mucha la información que se tiene que gestionar (no hay miles de Estanterías en un Puesto, ni cada Estantería tiene miles de Referencias), pero me gustaría aprender haciendolo de la manera correcta y no aprender con mis propios vicios que después se convierten en lastres.

¿Cargo y descargo las listas de objetos "secundarios" según los vaya necesitando?

Si lo quieres hacer en memoria perfecto ;) [seguiré con atención las posibles respuestas de otros compañeros] pero cómo dice @exitfor ¿no sería más practico hacer contra una BBDD?

Si crees que montar un servidor de BBDD puede ser demasiado lío, siempre puedes tirar de SQLite para salir del paso.

http://www.sgoliver.net/blog/sqlite-y-net-parte-1/
http://www.sgoliver.net/blog/sqlite-y-net-parte-2/

Saludos ;)
Si te resulta muy engorroso BBDD puedes trabajar con xml cómo I/O de datos.

Visto lo visto estás haciendo relaciones de relaciones. Cuidado con eso, porque unos dependen de otros.

Estás creando un Objeto Tienda.
Tienda tiene n puestos.
Y a su vez, puesto tiene n empleados.


Class Tienda/empresa
[ Puestos Array]

Class Puestos
[Empleados]

Class Empleado
[Nombre, Apellidos...]



También has de tener en cuenta si un empleado puede estar en N puestos.

Para poder crear este árbol, ha de existir al menos un empleado para poder tener un puesto.
Un puesto para tener al menos para la Tienda.
Con lo cuál todo va en cascada.
Muchas gracias a todos por las respuestas y el interés.

Los datos van en SQL, con eso no tengo ningún problema. Mi duda era referente a la carga de datos de los objetos relacionados a otro.

Por ejemplo, si mi aplicación la instalo en varios equipos, y cada equipo representa un puesto de mi empresa, cuando al iniciar sesión cargue los datos del puesto, ¿es obligatorio/aconsejable/necesario cargar a la vez los datos de las estanterías del puesto, las posiciones de las estanterías, las referencias asociadas a cada estantería, los trabajadores del puesto...?

Ayer estuve leyendo sobre Lazy Loading, que trata de cargar los datos únicamente cuando los vas a utilizar. En mi caso, no voy a tener una cantidad exagerada de datos, porque un puesto tendría dos o tres estanterías, cada una con dos o tres posiciones, cada estantería gestionaria 7 u 8 referencias... Imagino que tener eso en memoria no es demasiado.

Pero si me gustaría aclararme sobre las técnicas que se utilizan para estos casos, para aprender bien, y no seguir mis ideas y luego llegar a un sitio y que resulte que lo hago todo mal.

Gracias.
DevilKeeper escribió:Muchas gracias a todos por las respuestas y el interés.

Los datos van en SQL, con eso no tengo ningún problema. Mi duda era referente a la carga de datos de los objetos relacionados a otro.

Por ejemplo, si mi aplicación la instalo en varios equipos, y cada equipo representa un puesto de mi empresa, cuando al iniciar sesión cargue los datos del puesto, ¿es obligatorio/aconsejable/necesario cargar a la vez los datos de las estanterías del puesto, las posiciones de las estanterías, las referencias asociadas a cada estantería, los trabajadores del puesto...?

Ayer estuve leyendo sobre Lazy Loading, que trata de cargar los datos únicamente cuando los vas a utilizar. En mi caso, no voy a tener una cantidad exagerada de datos, porque un puesto tendría dos o tres estanterías, cada una con dos o tres posiciones, cada estantería gestionaria 7 u 8 referencias... Imagino que tener eso en memoria no es demasiado.

Pero si me gustaría aclararme sobre las técnicas que se utilizan para estos casos, para aprender bien, y no seguir mis ideas y luego llegar a un sitio y que resulte que lo hago todo mal.

Gracias.


También depende de la red en la que se encuentran los equipos, imagino que tendras un servidor sql centralizado, y deberas de acceder a el para pedir los datos. Dicho esto hay que mirar que te interesa más según la red que dispongas(Mega o Gigabit), además, el momento de petición de los datos es importante, si pides todos los datos al iniciar el programa y este proceso es realizado por muchos ordenadores en un momento concreto(pongamos la hora de empezar a trabajar) puede producirse un exceso de carga en la red. Esto no pasaría con Lazy loading como dices, de todas formas, todo se basa en probar y analizar el entorno.

Un saludo.
8 respuestas