Ver Mensaje Individual
  #16 (permalink)  
Antiguo 07/05/2010, 02:29
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: PHP 5.2 vs PHP 5.3 parámetros por defecto

Ok Matrano , es una broma.

Vamos por parte:

Cita:
Iniciado por maturano Ver Mensaje
- GatorV hace la observación que no se hace nada más allá de la implementación del patrón singleton. No es necesaria la sobre-escritura de los métodos si solo se va a ser un paso de parámetros hacia PDO. Propone, en su lugar, hacer herencia de PDO.
Respeto la opinión de GatorV.

Solo 2 detalles, no seria necesario extender de PDO y que carece de constructor lo cual ya no cumpliría con el Singleton.

Código PHP:
Ver original
  1. final class Database extends PDO
  2.       {
  3.           private static $dns = DNS;
  4.           private static $username = USERNAME;
  5.           private static $password = PASSWORD;
  6.           private static $PDO = null;
  7.          
  8.           public static function getInstance()
  9.           {
  10.               if (!(self::$PDO instanceof PDO)) {
  11.                   self::$PDO = new PDO(self::$dns, self::$username, self::$password);
  12.                   self::$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13.               }
  14.               return self::$PDO;
  15.           }
  16.       }
  17.        
  18.       $db = Database::getInstance();
  19.       $db->query('DESCRIBE `table`');

Aunque pienso que la clase de Danmichel tiene cierto nivel de abstracción y va más allá de “una sobre-escritura de los métodos”, ya que el método query de la clase Database se abstrae del método query de PDO.

Código PHP:
Ver original
  1. final class Database
  2.       {
  3.           static private  $dns       = DNS;
  4.           static private  $username  = USERNAME;
  5.           static private  $password  = PASSWORD;
  6.           static private  $instance;
  7.           static private  $PDO;
  8.  
  9.           private function __construct()
  10.           {
  11.           try {
  12.               self::$PDO = new PDO(self::$dns, self::$username, self::$password);
  13.               self::$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14.           } catch (PDOException $e) {
  15.               echo 'Connection failed: ' . $e->getMessage();
  16.           }
  17.           }
  18.           static public function getInstance()
  19.            {
  20.              if (!isset(self::$instance))
  21.              {
  22.                $c = __CLASS__;
  23.                self::$instance = new $c;
  24.              }
  25.               return self::$instance;
  26.            }
  27.  
  28.           public function query($statement, $PDO = null, $object = null)
  29.           {
  30.               return self::$PDO->query($statement, $PDO, $object);
  31.           }
  32.       }
  33.       $db = Database::getInstance();
  34.       $db->query('DESCRIBE `table`');

¿Que inconveniente tendríamos si quisiéramos cambiar la Capa de Abstracción de acceso a la Bases de Datos para utilizar ADODB en vez de PDO?

Supongamos que desarrollamos todo nuestro sistema invocando las propiedades y métodos que nos provee PDO directamente.

Inconvenientes

Estaríamos atados a una implementación concreta, con lo que rompemos con una premisa del Diseño Orientado a Objetos.

Tendríamos que re implementar toda nuestra lógica de negocio donde quiera que hayamos utilizado una propiedad o método pertenecientes a PDO.

- GatorV ¿Que me dices sobre abstraerse de los servicios que proveen las herramientas de abstracción de acceso a Bases de Datos, como Adodb, PDO ...?

Cita:
Iniciado por maturano Ver Mensaje
Correcta observación... aunque "cerrada". Te propongo ser más flexible con aquello de "el constructor deber ser privado". Lo que importa es controlar el alcance del constructor a manera de impedir se pueda obtener una instancia directa de la clase (por medio de new). Si bien ese control lo obtienes desde el lenguaje declarando el constructor como privado o protegido, igual puedes controlarlo lanzado un error de ejecución (que igual la solución te lo proporciona el lenguaje ).

Valida tu propuesta y “buen aporte” pero de esta forma que planteas impedirías por completo la creación de instancias de la clase Database, ya que no se podría crear instancias de la misma ni dentro de la clase ni desde fuera.

Cita:
Iniciado por maturano Ver Mensaje
Entonces, ¿en verdad no te entendí?; ¿serías tan amable de explicarme en qué?.
Me refería manteniendo el mismo ejemplo inicial de Danmichel “que el constructor contiene lógica”.

Última edición por atrianaster; 07/05/2010 a las 02:57