Comentarios sobre: "¿Cual es la mejor capa de abstracción?"

Escribí una respuesta a un comentario de un lector del blog y esta se me volvió casi un "post" completo. Para que no quede en el olvido, lo muevo aquí, pues es algo que me han preguntado mucho y que he sugerido mucho sin que me preguntaran ;-)

Todo se inició hablando de componentes de Pear que ofrecen los servicios de "abstracción de Bases de datos", que entre otras cosas nos evitan que usemos  funciones específicas de PHP que nos atan a la base de datos de turno.

Marconi me consulta si no es mejor MDB2, lo cual le respondo lo siguiente:

Lo de "mejor o no", es dependiente siempre del contexto ;-)

No he tenido el gusto de probar todas las alternativas existentes en Pear, como el caso de MDB2, pero si te puedo hacer una sugerencia:

Crea un "capa de abstracción" que te "abstraiga" de las herramientas que ofrecen los servicios de "abstracción de bases de datos concretos" ;-)

Es decir, crea una clase BaseDeDatos (o como quieras que se llame) que use internamente, por ejemplo, MDB2. Deberás implementar por lo menos las operaciones básicas (conectar, desconectar, consultar, registros afectados, etc) ... pero no lo haces de cero, internamente lo haces con MDB2.

Si en un futuro, cercano o lejano, encuentras otra herramienta de abstracción que se adapta maś a tu contexto (rendimiento, flexibilidad, simplicidad, etc), podrás reemplazar MDB2 por la nueva, sin que tu aplicación se vea afectada por el cambio (ella dependerá de tu clase "BaseDeDatos", y no concretamente de una herramienta específica).

Una premisa en Diseño Orientado a Objetos es: "no dependas de implementaciones concretas, solo de implementaciones abstractas".

Veo muy seguido que los "novatos" (los que hacen sus primeras armas) lo primero que intentan es crearse componentes "de cero" (como la capa de abstracción) sin usar herramientas que los auxilien.

Reutiliza, no reinventes la rueda constantemente.

Pierde tiempo en las cosas que interesan, las que aportan "valor agregado" a tus desarrollos y a tus clientes.

2 comentarios:

Anónimo dijo...

La verdad no se por que obtengo un resultado no esperado.

Usando codigo sencillo:

require_once 'libs/DB.php';

$dsn = 'mysql://site:site@localhost/site';

$db =& DB::connect($dsn);

if ($db)
echo ":)";
else
echo ":(";

$db->free();
$db->disconnect();
?>

La pagina solo se queda en blanco y por mas que recarge no pasa nada... :( solo una pagina en blanco.

Tiene algun problema usar AppServ 2.5.1 para crear estos ejemplos?

Enrique Place dijo...

Consejo: trata de ser siempre "extremadamente metódico".

Debes ser muy ordenado; escribe en un papel la lista de casos posibles de error, los cuales debemos verificar. Y si cambias algo "importante", vuelve a empezar los controles de cero (aunque parezca trivial).

1) Prueba la conexión a la base de datos a través de un cliente (el que tengas a mano, tal vez la consola, o vía web con phpmyadmin).

2) Si funciona el punto 1, quiere decir que la base funciona y que responde las conexiones. Ok, pasemos a reforzar el código PHP para ver que mensajes de error se pueden estar generando y no los estamos capturando:

$db =& DB::connect($dsn, $options);
if (PEAR::isError($db)) {
die($db->getMessage());
}

3) También deberías mirar el log del servidor web, tanto el "accesslog" como el "errorlog", y tener habilitado todos los mensajes de error de PHP:

error_reporting(E_ALL & ~E_NOTICE);

4) Usa el "print_r" y el "var_dump" para hacer un "debug" del contenido de las variables que supuestamente deberían regresar con un valor o con una instancia del objeto. Luego del "connect", algo debería haber en $db:

var_dump($db);

Resumen: Si tienes una "página en blanco", analiza todos los pasos que se deben dar para llegar a eso (aunque no creas, "algo" pasa antes de dar la página ;-))

Navegador -> Servidor Web -> PHP -> Pear -> MySQL

¿Todo esto anda? Prueba todo el camino sin obviar nada.

Entradas populares