Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Crear Clase BaseDeDatos que use internamente otra clase de Abstarcción de db

Estas en el tema de Crear Clase BaseDeDatos que use internamente otra clase de Abstarcción de db en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola estuve leyendo un articulo muy interesante de Enrique Place "¿Cual es la mejor capa de abstracción?" . Yo actualmente uso en mis proyecto la ...
  #1 (permalink)  
Antiguo 20/07/2006, 20:04
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Crear Clase BaseDeDatos que use internamente otra clase de Abstarcción de db

Hola estuve leyendo un articulo muy interesante de Enrique Place "¿Cual es la mejor capa de abstracción?".

Yo actualmente uso en mis proyecto la clase de abstracción de base de datos que utiliza phpBB.

Ahora estoy empezando a usar Zend Framework, y mi idea es crear una Clase de Abstraccion de base de datos que utilice internamente la "Abstración de Base de datos de Zend Framework" pero la idea es que esta nueva clase remplaze a la que actualmente utilizo en mis proyectos osea que mantenga los mismos objetos y funciones basicas pero con el nuevo motor de "Abstración de Base de datos de Zend Framework", es posible?

a continuación explico la clase de base de datos de phpBB, creo que muchos la conocen:

Código PHP:
$db = new sql_db($servidorBD$usuarioBD$passBD$nombreBDfalse);
if(!
$db->db_connect_id) {
    die(
"<br><br><center><img src=images/logo.gif><br><br><b>Existe un problema con el servidor de MySQL, disculpe por el inconveniente.<br><br>Estaremos pronto de regreso.</center></b>");

// Ejemplo de consulta tipica
$resultado $db->sql_query('SELECT * FROM tbl_usuario WHERE nick = \'' $_SESSION["usuario"] . '\'');
if (
$db->sql_numrows($resultado)>0)
{
  while(
$filas $db->sql_fetchrow($resultado))
  {
    
print_c($filas);
  }


else 
{
print(
"No hay registros");

Como podría empezar a crear esta nueva clase que permita usar el motor del Zend Framework sin tener que modificar los objetos y funciones que invocan a la clase de base de datos de phpBB, lo digo porque la idea es no tener que cambiar todos mis archivos php:
Las funciones basicas de la clase son:
Código PHP:
//crear el objeto, ejecuta al contructor:
$db = new sql_db($servidorBD$usuarioBD$passBD$nombreBDfalse);

// funciones 
$db->sql_query($consulta)
$db->sql_numrows($resultado)
$db->sql_fetchrow($resultado// recorre el arreglo con while
$db->db_connect_id()
$db->sql_error()
$db->sql_close()
$db->sql_freeresult() 
Aun soy novato de POO, se lo basico, tendria que usar extends:
Necesito que me orinten un poco, la ideas es almenos mantener las funciones de arriba y que la funcion $db->sql_fetchrow() la recorra con while ya que asi estan en todos mis archivos y no con foreach.
Código PHP:
class NuevaExtraccionBD extends Zend_Db {
    

Gracias y salu2,


zsamer

Última edición por zsamer; 20/07/2006 a las 20:15
  #2 (permalink)  
Antiguo 21/07/2006, 07:38
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Cita:
// funciones
$db->sql_query($consulta)
$db->sql_numrows($resultado)
$db->sql_fetchrow($resultado) // recorre el arreglo con while
$db->db_connect_id()
$db->sql_error()
$db->sql_close()
$db->sql_freeresult()
el Paquete Zend_Db ya lleva incorporado todo eso. Además es una abstraccion de una abstracción. Así que tu harías una abstraccion de una abtraccion de una abtraccion. No te lo recomiendo. Aunque si que te mires un poco la documentación http://framework.zend.com/manual/en/zend.db.html
  #3 (permalink)  
Antiguo 21/07/2006, 07:54
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Cita:
Iniciado por Casuis
el Paquete Zend_Db ya lleva incorporado todo eso. Además es una abstraccion de una abstracción. Así que tu harías una abstraccion de una abtraccion de una abtraccion. No te lo recomiendo. Aunque si que te mires un poco la documentación http://framework.zend.com/manual/en/zend.db.html
yo se que zend hace eso y mucho más, mi problema es evitar tener que modificar mis archivos que empleas la otra abstracción de base de datos (phpbb), y segun el articulo de Enrique, no se si lo has leido, dice que es bueno crear una clase de abstracción de base de datos por la siguiente razón:

Cita:
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, Zend, Perl ,etc... 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 Zend u otra.

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 ZEND 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".
  #4 (permalink)  
Antiguo 21/07/2006, 11:53
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Buenassss.... bueno, primero gracias por haberme nombrado dos veces, mi ego está en sus más altos niveles

Quiero usar una frase de un colega: "esta solución es para 'este' contexto, si me cambian el contexto, la solución será otra".

También puedo inventar una (basada en "Groucho Marx"): "Estas son mis opiniones. Si a usted no le gustan, tengo otras".

Dejando las bromas de lado, a lo que voy, fuera de que lo que yo diga o escriba no es ley (y creo que tampoco deberías tomar a nadie así), habría que sacar nuestras propias conclusiones de acuerdo a nuestro nuestra experiencia, nuestro sentido común y nuestro contexto.

La opinión de Casuis la respeto, pero puedo discrepar con ella (lo que no quiere decir que uno u otro esté realmente equivocado, todo dependerá del contexto). El mejor ejemplo que tengo de "abstracción sobre abstracción" son todas las capas que pueden tener arquitecturas de tipo J2EE (java).

El tema es, en mi opinión, discernir si estamos construyendo un cañón láser para matar moscas o una revista enrollada para matar mamuts.

En los desarrollos que he participado, en un principio usamos herramientas similares a Zend, que nos resolvía la "capa de abstracción" que nos evita trabajar directamente con una base de datos, facilitando a su vez si deseábamos migrar de motor.

También me sucedió que estando "casados" con una herramienta que tenía la responsabilidad de resolver la problemática de esa "capa", decidimos cambiar de herramienta por otra que nos ofrecía distintas prestaciones.

Finalmente, creamos una capa de abstracción nueva, que nos permitía subir un nivel más para evitar este tipo de situaciones (que perfectamente podemos estar hablando de una simple implementación del patrón "Fachada").

Pero la pregunta es siempre la misma: ¿en tu "caso" (contexto) es rentable aplicar una estrategia similar?

Si es poco probable que te suceda, o solo te va a pasar una vez, tal vez no tenga sentido hacer esto, de forma tan concreta.

Pero creo que sí deberíamos tener en cuenta algunas guías "generales" de diseño:

- "No dependas de implementaciones concretas, en lo posible, de implementaciones abstractas".

- Encuentra el posible "foco de cambio", y busca la forma de "contenerlo" (alguna estrategia, por ejemplo, un patrón de diseño, etc).

PD: por regla, si no te gustan las respuestas que puedan dar a tus preguntas, no hagas preguntas, y haz lo que te parezca mejor. Aprender es equivocarse
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 21/07/2006 a las 11:59
  #5 (permalink)  
Antiguo 21/07/2006, 13:53
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
En fin si quieres cambiar el Zend_Db y crear otra capa con el codigo copiado de phpBB hazlo, te digo: tu fallido modelo de negocio no es mi problema.

Zend separa el Modelo de la Vista del Controlador.
Zend_Db básicamente es un paquete de acceso a datos. Que no lo quieres utilizar pues entonces no lo utilizes.
Yo ahora en muchos proyectos utilizo mi paquete ADODB Active Record y para pasar de un modelo a otro no tengo que crear ninguna capa ni cosas de esas lo unico que cambio es el Zend::register(); una simple linia de codigo en el index.php.

Pero bueno sobre todo lo que no me gusta es el Zend_View y lo cambio por Smarty otra simple linia.

Simplemente haz lo que quieras ahora estas cayendo en un gravisimo error conceptual.

Ahora que te gusta abstraer y abstraer y abstraer pues entonces hazlo crea una nueva clase y le aplicas extends y copia tu codigo phpBB por supuesto que lo puedes hacer.

Pero te lo vuelvo a repetir leete el manual http://framework.zend.com/manual
  #6 (permalink)  
Antiguo 21/07/2006, 15:09
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Ok Casuis, gracias a ambos. Investigaré sobre lo que comento Casuis para pasar de un modelo a otro "Zend::register()"

salu2,


zsamer.
  #7 (permalink)  
Antiguo 22/07/2006, 04:10
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Dos preguntas, porqué tan categórico para decir "fallido modelo de negocio" y "gravísimo error conceptual"?

No estoy siendo irónico, pregunto para comprender claramente tu punto de vista.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 22/07/2006, 06:31
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
En fin... utilizar codigo de proyectos como phpBB o wordpress etc... donde estan diseñados para funcionar en la mayoria de servidores y generalmente programados para php4, la tendendia de estos proyectos es a no separar las capas. Asi la practica de codigo html con funciones de control de post y luego acceso a base de datos y luego procesar los datos... en una misma página es lo general.

Pero yo me pregunto: Si decides utilizar Zend Framework con una muy buena abstraccion de base de datos de las mejores diria yo actualmente de las mas vanguardistas y te decides cargar todo el diseño porque lo mas seguro es que estan tan acostumbrado a las antiguas funciones y piensas: por qué cambiar total ya funciona... Entonces yo me pregunto por que te empeñas en cambiar a Zend Framework si no vas a utilizar los nuevos paradigmas. Coge tu codigo phpBB y sigue mezclando HTML si funciona pues ya vale no??

El problema viene en entornos empresariales donde como analista tienes que gestionar un equipo. Entonces necesitas tener un framework bien documentado para que todo el equipo se adapte y pueda desarrollar. Tambien para que en cada proyecto solo te dediques a programar las singularidades demandadas por el cliente.

Un ejemplo tengo el modelo "model/Categorias.php" en el paquete que diseñe abstraccion con ADODB funciona asi pongo 2 funciones:


Código PHP:
class Categoria extends ActiveRecord {
       
       public function 
getNombres(){
           
$sql "select distinct(nombre) from ".this->_tableName;
           return 
$this->find_all($sql);
       }
       
       
       public function 
getPadres(){
               
$sql "select * from "$this->_tableName ."where parent =0";
               return 
$this->find_all($sql);
       }
       
       


Muy bien ahora lo que tube que hacer para utilizar la abstraccion de Zend con PDO
Código PHP:
class Categoria extends  Zend_Db_Table {
    
    public function 
getNombres(){
        
$sql "select distinct(nombre) from ".$this->_tableName;
        return 
$this->fetchAll($sql);
    }
    
    public function 
getPadres(){
        
$sql "select * from ".$this->_tableName"where parent = 0";
        return 
this->fetchAll($sql);
    }

Para poder utilizar uno u otro en index.php solo hago un register y ya esta. Es simple porque parti de un buen diseño nada más.
  #9 (permalink)  
Antiguo 22/07/2006, 10:02
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
En todo caso Casuis yo me refería a crear una clase extendida de Zend_Db que utilice los mismos "nombres" de las funciones de la clase de phpBB, OJO solo NOMBRES, el motor y el diseño obviamente será con el de Zend Framework y sus nuevos paradigmas.

Y lo necesito asi para evitar tener que cambiar todos mis archivos php que utilizan la clase de abstracción de db de phpBB, en el fondo que mantenga el llamado a los Objetos y funciones de las actuales, pero solo en "Nombre", la clase obviamente sea la nueva que emplea el diseño / motor de Zend Framework.

No sé si me he explicado bien o no.
  #10 (permalink)  
Antiguo 22/07/2006, 12:38
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Si, ahora quedó mucho más claro tu punto de vista, y estoy más de acuerdo contigo

En mi caso, me basaba más en experiencias y conceptos generales en oposición a usar concretamente una herramienta. Todavía estoy haciendo pruebas con Zend framework, y por lo que cuentas, soluciona muchos de los problemas típicos y recurrentes de los sistemas actuales, o que comenten actualmente la mayoría de los desarrolladores.

Pero bueno, siempre hay que dejar abierto el camino por si no usan las mismas herramientas que uno y prefieren discutir conceptos tontos
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:33.