Creando una capa de abstraccion de base de datos

Iniciado por ~ Yoya ~, Enero 30, 2013, 01:16:52 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 30, 2013, 01:16:52 AM Ultima modificación: Enero 30, 2013, 11:47:37 AM por ~ Yoya ~
Bueno este tema era para dar respuesta a uno, pero pienso que es mejor crear un POST.

Este tema es simple de entender, y en este tema se aplica el concepto de abstraccion y aquí se puede ver la utilidad.

Bueno normalmente cuando se crea un sistema utilizando POO, siempre se piensa en crear una clase padre, esta clase padre es recomendable que sea abstracta, ya que la finalidad de esta clase es ser heredara y  implementar todos sus métodos abstractos.


Ahora aplicando ese concepto al ámbito de base de datos. Se tiene lo siguiente: En toda base de datos es necesario realizar una conexión, también se realiza sentencias SQL, se devuelve un resultado y se cierra la conexión. Eso es lo que tienen en común, MYSQL, PostgreSQL, etc... Todo lo que tienen en comun, en la clase padre, se debe declarar como metodos abstractos. Metodos porque realizan una accion y deben ser abstracto porque el procedimiento para la implementación es diferente, osea no utilizas la misma función para conectarte a un servidor MYSQl que para uno PostgreSQL.

Bueno, aqui el codigo, no lo he probado ni nada, es un Poc para que tengan una idea.

Código: php

abstract class BaseDeDatos {

abstract public function conectar($user, $pass, $db, $host);
abstract public function sql($sql);
abstract public function resultado();
abstract public function cerrarConexion();
}


MYSQL
Código: php

class Mysql extends BaseDeDatos {

public function  conectar($user, $pass, $db, $host) {

//Me conecto al servidor con el usuario y pass, y selecciono la base de datos, luego devuelvo el objeto para luego realizar consultas
//Codigo
//Codigo
//Codigo
}

public function sql($sql) {
//Codigo que realiza la consulta SQL, y guarda el resultado en una variable para su posterior uso
//Codigo
//Codigo
//Codigo
//Codigo
}

public function resultado() {
//Retorno el resultado de la consulta SQL
//Codigo
//Codigo
//Codigo
}

public function cerrarConexion(){
//Cierro la conexion que cree
//Code
//Code
//Code
}
}


PostgreSQL
Código: php

class PostgreSQL extends BaseDeDatos {

public function  conectar($user, $pass, $db, $host) {

//Me conecto al servidor con el usuario y pass, y selecciono la base de datos, luego devuelvo el objeto para luego realizar consultas
//Codigo
//Codigo
//Codigo
}

public function sql($sql) {
//Codigo que realiza la consulta SQL, y guarda el resultado en una variable para su posterior uso
//Codigo
//Codigo
//Codigo
//Codigo
}

public function resultado() {
//Retorno el resultado de la consulta SQL
//Codigo
//Codigo
//Codigo
}

public function cerrarConexion(){
//Cierro la conexion que cree
//Code
//Code
//Code
}
}


Espero que con eso se haya entendiendo el concepto. Y eso ya da cabida a poder implementar otros sistema de gestión de base de datos. Con eso se consigue tener algo mas generico, osea no importa con que base de datos estes trabajando, vas a utilizar todo de la misma manera.

Hay se aplica 5 muy importante puntos.

1 - Se crea un sistema escalable, osea que se puede implementar en un futuro otros sistema de base de datos, sin necesidad de agregar codigo ni modificar codigo de alguna clase ya existente.

2 - Se aplica el principio open-closed. Las clases deben estar abierta a extensiones, pero cerrada a modificaciones. Como lo ven, apartir de la clase BaseDeDatos, se crea una extencion para MySQL, PostgreSQL pero no hay necesidad de modificar la clase BaseDeDatos.

3 - Se aplica correctamente la herencia. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Osea MySQL es una Base de datos, PostgreSQL es una base de datos. -- Mysql is a BaseDeDatos, PostgreSQL is a BaseDeDatos.

4 - Se aplica correctamente la abstraccion.

5 - Da cabida al polimorfismo

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

ves? esto era de lo que hablaba, si haces post explicando cosas como esta, no hablarás de cosas que probablemente pocos usuarios entiendan, porque podrán leerlo y aprender directamente desde underc0de, además de que le haces un bien al foro xDD

se agradece el aporte.

un saludo!

jejeje no pasa nada :P

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Muy bueno el aporte, thanks!
Sólo he echado en falta que no estuviera el código al completo! Es lo que tiene ser un perfecto newbie!!

Saludos

Ahora que veo el tema y que lo comentan...
En vez de usar una clase completamente abstracta, si no me equivoco también se podria usar una interfaz!
Saludos

Eso es correcto
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.