Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

duda sobre instanciar una clase dentro de otra

Estas en el tema de duda sobre instanciar una clase dentro de otra en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Que tal queridos compañeros foreros, tengo una duda que seguro ustedes sabran responder, y de antemano agradesco toda ayuda. Tengo el siguiente esquema, tengo 3 ...
  #1 (permalink)  
Antiguo 16/08/2008, 19:34
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Mensaje duda sobre instanciar una clase dentro de otra

Que tal queridos compañeros foreros, tengo una duda que seguro ustedes sabran responder, y de antemano agradesco toda ayuda.

Tengo el siguiente esquema, tengo 3 clases, la clase A es la encargada de hacer la conexion a la db asi como los select, insert, etc, la clase B se encarga de pedirle a la clase a informacion de la db, la clase C se encarga de crear objetos en html para la plantilla (vista), ok, ahora, la clase B hereda de la clase A mediante Singleton.

ahora la clase C se encarga de crear un select con información que me puede proporcionar la clase B, mi pregunta es si esta correcto que dentro de la case C instancie la clase B o si es mejor pasar esa informacion como parametro, ejemplo

clase A
Código PHP:
class IOMConnect {
    
//variables de configuracion
    
private static $instances = array();
    private 
$conexion;                //Guarda la conexion activa a mysql
    
    
public static function getInstance($class) {
        if (!isset(
self::$instances[$class])) {
            
self::$instances[$class] = new $class();
        }
    
        return 
self::$instances[$class];
    }
    
    public function 
setConexion($server,$user,$pass,$db) {
        
$this->conexion mysql_connect($server,$user,$pass) or $this->getError('Error en la conexión');
        
mysql_select_db($db,$this->conexion);
    }
    
    private function 
getQuery($sql) {
        
$query mysql_query($sql,$this->conexion) or $this->getError('Error en ejecutar la sentencia \''.$sql.'\'');
        return 
$query;
    }
    
    public function 
getSelect($tabla,$campos,$addsql='') {
        
$sql 'select ';
        
        if (
is_array($campos)) {
            
$sql .= implode(',',$campos);
        }else {
            
$sql .= $campos;
        }
        
        
$sql .= ' from '.$tabla;
        
        if (!empty(
$addsql)) {
            
$sql .= ' '.$addsql;
        }
        
        return 
$this->getQuery($sql);
    }
   
    
//la clase original incluye mas metodos

clase B
Código PHP:
<?php
//clase iomgalaxy
class planetas extends IOMConnect {
    
//variables de uso interno
    
    
public function __construct() {
        
$this->setConexion('localhost','iomgalaxy','','iomgalaxy');
    }
    
    public static function 
getInstance() {
        return 
parent::getInstance(get_class());
    }
    
    
//========================================================================
    
        //Metodos de acceso a datos
    
    //========================================================================
    
    /**
    *    Metodo:     getPlanetas
    *    Funcion:     Recupera y envia los planetas creados de la DB
    *    Variable:     $id integer
    *                $campos    array
    *    Acceso:     public
    *    Entrega:     array
    */
    
public function getPlanetas($id='',$campos=array('id','planeta')) {
        
//verifico si se incluyo un ID
        
if (empty($id)) {
            
//Solicito los planetas a la base de datos
            
$planet $this->getSelect('iomg_planet',$campos);
        }else {
            
//Solicito el planeta indicado
            
$planet $this->getSelect('iomg_planet',$campos,'where id = \''.$this->getSanitizar($id).'\'');
        }
        
//entrego el array obtenido
        
return $planet;
    }
    
    
/**
    *    Metodo:        getPlanetasUsuario
    *    Funcion:    Busca y entrega el ID de los planetas que tiene el usuario
    *    Variables:    $id    integer
    *    Acceso;        public
    *    Entrega:    array
    */
    
public function getPlanetasUsuario($id) {
        
//pido los planetas a cargo del ID del usuario entregado
        
$planetas $this->getSelect('iomg_planet','id','where id_user = \''.$this->getSanitizar($id).'\'');
        
//entrego el array con los planetas
        
return $planetas;
    }
    
    
/**
    *    Metodo:        getPlanetaRecursos
    *    Funcion:    Entrega información sobre los recursos del planeta
    *    Variables:    $id    integer
                    $recursos string
    *    Acceso:        public
    *    Entrega:    array
    */
    
public function getPlanetaRecursos($id,$recursos='all') {
        
//verifico si se regresaran todos los recursos o solo alguno de ellos
        
if ($recursos == 'all') {
            
//si son todos hago la consulta de los recursos
            
$planeta $this->getSelect('iomg_planet',array('metal','cristal','uranio'),'where id = \''.$this->getSanitizar($id).'\'');
        }else {
            
//si no son todos solo recupero lo necesario
            
$planeta $this->getSelect('iomg_planet',$recursos,'where id = \''.$this->getSanitizar($id).'\'');
        }
        
//entrego la información solicitada
        
return $planeta;
    }
    
    
/**
    *    Metodo;        getPlanetaInfo
    *    Funcion:    Entrega información sobre el planeta solicitado
    *    Variables:    $id    integer
                    $campos dinamic    array|string
    *    Acceso:        public
    *    Entrega:    array
    */
    
public function getPlanetaInfo($id,$campos='*') {
        
//obtengo la información del planeta solicitado
        
$planeta $this->getSelect('iomg_planet',$campos,'where id = \''.$this->getSanitizar($id).'\'');
        
//entrego la info
        
return $planeta;
    }
}
?>
Y finalmente la clase C

Código PHP:
<?php
//clase iomgalaxy
class html extends IOMConnect {
    
//variables de uso interno
    
private $obj_planetas;        //guarda el objeto planetas
    
    
public function __construct() {
        
$this->setConexion('localhost','iomgalaxy','','iomgalaxy');
        
$this->obj_planetas planetas::getInstance(); //Aqui inicio la clase B
    
}
    
