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

PHP OO Cómo resolver el siguiente requerimiento, respetando OCP

Estas en el tema de Cómo resolver el siguiente requerimiento, respetando OCP en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, cómo vamos? Bien, tengo el siguiente requerimiento: Hay una consulta sql que puede ir creciendo en cualquier momento, son casi como condiciones en el ...
  #1 (permalink)  
Antiguo 19/08/2011, 10:52
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Cómo resolver el siguiente requerimiento, respetando OCP

Hola, cómo vamos?

Bien, tengo el siguiente requerimiento:

Hay una consulta sql que puede ir creciendo en cualquier momento, son casi como condiciones en el where.

Lo normal que se haría, sería algo como esto:

Código PHP:
Ver original
  1. $sql = $condiciones = $innerjoins = null;
  2.  
  3. $sql = "select * from tabla1 $innerjoins where table1.campo1 in (2,3,4) $condiciones;";
  4.  
  5. if ($tipoAlgo) {
  6. innerjoins .= 'inner join tabla2 on tabla1.campo3=tabla2.campo1 ';
  7. $condiciones .= 'and tabla2.tipo=4 ';
  8. }
  9.  
  10. if ($maxAlgo) {
  11. innerjoins .= 'inner join tabla2 on tabla3.campo3=tabla2.campo2 ';
  12.  $condiciones .= 'and max_value=100 ';
  13. }
  14. .
  15. .
  16. .
  17. $result = ejecutar_query($sql);
  18. //mostrar resultados

Si lo hiciera así, estaría violando el principio Open/Close, porque cada vez que me pidan una nueva condición, tendría que estar escribiendo if y dando lugar a posibles errores.

Qué ideas se les ocurren para cubrir el requerimiento pero respetando OCP.

Quedo pendiente

Gracias!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #2 (permalink)  
Antiguo 19/08/2011, 11:23
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Que tal, almacenando los valores en un array y luego unirlo con implode algo como

Código PHP:
Ver original
  1. $a = array();
  2. $a[] = 'foo = "valor1"';
  3. $a[] = 'bar = "valor2"';
  4. $a[] = 'baz = "valor3"';
  5.  
  6. $where = implode(' AND ', $a);
  7.  
  8. $qry = 'SELECT * FROM tabla where ' . $where;
  9. /**
  10.  * Mostraría algo como
  11.  * SELECT * FROM tabla where foo = "valor1" AND bar = "valor2" AND baz = "valor3"
  12.  */

También puedes usar array multidimensional y cosas así.

Código PHP:
Ver original
  1. $a = array();
  2. $a[] = array('tt.foo = "valor1"', 'INNER JOIN tabla2 tt ON tt.id = t.id');
  3. $a[] = array('ttt.bar = "valor2"', 'INNER JOIN tabla3 ttt ON ttt.id = t.id');
  4. $a[] = array('tttt.baz = "valor3"', 'INNER JOIN tabla4 tttt ON tttt.id = t.id');
  5.  
  6. $b = array($a[0][0], $a[2][0]);
  7. $c = array($a[0][1], $a[2][1]);
  8.  
  9. $where = implode(' AND ', $b);
  10. $join = implode(PHP_EOL, $c)
  11.  
  12. $qry = 'SELECT * FROM tabla t ' . $join . ' where ' . $where;
  13. /**
  14.  * Mostraría algo como
  15.  * SELECT * FROM tabla t INNER JOIN tabla2 tt ON tt.id = t.id INNER JOIN tabla4 tttt ON tttt.id = t.id where tt.foo = "valor1" AND tttt.baz = "valor3"
  16.  */
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 19/08/2011 a las 11:31
  #3 (permalink)  
Antiguo 19/08/2011, 11:31
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Hola Abimael :) Cómo vas?

Pero volvemos al punto, tendría que seguir editando el archivo cada vez que haya una nueva condición.

La idea sería, si se puede, hacer algo como esto:

http://sebys.com.ar/2010/06/27/ocp-–...pio-openclose/

Saludos!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #4 (permalink)  
Antiguo 19/08/2011, 11:34
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Oh, bueno aún se puede usar, si te fijas, creas una variable que sea tipo array y luego creas las consultas desde otra clase añadiendo las necesarias. Digo no soy experto en los principios, tengo que aprender todavía, pero se puede usar lo que te muestro. Por si acaso, hice algunos cambios para que veas a lo que me refiero.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 19/08/2011, 11:38
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Vale, vale, la tendré en cuenta si no llego a aplicarlo directamente con el principio

Gracias!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #6 (permalink)  
Antiguo 19/08/2011, 11:46
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

