Underc0de

Programación Web => Back-end => Mensaje iniciado por: ~ Yoya ~ en Enero 30, 2013, 01:16:52 AM

Título: Creando una capa de abstraccion de base de datos
Publicado por: ~ Yoya ~ en Enero 30, 2013, 01:16:52 AM
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) [Seleccionar]

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) [Seleccionar]

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) [Seleccionar]

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. Is a (http://en.wikipedia.org/wiki/Is-a). 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.
Título: Re:Creando una capa de abstraccion de base de datos
Publicado por: Alex en Enero 30, 2013, 02:03:29 AM
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!
Título: Re:Creando una capa de abstraccion de base de datos
Publicado por: ~ Yoya ~ en Enero 30, 2013, 11:50:44 AM
jejeje no pasa nada :P

Saludos.
Título: Re:Creando una capa de abstraccion de base de datos
Publicado por: empardopo en Julio 17, 2013, 02:27:29 PM
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
Título: Re:Creando una capa de abstraccion de base de datos
Publicado por: Destructor.cs en Julio 17, 2013, 03:16:15 PM
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
Título: Re:Creando una capa de abstraccion de base de datos
Publicado por: ~ Yoya ~ en Julio 18, 2013, 12:01:27 AM
Eso es correcto