Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/10/2010, 14:47
7th_Sign
 
Fecha de Ingreso: noviembre-2007
Mensajes: 35
Antigüedad: 16 años, 5 meses
Puntos: 0
Información Aplicando UML a mis códigos PHP con MySQL ¿?

Compañeros, he estado leyendo varios textos sobre lo que el UML es.
Algunas cosas se me han aclarado y otras todavía no. Por lo cuál pase de la teoría a la práctica y quiero compartirlo para conocer su comentarios y críticas.

La práctica es básicamente una agenda.
La redacción de la necesidad sería mas o menos así:
Un Usuario tiene una agenda y la agenda tiene contactos
Se puede ver un listado de contactos agregados a la agenda
y se pueden agregar mas contactos.

pues bien sencillo que están las clases (creo):



hasta donde llego a comprender estas serían mis clases entidad y también necesitaría una clase control llamada Operciones y otras 2 de Borde:
Reporte
AgregarContacto <-- que dejaré pendiente
Y una de persistencia que hará consultas a la BD disñeado al estilo singleton

bueno pasemos al código:
Clase Usuario
Código PHP:
Ver original
  1. class Usuario
  2. {
  3.     private $_db;
  4.     private $_nombre;
  5.     private $_id;
  6.     private $_agenda;
  7.    
  8.     public function __construct()
  9.     {
  10.         $this->_db = Persistencia::conectar();
  11.     }  
  12.     private function cargarDatos($usr)
  13.     {        
  14.          $query = "SELECT nombreUsuario, id FROM usuario "
  15.                 . "WHERE nombreUsuario = '$usr' LIMIT 1";
  16.          $rs = $this->_db->query($query);        
  17.          $data = $rs->fetch_object();        
  18.          $this->_nombre = $data->nombreUsuario;        
  19.          $this->_id= $data->id;        
  20.          $this->_sesionActiva = true;        
  21.     }            
  22.     public function asociaAgenda(Agenda $agenda)
  23.     {
  24.         $this->_agenda = $agenda;
  25.     }
  26.     public function __set($atr,$valor)
  27.     {
  28.         $this->$atr = $valor;      
  29.     }    
  30.     public function __get($atr)
  31.     {
  32.         return $this->$atr;
  33.     }
  34. }
Clase Agenda
Código PHP:
Ver original
  1. class Agenda {
  2.     private $_listaContactos = array();
  3.      
  4.     public function __construct()
  5.     {
  6.                
  7.     }    
  8.     public function agregaContacto(Contacto $contacto)
  9.     {
  10.         $this->_listaContactos[] = $contacto;
  11.     }    
  12.     public function __get($atributo) {
  13.         return  $this->$atributo;
  14.     }
  15. }

Clase Contacto
Código PHP:
Ver original
  1. class Contacto
  2. {
  3.     private $_id ;    
  4.     private $_nombre;    
  5.     private $_apellido;            
  6.     private $_telefono;
  7.            
  8.     public function __construct($id, $nombre, $apellido, $telefono) {
  9.         $this->_id = $id;        
  10.         $this->_nombre = $nombre;        
  11.         $this->_apellido = $apellido;        
  12.         $this->_telefono = $telefono;                
  13.     }    
  14.     public function __get($atributo)
  15.     {
  16.         return $this->$atributo;
  17.     }
  18.     public function __set($atributo,$valor)
  19.     {
  20.         $this->$atributo = $valor;
  21.     }
  22. }

Clase Persistencia
Código PHP:
Ver original
  1. class Persistencia extends mysqli
  2. {
  3.     private static $_instancia;
  4.        
  5.     private function __construct($servidor = SERVIDOR, $usuario = USUARIO,
  6.                                 $password = PASSWORD, $baseDatos = BD)
  7.    {      
  8.         parent::__construct($servidor, $usuario, $password, $baseDatos);  
  9.     }    
  10.     public static function conectar()
  11.     {
  12.         if (!isset(self::$_instancia)) {
  13.             $thisClass = __CLASS__;      
  14.             self::$_instancia = new $thisClass ;
  15.         }
  16.         return self::$_instancia ;
  17.     }
  18. }