    public static function 
getInstance() {
        return 
parent::getInstance(get_class());
    }
    
    
/**
    *    Metodo:        getSelectPlanet
    *    Funcion:    Crea un select con la información de los planetas
    *    Variables:    $id    integer
    *    Acceso:        public
    *    Entrega:    string
    */
    
public function getSelectPlanet($id) {        //obtengo los planetas
        
$planetas $this->obj_planetas->getPlanetasUsuario($id); //Aqui es donde obtengo información de la clase B
        //creo el contenedor y agrego los primeros valores del select
        
$html '<form name="form" id="form"><select name="jumpMenu" id="jumpMenu" onchange="MM_jumpMenu(\'parent\',this,0)">';
        
//recorro el array y guardo el valor en $html
        
while($row=$this->getFetchAssoc($planetas)) {
            
$planeta $this->obj_planetas->getPlanetaInfo($row["id"],array('id','planeta')); //Y aqui de nuevo obtengo información de la clase B
            
$rew $this->getFetchAssoc($planeta);
            
$html .= '<option value="planel.php?planet='.$rew["id"].'">'.$rew["planeta"].'</option>';
        }
        
//ingreso lo final
        
$html .= '</select><input type="submit" name="button" id="button" value="Ir" /></form>';
        
        
//finalemnte entrego todo finalizado
        
return $html;
    }
}
?>
Entonses mi duda es que si lo que estoy haciendo esta bien o es mejor pasarle la informacion que proporciona la clase B mediante parametros a la clase C
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #2 (permalink)  
Antiguo 16/08/2008, 23:32
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: duda sobre instanciar una clase dentro de otra

Preguntas:
  1. ¿La clase "planetas" (que debería ser "Planeta"), cual es la relación de parentesco con la clase "IOMConnect"?
  2. ¿La clase "html" (que debería ser "Html"), cual es la relación de parentesco con la clase "planetas"?
  3. ¿Me puedes describir brevemente la responsabilidad de cada clase?
  4. ¿Cuantas relaciones existen además de la herencia? ¿por qué herencia y no otra relación?
  5. ¿Estás implementando un diseño de 3,2 o 1 capa?
En base a lo que me respondas, me darás más información para ayudarte.

PD: tu diseño actual se ve así en UML

__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 17/08/2008, 02:27
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: duda sobre instanciar una clase dentro de otra

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

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.

ahora tratare de responder a tus preguntas

1. ¿La clase "planetas" (que debería ser "Planeta"), cual es la relación de parentesco con la clase "IOMConnect"?
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

2. ¿La clase "html" (que debería ser "Html"), cual es la relación de parentesco con la clase "planetas"?
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

3. ¿Me puedes describir brevemente la responsabilidad de cada clase?
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"

4. ¿Cuantas relaciones existen además de la herencia? ¿por qué herencia y no otra relación?
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

5. ¿Estás implementando un diseño de 3,2 o 1 capa?
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 ^^

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
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #4 (permalink)  
Antiguo 17/08/2008, 07:54
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
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
  #5 (permalink)  
Antiguo 17/08/2008, 21:21
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: duda sobre instanciar una clase dentro de otra

Muchas gracias Enrique por la explicación que me has dado, ahora eh comprendido muchas cosas que no tenia claro, trabajare sobre lo que has expuesto y estudiarlo mas

te agradesco la ayuda dada, hare los cambios y las dudas que me surgen vendre a exponerlo, muchas gracias
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #6 (permalink)  
Antiguo 18/08/2008, 03:43
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
Respuesta: duda sobre instanciar una clase dentro de otra

Hola.
Interesante vuestro post.
Muy buena pregunta Nemutagk y muy buenas repuestas enriqueplace.

Me estoy estrenando en POO.

Enrique... Podrías aclara esto que comentas si puede ser con ejemplos?

Cita:
Las relaciones típicas son: herencia, dependencia y asociación (luego hay variantes).
Las herencias me queda claro como implementarlas. "EXTENDS",
pero las de dependencia, asociación y variantes... como se implementarían.

En el caso del ejemplo que pone Nemutagk, la soclución a IOMConnect solo esta en cambiar ele nombre de la clases IOMConnect por otra que diga Database.?

Realmente aunque una no contenga la otra, eso siempre nos lo vamos a encontrar. Es decir, el poder realizar consultas SQL dentro de una clase. Como propones el poder hacerlo?


Gracias por vuestra ayuda.

Saludos,

LCervantes
__________________
LCervantes
--------------------------------------------
www.nerrots.es
  #7 (permalink)  
Antiguo 18/08/2008, 08:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: duda sobre instanciar una clase dentro de otra

Hola lcervantes,

No es que exista otro "keyword" como extends, la relación de uso se hace cuando haces un miembro de una clase, por ejemplo:
Código PHP:
class Planetas {
        private 
$_db;
        public function 
__construct() {
                
$this->_db = new Database();
        }


