Foros del Web » Programando para Internet » PHP »

Enfoque correcto del modelo de datos

Estas en el tema de Enfoque correcto del modelo de datos en el foro de PHP en Foros del Web. Buenas, El otro día me surgió un dilema sobre programación. Puede ser una tontería pero choco con una persona sobre eso y no se quién ...
  #1 (permalink)  
Antiguo 18/05/2012, 05:51
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 10 meses
Puntos: 32
Enfoque correcto del modelo de datos

Buenas,

El otro día me surgió un dilema sobre programación. Puede ser una tontería pero choco con una persona sobre eso y no se quién tiene razón.

La historia es que programando aplicaciones mi enfoque es "aprovéchate del sistema", mientras que el otro enfoque es "cuida al sistema".

Mi enfoque conlleva la creación de múltiples objetos contenedores de otros objetos. Esto conlleva, lógicamente, un aumento de recursos. Al realizarlo de esta manera con poco código haces mucho. Lo único que hay veces que cargas datos inecesarios (pero bueno todo eso depurable para mejorar el rendimiento).

El otro enfoque es escribir código más detallado creando objetos sólo en casos necesarios y lo demás asemejarlo a la programación estructura. Tirando mucho de métodos estáticos. De esta manera PHP únicamente va realizando tareas según va recorriendo el código. Objetos en memoria casi no hay o no hay directamente. Así, obviamente, el consumo de recursos es muy reducido.

Hay que decir que tenemos un servidor bastante potente.

El dilema es:

Poco código, muchos objetos y altos recursos (siempre que no satures la memoria claro).

ó,

Más código, menos objetos y pocos recursos.
  #2 (permalink)  
Antiguo 18/05/2012, 10:30
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Enfoque correcto del modelo de datos

Creo que aunque sea mas molesto y más difícil, lo mejor es programar justamente lo necesario sin dejar basura, usa objetos cuando sea necesario, si no usa funciones, si no usa solo arreglos, que todo sea lo justo y preciso, eso también te servirá en e futuro si tienes que modificar tu código para que no te confundas.

En cuanto a los recursos, yo creo que no importa si tienes poco o mucho, sigue programando lo justo y necesario y no de más innecesariamente, que puedas hacerlo no significa que debas hacerlo.

Yo por mi parte trato de siempre programar reduciendo al máximo, buscando las funciones que me hagan reducir el código y la memoria utilizada.

Muchas veces me he encontrado códigos como este:

$entrada=$_GET['input'];
if($entrada==0){
$salida=$entrada+1;
}else{
$salida=$entrada+2;
}

que pueden reducirse así:

$salida+=($_GET['input'])?2:1;

reduciendo variables, memoria y lineas de código

En conclusión: Cuida el sistema :bien:
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #3 (permalink)  
Antiguo 18/05/2012, 12:02
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 7 meses
Puntos: 97
Respuesta: Enfoque correcto del modelo de datos

Estroy de acuerdo en lo que dice stramin en la simplificación de código y el ejemplo que nos deja.
Sin embargo, soy del parecer que los objetos ayudan, y mucho, y sobre todo en reutilización y legibilidad.

Yo tiro mucho de objetos desde hace tiempo y en diversos lenguajes. Cierto que puede ralentizar un poco el sistema, pero si dichos objetos estan bien ajustados, y utilizados donde tocan, es casi inapreciable. Los beneficios que obtienes, la reutilización, legibilidad y flexibilidad del código justifica sobremanera la ralentización.

Poder escribir $pedido->cliente->Foto() o $usuario->direccion->poblacion->codpostal... es un ahorro inmenso de trabajo!

Salud!
  #4 (permalink)  
Antiguo 19/05/2012, 02:28
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 10 meses
Puntos: 32
Respuesta: Enfoque correcto del modelo de datos

Yo también intento ajustar el código para que quede lo más simple posible para no poner código inecesario.

Por ejemplo:
Código PHP:
$var strtolower(substr($variable02)); 
Voy a ser un poco más expecífico.

Imaginad que hay un objeto cliente que puedes crearlo con sus datos recuperados de una base de datos pasando el id al constructor. Tienes también un método guardar para guardarlo en base de datos.

