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 originalclass Usuario
{
private $_db;
private $_nombre;
private $_id;
private $_agenda;
public function __construct()
{
$this->_db = Persistencia::conectar();
}
private function cargarDatos($usr)
{
$query = "SELECT nombreUsuario, id FROM usuario "
. "WHERE nombreUsuario = '$usr' LIMIT 1";
$rs = $this->_db->query($query);
$data = $rs->fetch_object();
$this->_nombre = $data->nombreUsuario;
$this->_id= $data->id;
$this->_sesionActiva = true;
}
public function asociaAgenda(Agenda $agenda)
{
$this->_agenda = $agenda;
}
public function __set($atr,$valor)
{
$this->$atr = $valor;
}
public function __get($atr)
{
return $this->$atr;
}
}
Clase Agenda
Código PHP:
Ver originalclass Agenda {
private $_listaContactos = array();
public function __construct()
{
}
public function agregaContacto(Contacto $contacto)
{
$this->_listaContactos[] = $contacto;
}
public function __get($atributo) {
return $this->$atributo;
}
}
Clase Contacto
Código PHP:
Ver originalclass Contacto
{
private $_id ;
private $_nombre;
private $_apellido;
private $_telefono;
public function __construct($id, $nombre, $apellido, $telefono) {
$this->_id = $id;
$this->_nombre = $nombre;
$this->_apellido = $apellido;
$this->_telefono = $telefono;
}
public function __get($atributo)
{
return $this->$atributo;
}
public function __set($atributo,$valor)
{
$this->$atributo = $valor;
}
}
Clase Persistencia
Código PHP:
Ver originalclass Persistencia extends mysqli
{
private static $_instancia;
private function __construct($servidor = SERVIDOR, $usuario = USUARIO,
$password = PASSWORD, $baseDatos = BD)
{
parent::__construct($servidor, $usuario, $password, $baseDatos);
}
public static function conectar()
{
if (!isset(self::$_instancia)) { $thisClass = __CLASS__;
self::$_instancia = new $thisClass ;
}
return self::$_instancia ;
}
}
Clase Operaciones
Código PHP:
Ver originalclass Operaciones
{
private $_usuario;
private $_db;
public function __construct(usuario $usuario)
{
$this->_usuario = $usuario;
$this->_db = Persistencia::conectar();
}
public function traerContactos()
{
$query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook "
."WHERE idUsuario = ". $this->_usuario->_id;
$rs = $this->_db->query($query);
return $rs;
}
public function traerContacto($idContacto) {
$query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook "
."WHERE id = $idContacto";
$rs = $this->_db->query($query);
return $rs;
} else {
return false;
}
}
public function muestraContactos()
{
$html ="";
foreach ($this->_usuario->_agenda->_listaContactos as $contactos) {
$html .= "<tr class='row'>";
$html .= "<td>";
$html .= $contactos->_nombre;
$html .= "</td>";
$html .= "<td>";
$html .= $contactos->_apellido;
$html .= "</td>";
$html .= "<td>";
$html .= $contactos->_telefono;
$html .= "</td>";
$html .= "</tr>";
}
return $html;
}
public function agregarContacto($nombre, $apellido, $telefono)
{
$query = "INSERT INTO phonebook (FirstName, LastName, phonenumber,idUsuario) "
."VALUES('$nombre', '$apellido', '$telefono',{$this->_usuario->_id})";
$this->_db->query($query);
}
}
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$usr = $_GET["usr"];
class Reporte
{
public static function main() {
$usuario = new Usuario();
$usuario->cargarDatos($usr);
$agenda = new Agenda();
$usuario->asociaAgenda($agenda);
$oc = new Operaciones($usuario);
$objContactos = $oc->traerContactos();
while ($contactoRs = $objContactos->fetch_object()) {
$agenda->agregaContacto(new Contacto($contactoRs->id, $contactoRs->FirstName,
$contactoRs->LastName,
$contactoRs->phonenumber));
}
require_once 'head.html';;
echo "<a href='agregarContacto.php'><img src='imagenes/user__plus.png' border=0> Agregar Contacto</a></a><br><br>";
echo "<div class='centrado'><table align='center'><tr ><th>Nombre</th>";
echo "<th>Apellido</th>";
echo "<th>Teléfono</th></tr>";
echo $oc->muestraContactos();
echo "</table></div><br>";
}
}
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