Clase Operaciones
Código PHP:
Ver original
  1. class Operaciones
  2. {
  3.     private $_usuario;    
  4.     private $_db;    
  5.     public function __construct(usuario $usuario)
  6.     {
  7.         $this->_usuario = $usuario;
  8.         $this->_db = Persistencia::conectar();
  9.     }
  10.  
  11.     public function traerContactos()
  12.     {
  13.         $query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook "
  14.                 ."WHERE idUsuario = ". $this->_usuario->_id;
  15.          
  16.         $rs = $this->_db->query($query);
  17.         return $rs;
  18.     }
  19.    
  20.     public function traerContacto($idContacto) {
  21.         $query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook "
  22.                 ."WHERE id = $idContacto";        
  23.         $rs = $this->_db->query($query);
  24.         if (is_object($rs)) {
  25.             return $rs;
  26.         } else {
  27.             return false;
  28.         }
  29.     }    
  30.     public function muestraContactos()
  31.     {        
  32.         $html ="";
  33.         foreach ($this->_usuario->_agenda->_listaContactos as $contactos) {
  34.             $html .= "<tr class='row'>";
  35.             $html .= "<td>";
  36.             $html .= $contactos->_nombre;
  37.             $html .= "</td>";
  38.             $html .= "<td>";
  39.             $html .= $contactos->_apellido;
  40.             $html .= "</td>";
  41.             $html .= "<td>";
  42.             $html .= $contactos->_telefono;
  43.             $html .= "</td>";
  44.             $html .= "</tr>";
  45.         }
  46.         return $html;
  47.     }    
  48.     public function agregarContacto($nombre, $apellido, $telefono)
  49.     {        
  50.         $query = "INSERT INTO phonebook (FirstName, LastName, phonenumber,idUsuario) "
  51.                 ."VALUES('$nombre', '$apellido', '$telefono',{$this->_usuario->_id})";        
  52.         $this->_db->query($query);
  53.     }
  54. }

Bien ahora por último vamos a ver como se dibuja en pantalla lo que el usuario quiere ver que para este caso es un reporte de los contactos almacenados

Clase Borde
Código PHP:
Ver original
  1. $usr = $_GET["usr"];
  2.  
  3. class Reporte
  4. {
  5.     public static function main() {
  6.         $usuario = new Usuario();
  7.         $usuario->cargarDatos($usr);
  8.        
  9.         $agenda = new Agenda();
  10.         $usuario->asociaAgenda($agenda);
  11.        
  12.         $oc = new Operaciones($usuario);
  13.         $objContactos = $oc->traerContactos();
  14.        
  15.         while ($contactoRs = $objContactos->fetch_object()) {
  16.             $agenda->agregaContacto(new Contacto($contactoRs->id, $contactoRs->FirstName,
  17.                                                  $contactoRs->LastName,
  18.                                                  $contactoRs->phonenumber));
  19.         }
  20.  
  21.         require_once 'head.html';;
  22.         echo "<a href='agregarContacto.php'><img src='imagenes/user__plus.png' border=0> Agregar Contacto</a></a><br><br>";
  23.         echo "<div class='centrado'><table align='center'><tr ><th>Nombre</th>";
  24.         echo "<th>Apellido</th>";
  25.         echo "<th>Teléfono</th></tr>";
  26.         echo $oc->muestraContactos();
  27.         echo "</table></div><br>";
  28.    
  29.     }
  30. }
  31.  
  32. Reporte::main();

y para verlo en acción: http://localhost/Reporte.php?usr=7th_Sign

En este ejemplo traté de usar, la agregación y la asociación y no se si las aplique bien, también tengo duda sobre el uso de la multiplicidad así como las consultas a la BD.

A ver si alguien puede decirme que deficiencias tiene este ejemplo en cuanto a UML así como que hacer para mejorarlo.

¿o creen que ya soy un experto?

Saludos