¿El patron Decorator no te sirve para tu caso?
  #7 (permalink)  
Antiguo 19/08/2011, 12:03
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Qué tal RonRuby, cómo vamos?

Aunque nunca lo he usado, creo que podría intentarlo y creo que sí cubre lo que necesito. Voy a probar.

Vamos a ver si alguien tiene más ideas

Gracias!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #8 (permalink)  
Antiguo 19/08/2011, 12:24
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Que tal Carxl ... Veo que andas bien ocupado con tus proyectos xD

En cuanto a tu duda, yo lo haria creando una clase llamada Query por ejemplo.
Luego creo varias clases mas para que decoren a Query, como Join, Where, etc ...
Asi harias:
Código PHP:
Ver original
  1. $q = new Query("SELECT * FROM tabla1");
  2. $q = new Join($q, INNER, "tabla2", "tabla1.campo = tabla2.campo");
  3. $q = new Join($q, INNER, "tabla3", "tabla2.campo = tabla3.campo");
  4. $q = new Where($q, "tabla3.campo = 1");
  5. echo $q->getQuery();
Resultado:
Código SQL:
Ver original
  1. SELECT * FROM tabla1
  2. INNER JOIN tabla2 ON (tabla1.campo = tabla2.campo)
  3. INNER JOIN tabla3 ON (tabla2.campo = tabla3.campo)
  4. WHERE 1=1 AND tabla3.campo = 1

Al menos veo yo que es la mejor forma de hacer lo que deseas sin hacer cambios invasivos en tu código.

EDIT: Si alguien tiene una idea mejor bienvenida sea. Asi tambien aprendo.
  #9 (permalink)  
Antiguo 19/08/2011, 12:42
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Que tal Carxl,

Puedes utilizar el patrón Query Object, pero no es algo sencillo de implementar, hay muchos factores a tener en cuenta, si necesitas tanta flexibilidad deberías utilizar Doctrine(DQL) o Propel(Criteria).
Y hay algo que no entiendo muy bien, si lo que esta en el link te sirve, porque no lo utilizas ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 19/08/2011, 13:37
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Hola!

Gracias a todos por sus respuestas

Masterpuppet, cómo vamos? La idea de RonRuby la estoy aún digiriendo porque como dije, no he usado ese patrón por lo tanto tengo que estudiarlo y ver como aplicarlo de la mejor manera.

La tuya tampoco jajajaja xD

Sabía que preguntaba acá y surgían muchas posibilidades.

Gracias de nuevo!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #11 (permalink)  
Antiguo 19/08/2011, 16:04
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 4 meses
Puntos: 65
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

creo que te referís a no tener que modificar un método agregando condicionales cada vez que surga un nuevo criterio, no? o sea que esas condiciones no estén en un método sino en una clase

fijate el patrón cadena de responsabilidades http://es.wikipedia.org/wiki/Chain_o...dise%C3%B1o%29
la idea es formar una cadena donde cada objeto realiza una acción o no y pasa al siguiente

no es para ayudar a formar sql sino para no tener la serie de if en el método, el sql vas formando en los manejadores de la cadena
  #12 (permalink)  
Antiguo 19/08/2011, 18:03
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Cita:
Iniciado por Carxl Ver Mensaje
Hola Abimael :) Cómo vas?

Pero volvemos al punto, tendría que seguir editando el archivo cada vez que haya una nueva condición.

La idea sería, si se puede, hacer algo como esto:

http://sebys.com.ar/2010/06/27/ocp-–...pio-openclose/

Saludos!
Hola Carxl !

Ese ejemplo del principio Abierto - Cerrado de manera muy clara aplican el patrón estrategia: http://en.wikipedia.org/wiki/Strategy_pattern

El patrón que menciona masterpuppet no lo conocía, le voy a dar un vistazo pero al igual que Ronruby había pensado en un decorador para la consulta.

Un saludo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #13 (permalink)  
Antiguo 22/11/2011, 10:28
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: Cómo resolver el siguiente requerimiento, respetando OCP

Qué más, cómo vamos?

Ofrezco disculpas por aparecerme hasta ahora a comentar el resultado, tengo mucho trabajo para poderlos acompañar como quiero.

Al final lo que hice fue aplicar el principio Chain XD Ayudado del siguiente video tutorial:

http://www.davidrojas.net/index.php/...in-of-command/

Lo que hice en sí fue generar la consulta a partir de ese patrón, al final me retornaba los resultados y si necesito agregar una condicional más a la consulta, creo una clase nueva respetando la interface y así no modifico el código ya hecho.

Gracias a todos!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com

Etiquetas: requerimiento, resolver, siguiente, tabla
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:54.