Yo nunca recibi una educacion formal para programar, como muchos empeze con basic, y macros en hojas electrónicas por alla de finales de los 80’s, luego tuve una crisis de computo porque deje de usarlas durante los primero 4 años de estudiar QB, luego en la tesis volvi a usarlas, no mucho, pero fue cuando de plano ya sabia que eso de manejar tubitos en el laboratorio NO ME GUSTABA! y que queria estudiar quimica teorica, asi que me avente 8 años de doctorado haciendo simulaciones de Monte Carlo y Química Cuántica, y para mi fortuna, o astutamente se me ocurrio meterme mucho mas a la administración de unix, luego de linux, luego a programar web solo por hobbie, y resulto que al final soy pasante de dr, estoy tratando de terminar de escribir la tesis, y ya tengo mas de 1 año trabajando de programador y administrador de servidores.
Bueno, mucho por el royo historico, lo que realmente quiero exponer aqui es mi idea de como hacer una interfase sencilla y pequeña para obtener renglones de una base de datos de manera sencilla, y probablemente un poco limitada porque esta hecha para el blog que tengo en garaged.homeip.net, y como usa smarty es bastante particular. Cabe hacer notar que uso ADODB como intefase a la base de datos, asi que mucho del trabajo sucio ya esta escrito fuera de mi codigo 🙂
Esto ya lo habia hecho antes, en ratos los ratos de ocio las últimas semanas que trabaje en TMZ, pero la verdad no recuerdo exactamente como lo hice, y es mejor asi :), pero es muy similar a lo que hago ahora.
Sin diseño, se me ocurrio lo siguiente:
Una simple clase que maneja un “record set”, y tiene 2 metodos, uno para sacar 1 renglon, y otro para sacar todos los renglones de un solo golpe. El segundo metodo depende del primero. En realidad esto esta basado en lo que se hace en base pero en base es mucho mas complicado, y hay ciertas partes que no me gustan de como esta escrita la interfase a la BD. El defecto es que mi primera idea no estaba muy bien sentada, de hecho me dio hueva hacer un diagrama UML, asi que me lo avente nomas de coco (la vez anterior tampoco me sirvio de mucho lo del UML, no logro sacarle suficiente provecho a la planeacion ! jaja, los patrones los encuentro en la implementacion). Aqui esta el codigo:
<?php
class FetchUtil {
var $row;
var $DB_type;
function FetchUtil (&$id){
$this->row = $id;
}
function FetchRow(){
if (!$this->row->EOF){
$temp = $this->row->fields;
$this->row->MoveNext();
return $temp;
} else {
return false;
}
}
function FetchAll(){
$rs = $this->FetchRow();
while ($rs){
$rows[] = $this->FetchRow();
$rs = $this->FetchRow();
}
return $rows;
}
}
function FetchAll($query){
global $db;
$sql = $db->execute($query) or die ($db->errormsg);
$rs = new FetchUtil($sql);
$rows = $rs->FetchAll();
return $rows;
}
function FetchOne($query){
global $db;
$sql = $db->execute($query) or die ($db->errormsg);
$rs = new FetchUtil($sql);
$rows = $rs->FetchRow();
return $rows;
}
Como se puede ver esta implementación no es particularmente buena, porque la condenada clase no hace casi nada por si sola, solo hay 2 métodos mas o menos útiles. No conforme estoy usando 2 funciones para parchar mi falta de pericia al programar !
Que necesito hacer ? acercarme más a tener realmente una sola clase que sirva como interfase a la base de datos, y que contenga un método como el FetchAll que realmente devuelva los renglones con simplemente pasarle la cadena del “query” correspondiente. No quiero tener que usar ninguna función extra para “ayudarle” a la clase.
El resultado de mis siguientes 5 minutos (la nota me tomo como 1 hora!) de analisis me llevaron a esto:
<?php
class FetchUtil {
/* This class is everything a smarty using php project needs
*/
var $row;
var $DB_type;
var $DB;
function FetchUtil($dsn){
$this->DB = NewADOConnection($dsn);
if ( !$this->DB ) die(“Coneccion fallida – $dsn”);
$this->DB->SetFetchMode(ADODB_FETCH_ASSOC);
}
function Execute($query){
$this->row = $this->DB->Execute($query) or die ($this->DB->errormsg());
}
function FetchAll($query){
/* It returns 1 dimension bigger arrays for 1 row, but
* helps lowering the methods in this class
*/
$rs = Array();
$this->Execute($query);
while(!$this->row->EOF){
$temp[] = $this->row->fields;
$this->row->MoveNext();
}
return $temp;
}
}
De esta manera simplemente mandando una cadena al constructor de esta manera:
$dsn = "$data_base://$user:$passwd@$host/$db_name";
$db = new FetchUtil($dsn);
creo un objeto que es capaz por si mismo de ejecutar un query, devolverme los renglones, y darme información relevante en caso de cualquier error sin tener que duplicar codigo para ninguna de esas tareas, y usando una sola clase ! sin funciones auxiliares ! y en poco mas de 20 lineas !
Si ya se, lección numero 1 de programacion orientada a objetos, degraciadamente yo no fuí a esa clase, no estaba en mi plan de estudios 🙂
Que gano con esto ?, pues uso ADODB por si alguna vez la portabilidad es importante, uno nunca sabe !, utilizo una sola clase que hace practicamente todo el trabajo con ADODB por detras: conexión, manejo de errores, ejecusion de queries, regreso de renglones como arreglo asociativo
Es o no bonito reutilizar codigo ?? gracias por leer, espero que no te hayas saltado gran parte de lo que estaba arriba solo para leer este párrafo.
3 Comments, Comment or Ping
Yo si me salte hasya el final para leer el ultimo comentario 😀
April 24th, 2006
gracias por la honestidad 🙂
April 24th, 2006
Saludos garaged. Un excelente blog y un tip muy práctico. 🙂 Y como bien dicen, dónde quedaron los principios de la OOP?, jaja.
Que pases buen día 🙂
April 24th, 2006
Reply to “De porque soy mal programador, y porque me gusta asi”