        public function 
getPlanetas() {
                
$result $this->_db->Query"SELECT * FROM `planetas`" );
                
$planetas = array();
                foreach( 
$result as $planeta ) {
                          
$planetas[] = $planeta->nombre;
                }

                return 
$planetas;
        }

Las demás variantes son iguales de uso, y es a nivel conceptual como es que tienes que leer los valores.

Saludos.
  #8 (permalink)  
Antiguo 18/08/2008, 08:19
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: duda sobre instanciar una clase dentro de otra

Que tal, con lo que explico Enrique y leyendo me quedo claro, pero haciendo un poco mas complejo el ejercicio que estoy haciendo, me surgio una nueva duda

por ejemplo, tenemos la clase "planeta" pero tambien hay una "sistema" y tambien hay una "galaxia", entonses aqui segun lo que tengo entendido si se puede hacer una herencia, porque en una galaxia hay sistemas y en sistemas hay planetas, ok, hasta aqui esta bien, pero, es recomendable hacer esto, digo, seria lo mejor, pero si no siempre voy a utilizar por ejemplo los metodos de "galaxia" ni de "sistema" es recomendable incluirlos (porque si se hereda de las anteriores es necesario incluir las clases no?)

diganme si estoy bien en lo que planteo y si es recomendable en este caso si utilizar la herencia en ves de dependencia

de antemano muchas gracias
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #9 (permalink)  
Antiguo 18/08/2008, 09:03
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: duda sobre instanciar una clase dentro de otra

Cita:
Iniciado por lcervantes Ver Mensaje
Las herencias me queda claro como implementarlas. "EXTENDS", pero las de dependencia, asociación y variantes... como se implementarían.
Como se haría en cualquier otro lenguaje que permita implementar POO, la forma es conceptual y no técnica.

Cualquier manual de POO o de UML lo explica, la asociación es simplemente construir un objeto a partir de otros, y eso se hace definiendo objetos en los atributos.

Por ejemplo, si decimos que una camioneta escolar está compuesta por un conductor y un asistente, podríamos hacer un diseño de esta forma:

Código PHP:
class CamionetaEscolar extends Auto
{
   private 
$_conductor;
   private 
$_asistente;
   
