Ver Mensaje Individual
  #8 (permalink)  
Antiguo 19/08/2011, 16:12
Avatar de jahepi
jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 20 años
Puntos: 43
Respuesta: Object Oriented en la cruda realidad

Hola drieran !

Aparte del ejemplo de Ronruby te pongo otro ejemplo de implementación de como puedes separar tu capa de acceso a datos con la capa de dominio.

Primero en tu capa de acceso a datos haremos una clase persona que se encargue de consultar la información de algún manejador de base de datos, llamaremos a esta clase "PersonaPersistencia":

Código php:
Ver original
  1. class PersonaPersistencia
  2. {
  3.     private $_db;
  4.    
  5.     public function __construct() {
  6.         $this->_db = new DB();
  7.     }
  8.    
  9.     public function obtenerPorId($id) {
  10.         return $this->_db->ejecutarSQL("SELECT * FROM personas WHERE id = $id");
  11.     }
  12.    
  13.     public function obtenerTodos() {
  14.         return $this->_db->ejecutarSQL("SELECT * FROM personas");
  15.     }
  16.    
  17.     public function insertar($nombre) {
  18.         return $this->_db->ejecutarSQL("INSERT...");
  19.     }
  20.    
  21.     public function actualizar($id, $nombre) {
  22.         return $this->_db->ejecutarSQL("UPDATE...");
  23.     }
  24. }

Como puedes ver tiene un atributo privado "db", que es un objeto de la clase DB que se encargaría de abstraer el acceso a los diferentes manejadores de base de datos, por ejemplo la clase DB podría hacer uso de PDO para conectarte a MySql, SQL Server, entre otros.
También puedes observar cada unos de los métodos públicos para consultar, insertar y actualizar la información con la ayuda de la instancia db.

La implementación de la clase DB no la he puesto para no complicarnos más de la cuenta, pero estoy seguro que captarás la idea.

Ahora si pasemos a ver la clase Persona, que contendrá cada uno de los atributos como id, nombre y edad, esta hará uso de la clase de persistencia para consultar, insertar y actualizar los datos necesarios.

Código php:
Ver original
  1. class Persona {
  2.    
  3.     private $_id;
  4.     private $_nombre;
  5.    
  6.     private static $_persistencia = new PersonaPersistencia();
  7.    
  8.     public function __construct() {
  9.     }
  10.    
  11.     public static function obtener($id) {
  12.         $dato = self::$_persistencia->obtenerPorId($id);
  13.         $persona = new Persona();
  14.         $persona->_id = $datos['id'];
  15.         $persona->_nombre = $datos['nombre'];
  16.         return $persona;
  17.     }
  18.    
  19.     public static function obtenerTodos() {
  20.         $personas = array()
  21.         $datos = self::$_persistencia->obtenerTodos();
  22.         foreach($datos as $dato) {
  23.             $persona = new Persona();
  24.             $persona->_id = $datos['id'];
  25.             $persona->_nombre = $datos['nombre'];
  26.             $personas[] = $persona;
  27.         }
  28.         return $personas;
  29.     }
  30.    
  31.     public function guardar() {
  32.         if($this->_id == 0) {
  33.             $this->_id = self::$_persistencia->insertar($this->_nombre);
  34.         } else {
  35.             self::$_persistencia->actualizar($this->_id, $this->_nombre);
  36.         }
  37.     }
  38.    
  39.     public function setNombre($nombre) {
  40.         $this->_nombre = $nombre;
  41.     }
  42.    
  43.     public function getNombre() {
  44.         return $this->_nombre;
  45.     }
  46.    
  47.     public function getId() {
  48.         return $this->_id;
  49.     }
  50. }

Hemos agregado 2 atributos privados, lo que es el id y el nombre, y otro atributo estático que es la instancia de persistencia que es responsable de consultar los datos, el porque es estático este atributo es debido a que se usará tanto en los métodos de instancia como en los métodos de clase y también para evitar que se cree una nueva instancia de persistencia cada ves creemos una persona, veamos el porque:

Tenemos 2 métodos estáticos que son obtener y obtenerTodos que hacen uso de la instancia de persistencia tanto para crear una instancia de una persona de acuerdo al id pasado como parámetro como otro para obtener un arreglo con todas la personas existentes.
Son estáticos porque no es necesario crear una instancia de persona para poder hacer uso de ellos.

Por ejemplo podriamos hacer esto para obtener una persona o el listado completo:

Código php:
Ver original
  1. // Obtenemos la persona con id 1
  2. $persona = Persona::obtener(1);
  3.  
  4. // Obtenemos todo el listado de personas
  5. $personas = Persona::obtenerTodos();

Ahora los métodos de instancia como guardar, se encargaría de mandar la orden ya sea de actualizar o insertar la persona con la ayuda de la persistencia, verificaremos si el id es 0, quiere decir que es nuevo y lo insertaremos, actualizando el atributo id de persona al finalizar la inserción o actualizar si el id está definido.

También tenemos los métodos accesores como setNombre y getNombre para poder modificar y consultar los atributos de persona.

Ahora por ejemplo podriamos crear una instancia de persona de esta forma y guardarla en la base de datos:

Código php:
Ver original
  1. $persona = new Persona();
  2. $persona->setNombre("Juan");
  3. $persona->guardar();

O podriamos obtener alguna persona y modificar su nombre:
Código php:
Ver original
  1. $persona = Persona::obtener(1);
  2. $persona->setNombre("Juan");
  3. $persona->guardar();

No sé si el código tenga errores, no lo pude probar, pero a grandes rasgos me parece una implementación bastante clara.

Espero que te sea de ayuda.

Un saludo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.