Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/08/2008, 07:54
Avatar de enriqueplace
enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: duda sobre instanciar una clase dentro de otra

Cita:
Que tal Enrique, antes que nada agradezco tu intención de ayudarme, tratare de explicarme y dar respuesta a tus preguntas pero antes cabe aclarar mi posición ante el problema
No hay problema, las preguntas que te hago son para razonar juntos y tratar que entiendas qué estás haciendo y cómo deberías hacerlo.

Cita:
Llevo tiempo programando en PHP pero de forma estructurada, y estoy tratando de dar el siguiente paso, pero para serte sincero, me esta costando mucho, digamos que ando en pañales en poo, pero trato de leer lo que tengo a la mano, entenderlo y hacer ejercicios para tratar de entender un poco mas, también estoy trabajado sobre como implementar el diseño de a 1, 2 y 3 capas, como puedes ver ando todavia en pañales en todo esto.
Bueno, creo que la mayoría de los desarrolladores PHP están con esa carencia, pero lo saludable es que empieces a recorrer el camino para solucionarlo

Ok, sigamos el razonamiento sin pensar en capas, solo en un mini-sistema con clases que tengan una única responsabilidad.

1. ¿La clase "planetas" (que debería ser "Planeta"), cual es la relación de parentesco con la clase "IOMConnect"?

Cita:
R. muy posiblemente si no es que seguramente esta mal implementado el sistema, la clase "planetas" no guarda relación directa con la clase "IOMConnect", sin embargo la clase "IOMConnect" provee los datos de la base de datos a la clase "planetas", únicamente eso
Los objetos son una representación de la realidad, por consiguiente debes concentrarte en eso, encontrar los objetos que naturalmente usarías en este contexto y darles una única responsabilidad.

Por lo que me cuentas, los "Planetas" no tienen nada que ver con la conexión a la base de datos, por consiguiente, nunca deberías hacer una herencia (al no haber ninguna relación de parentesco), lo que sucede es que los "Planetas" necesitan una conexión con la base para obtener datos y la relación es de "uso" (una clase usa a la otra) y los "Planetas" no deberían resolver ningún problema con la base de datos.

Si quieres simplificar, cambia la clase IOMConnect por algo más descriptivo, como Database o similar (encontrar los nombres adecuados ayudan a entender luego cómo deberían relacionarse los objetos).

Ejemplo de la representación en UML

2. ¿La clase "html" (que debería ser "Html"), cual es la relación de parentesco con la clase "planetas"?

Cita:
R. En este punto la clase "planetas" no guarda parentesco alguno con la clase html, pero la clase "html" necesita información que puede proporcionar la clase "planetas", en este caso la clase "html" solo se encarga de presentar información al cliente (navegador), la clase "planetas" se encarga de gestionar los planetas en el ejercicio que estoy realizando
Lo mismo que en el caso anterior, tú mismo lo has dicho al describirme el contexto en un lenguaje natural. Si la clase Html necesita información de la clase Planeta, la relación es de "uso" y solo con esta clase, no con la clase de conexión a la base de datos.

Ejemplo de la representación en UML

3. ¿Me puedes describir brevemente la responsabilidad de cada clase?

Cita:
R. la clase "IOMConnect" únicamente esta encargada de comunicar e interactuar la aplicación con la base de datos, la clase "planetas" se encarga de gestionar los planetas, en este caso, se encarga de pedirle datos a la clase "IOMConnect" trabajar con ellos y presentarlos para su uso externo a la clase, la clase "html" se encarga de pedir datos a la base de datos que se mostrarán en todo momento en el navegador, información que es necesaria para el visitante, pero no interactúa de manera directa con ningún otra clase que no sea "IOMConnect"
La clase Html sería la responsable de presentar los datos (podrías cambiar el nombre por algo más genérico, ya que mañana tu forma de presentar los datos no necesariamente sea HTML), sin importar si son ahora planetas u otro tipo de dato, pero lo que queda claro es que no pide datos directos a la base de datos (no es su responsabilidad, solo de presentar los datos).

La clase Planeta sería la responsable de responder toda la información que se requiera de los planetas, y si los datos están en la base de datos, iría contra la clase correspondiente, Database.

4. ¿Cuantas relaciones existen además de la herencia? ¿por qué herencia y no otra relación?

Cita:
R. hasta el momento en el ejercicio simplemente las relaciones entre clase son únicamente entre "IOMConnect" con "planetas" y "IOMConnect" con "html" para la interacción con la base de datos, ahora, porque herencia y no otra relación, bueno, simplemente es un ejercicio que estoy realizando para entender y aprender
Bien, quiero que te quede claro que nunca se debe hacer herencia para usar o reusar código, la herencia es -como su palabra lo dice- una relación de parentesco, Padre -> Hijo, Persona -> Usuario, Animal -> Perro, no otra cosa. Los objetos son una representación de la realidad, no solo código que puedes hacer lo que quieras con ello, aunque tu sistema funcione externamente y no de error de sintaxis.

Se pude decir que existe generalmente una relación de "es un": Perro es un Animal, Hijo es una Persona, Usuario es un tipo de Persona (luego más adelante se podrá ver que esto no necesariamente es exacto, pero conceptualmente esto te sirve para entender qué no debería ser, un reuso de código de forma mecánica).

Las relaciones típicas son: herencia, dependencia y asociación (luego hay variantes).

Dependencia es una relación de uso entre clases (como está sucediendo entre tus clases) y Asociación cuando construyes objetos a partir de otros objetos (un atributo de tu clase es a su vez otra clase).

Es como jugar con piezas de construcción (ladrillos), la única relación no es herencia, los objetos se usan entre ellos (dependencia) y a su vez se construyen estructuras más grandes a partir de otros objetos (asociación).

5. ¿Estás implementando un diseño de 3,2 o 1 capa?

Cita:
R. como te comento, simplemente estoy realizando un ejercicio, un ejemplo de lo que estoy leyendo y entendiendo, estoy aprendiendo =P y posiblemente lo he hecho muy mal, ya que hasta este momento que me preguntas sobre si estoy implementando un diseño es cuando me pongo a pensar en ello ^^
Bien, no es un pecado equivocarse, sí lo es intentar de hacer algo sin fundamento (leer conceptos, ejemplos, manuales), ya que nunca llegarías a nada.

Lamentablemente la mayoría de los libros de PHP que tocan POO no usan UML (que considero fundamental para entender los diseños) y los ejemplos que hacen son "codificaciones mecánicas" y los conceptos son tratados muy superficialmente. Es como que si dijera:


"la herencia es usar extends y luego la clase hija obtiene todos los atributos públicos y protegidos de la clase padre"



Obviamente se queda corta esta explicación.

Cita:
como puedes ver estoy tratando de aprender con lo que tengo y tratando de entenderlo con ejemplos, espero que me alla explicado y resulto tus dudas, asi mismo te agradezco el interés mostrado y la ayuda que me puedas proporcionar
Dime si algo de lo que te expliqué no quedó claro, lo que te pido ahora es que implementes los cambios que entendiste que deberías hacer.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com