Para hacer un simple modificación de un dato únicamente habría que hacer:

Código PHP:
//Ejemplo básico
$obj_cliente =  new Cliente($id);
$obj_cliente->nombre "nuevo nombre";
$obj_cliente->guardar();
//Más simple, imposible 
Realmente es interesante cargar todos los datos para modificar un dato o hay que pensar realizar más código para utilizar menos memoria.

Sé que el rendimiento es menor pero el código resultante es simplísimo.

Coincido totalmente con oscartt67
Cita:
Los beneficios que obtienes, la reutilización, legibilidad y flexibilidad del código justifica sobremanera la ralentización.
Todas estas dudas me han surgido a raíz de aprender Java. Intento seguir el modelo de Java en PHP y no se si es un error. Pero la productividad de esta manera considero que es muy superior al de escribir código cuidando el sistema.

De momento con problemas gordos no me he topado. Sólo que es más lento.

Saludos.
  #5 (permalink)  
Antiguo 19/05/2012, 02:50
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 7 meses
Puntos: 97
Respuesta: Enfoque correcto del modelo de datos

Cuando son objetes que reflejas tablas de la db, utilizo el siguiente sistema:
Código PHP:

$obj_cliente 
=  NewClassTable("cliente",$id);

function 
NewClassTable($pTable,$pId='',$pFiltre="",$pConnection="default"){
    if(!
class_exists($pTable)){
        
$exec="
        class $pTable extends ClsCRUD {
            function __construct(\$carregaId='',\$filtre='',\$pConnection='default'){
                \$this->taula='$pTable';
                \$this->IniVars(\$carregaId,\$filtre,\$pConnection);
                }
            }
        "
;
        eval(
$exec);
    }
    
$newclass=new $pTable($pId,$pFiltre,$pConnection);
    return 
$newclass;

La clsCRUD se encarga de leer la estructura de la db, montarme las propiedades(campos), las clases asociadas y los metodos CRUD de la db. Y definiendo una sola clase, tengo todo el acceso a db solucionado. Modfificando clsCRUD, lo implemento a todas las otras clases (clientes, articulos,noticias..) las cuales además, se crean, como en el ejemplo, sobre la marcha.

Sin duda, objetos al poder!
  #6 (permalink)  
Antiguo 19/05/2012, 03:50
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Enfoque correcto del modelo de datos

@cluster28, habria que ver a que le dices "cargar todos los datos", porque si el modelo no tiene relaciones da igual, de todas formas lo que se suele utilizar es Lazy Loading + DQL, te sugiero que le des un vistazo a herramientas como Doctrine o Propel.
Con respecto a seguir el modelo de Java, hace rato que se esta haciendo en PHP, y no solo de Java, se ve en reflejado en los fw's.

@oscartt67, de solo pensar en el debbuging de ese codigo quedo , creo que eval debería utilizarse cuando es estrictamente necesario y no para evitar escribir un par de clases.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 19/05/2012, 05:04
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 7 meses
Puntos: 97
Respuesta: Enfoque correcto del modelo de datos

Cita:
@oscartt67, de solo pensar en el debbuging de ese codigo quedo , creo que eval debería utilizarse cuando es estrictamente necesario y no para evitar escribir un par de clases..
De acuerdo contigo si son un par de clases y estas empezando... pero si haces una web con usuarios,idiomas,noticias,articulos,familias,secto res,poblaciones,paises,pedidos,lineaspedido,almace n,envios,rutas,distribuidores,tiendas,colores,dicc ionario,eventos,medidas,comerciales,comisiones.... . y si en lugar de hacer una web, haces 70 no puedes ir creando clase por clase cuando todas comparten la lógica.

...y el código que dejé es bastante corto y simplón para que te de problemas en un debug...

Saludos.
  #8 (permalink)  
Antiguo 19/05/2012, 05:10
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 7 meses
Puntos: 97
Respuesta: Enfoque correcto del modelo de datos

me dejé comentar, este código me permite, con solo crear la tabla en la db, y escribiendo 0 lineas de código, montar toda la clase para ser utilizada en el frontend y todo su mantenimiento (backend).
  #9 (permalink)  
Antiguo 19/05/2012, 05:14
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 10 meses
Puntos: 32
Respuesta: Enfoque correcto del modelo de datos

Cita:
Iniciado por oscartt67 Ver Mensaje
Código PHP:

$obj_cliente 
=  NewClassTable("cliente",$id);

function 
NewClassTable($pTable,$pId='',$pFiltre="",$pConnection="default"){
    if(!
class_exists($pTable)){
        
$exec="
        class $pTable extends ClsCRUD {
            function __construct(\$carregaId='',\$filtre='',\$pConnection='default'){
                \$this->taula='$pTable';
                \$this->IniVars(\$carregaId,\$filtre,\$pConnection);
                }
            }
        "
;
        eval(
$exec);
    }
    
$newclass=new $pTable($pId,$pFiltre,$pConnection);
    return 
$newclass;

Este modelo ya se me había pasado por la cabeza. Yo tengo una clase base que implementa todo el tema de acceso a BD. Cualquier clase que derive de ésta tiene los métodos de trabajo con la tabla correspondiente ya implementados. Yo tengo muchos métodos en las clases hijas ya que es necesario implementarlos en ellas.

Cita:
Iniciado por masterpuppet Ver Mensaje
@cluster28, habria que ver a que le dices "cargar todos los datos"
Tengo objetos que contienen otros. Sin duda, siempre se puede depurar para que sólo cargue los objetos internos cuando sea necesario.

Yo tengo esta mentalidad. Dentro de un objeto si tienes que realizar una acción sobre una tabla que no tiene relación con el propio objeto (Ej: Obj Cliente con tabla clientes), si tengo creada la misma relación (Obj Factura con tabla facturas), dentro de Cliente creo un objeto factura y trabajo con ese objeto dentro de Cliente.

Bueno, pues me recomiendan que dentro de cliente trabaje directamente con la tabla facturas, validaciones aparte, o lo que sea, pero sin usar más objetos porque eso baja el rendimiento, y en el objeto Factura tengo muchos métodos implementados que me servirían dentro de Cliente, pero hay que volver a escribir el código en Cliente. Guay, más rendimiento, más código y más tiempo de desarrollo.

Espero que me haya explicado bien.
  #10 (permalink)  
Antiguo 19/05/2012, 06:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Enfoque correcto del modelo de datos

@oscartt67 son formas de verlo, pero para mi el solo hecho de no poder testear y/o debugear correctamente el código, ya sean 10 o 100 lineas de código me es argumento suficiente para alejarme de ese tipo de practicas y un domain model creado a base de eval me parece algo muy frágil.

@cluster28 si estas utilizando AR lo normal es aprovecharlo lo mas que se pueda y atacar directamente la persistencia en las secciones criticas de la aplicación, sino pierdes el beneficio del AR.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 19/05/2012, 06:48
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 7 meses
Puntos: 97
Respuesta: Enfoque correcto del modelo de datos

Utilizar un eval no es basar todo el modelo en el: si hay una clase especifica, se crea a mano.

Debug: se debuga en desarrollo,una vez funcionando, funciona. La comodidad del momento no justifica la no utilización de una potente herramienta..y más en un código tan simple.

...y hace poco, en el hilo http://www.forosdelweb.com/f17/break...g-eval-991361/ tu mismo me respondiste:

Cita:
Con el IDE no se pero lo puedes agregar de forma manual con xdebug_break en donde tu quieras dentro del eval
sin embargo, como dices, son maneras de verlo.

Saludos!
  #12 (permalink)  
Antiguo 19/05/2012, 07:32
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 10 meses
Puntos: 32
Respuesta: Enfoque correcto del modelo de datos

Cita:
Iniciado por masterpuppet Ver Mensaje
@cluster28 si estas utilizando AR lo normal es aprovecharlo lo mas que se pueda y atacar directamente la persistencia en las secciones criticas de la aplicación, sino pierdes el beneficio del AR.
A qué te refieres con AR? No me suena.
  #13 (permalink)  
Antiguo 19/05/2012, 07:44
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Enfoque correcto del modelo de datos

Active Record
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: correcto, modelo
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 13:12.