   public function 
__construct($conductor$asistente)
   {
      
$this->_conductor $conductor;
      
$this->_asistente $asistente;
   }

Y la forma de usarlo podría ser:

Código PHP:

$conductor 
= new Conductor('Enrique');
$asistente = new Asistente('Carlos');

$camionetaEscolar = new CamionetaEscolar($conductor$asistente); 
Borrador de un diseño UML para la Camioneta Escolar

La "relación de dependencia" (es una relación de "uso"), es decir, las únicas dos formas que existen es:
  • Dentro de un método, recibir un objeto por parámetro
  • Dentro de un método, crear un objeto
En ambos casos, "usas" un objeto, ya que lo necesitas, lo usas dentro de un método de tu clase, y luego de terminada la ejecución del método, se termina la vida del objeto "usado" (es una relación más débil que la asociación, por eso en UML se representa con una línea punteada).

En este caso, la conexión a la base de datos podría ser una relación de uso, instancias la clase Database, la usas, y luego muere. Digo "podría", pues dependerá el diseño que quieras hacer en el contexto que te encuentres.

Ejemplo del diagrama anterior pero con acceso a la clase Database

Cita:
En el caso del ejemplo que pone Nemutagk, la soclución a IOMConnect solo esta en cambiar ele nombre de la clases IOMConnect por otra que diga Database.?
No necesariamente está mal, pero me parece que la situación es redundante, crear una clase de abstracción de base de datos, entonces, para qué llamarle otra cosa que no sea "BaseDeDatos" o "Database".

Cita:
Realmente aunque una no contenga la otra, eso siempre nos lo vamos a encontrar. Es decir, el poder realizar consultas SQL dentro de una clase. Como propones el poder hacerlo?
Separando las responsabilidades. No puede ser que todas las clases de tus sistemas conozcan todos los detalles de la persistencia, cómo se arman las consultas sql, etc.

Aquí se hace más claro cuando separamos nuestro sistema en 3 capas, donde cada clase de cada capa deberá resolver problemas de la capa correspondiente.

Si tenemos las capas presentación -> dominio -> persistencia, se puede decir que podría existir un representante en cada capa del tema que estás tratando de resolver.

Por ejemplo, si estamos hablando de Planetas, tal vez puedas tener para cada capa:

PlanetaPresentacion, PlanetaDominio, PlanetaPersistencia

Ejemplo de diagrama UML

Nota: si quieren pueden cambiar PlanetaDominio por Planeta solo, aquí lo hago para diferenciar los nombres y como no hay manejo de paquetes / namespaces (bueno, sí hay pero en la versión PHP 5.3), tengo que poner cada clase con nombres distintos para que no colisionen.

La primer clase resolverá toda la interfaz relacionada con los Planetas, cuando necesite información de los mismos, se lo pedirá a la clase de Dominio, y si la clase de Dominio necesita información que se encuentra almacenada en la base de datos (u otro medio), de lo pedirá a la clase de Persistencia (donde esta última tendrá las consultas SQL y no en Dominio ni en Presentación).

Ejemplo rápido de lo que podría ser un sistema en 3 capas

Se ve más claro en una división de capas que teniendo todo en una capa, por eso parece que es imposible no tener sentencias SQL, ya que no dividen las responsabilidades correspondientes.

Nota:
aunque no parezca, los ejemplos que hice fueron "rápidos" (usando ArgoUML) y pude haber cometido algún error, si detectan uno o tienen alguna duda sobre algún punto me avisan que lo revisamos.

Creo que queda claro que "la única relación posible" no es la herencia y esta no se usa para usar código de forma mecánica
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #10 (permalink)  
Antiguo 18/08/2008, 09:33
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: duda sobre instanciar una clase dentro de otra

Cita:
por ejemplo, tenemos la clase "planeta" pero tambien hay una "sistema" y tambien hay una "galaxia", entonses aqui segun lo que tengo entendido si se puede hacer una herencia,
Les voy a prohibir el uso/abuso de la herencia

¿Cual es la relación de parentesco entre Galaxia -> Sistemas -> Planetas?

No será que "las galaxias están compuestas por varios sistemas, y que a su vez, los sistemas están compuestos por muchos planetas"?

Usemos el tradicional "es un": ¿un planeta es un tipo de sistema? ¿un sistema es un tipo de galaxia?

Ahí entraría la relación de "agregación" (una especialización de la relación "asociación"), donde "asocias/agrupas varios elementos".

Diagrama UML

En código se traduce en un atributo que es un array ("contenedor de objetos") y un método que agrega los objetos a ese array (generalmente con el nombre "add").

Código PHP:
$planeta1 = new Planeta('Tierra');
$planeta2 = new Planeta('Marte');
$planeta3 = new Planeta('Urano');

$sistema = new Sistema('Solar');
$galaxia = new Galaxia('Via Lactea');

$sistema->add($planeta1);
$sistema->add($planeta2);
$sistema->add($planeta3);

$galaxia->add($sistema); 
Si quieres saber el contenido de la Galaxia solo es recorrer el contenido de su "contenedor", preguntarle a cada "contenido" qué tiene dentro y a cada uno su nombre (todo se podría hacer con el toString de cada uno).

Cita:
porque en una galaxia hay sistemas y en sistemas hay planetas, ok, hasta aqui esta bien, pero, es recomendable hacer esto, digo, seria lo mejor, pero si no siempre voy a utilizar por ejemplo los metodos de "galaxia" ni de "sistema" es recomendable incluirlos (porque si se hereda de las anteriores es necesario incluir las clases no?)
Sigues razonando a través del código, del lenguaje, y no a través de los conceptos, de los objetos.

"Luke, pensar como programador debes evitar, la realidad que ves solo debes describir"
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 05:22.