Foros del Web » Programando para Internet » PHP »

CodeIgniter ¿Es recomendable un método que haga muchas cosas en un modelo?

Estas en el tema de ¿Es recomendable un método que haga muchas cosas en un modelo? en el foro de PHP en Foros del Web. La verdad es que tengo esta duda de "buenas costumbres". Estaba limpiando algo de código de un modelo y hasta este punto no había presentado ...
  #1 (permalink)  
Antiguo 02/11/2013, 08:58
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 13 años
Puntos: 6
Pregunta ¿Es recomendable un método que haga muchas cosas en un modelo?

La verdad es que tengo esta duda de "buenas costumbres".

Estaba limpiando algo de código de un modelo y hasta este punto no había presentado problema alguno, pero cuando llegué a los métodos que hacen consultas a las bases de datos me di cuenta de que son redundantes, osea, tengo un método para pedir todos los items de una bd, luego uno para pedirlos por su categoría y otros por su id o su slug.

El código se ve mas o menos así en esa sección:

Código PHP:
Ver original
  1. public function get_curso($id){
  2.         $rs = $this->db->get_where('cursos', array('id' => $id));
  3.            
  4.         if($rs->num_rows() > 0){
  5.             return $rs->row_array();
  6.         }
  7.         else{
  8.             return false;
  9.         }
  10.     }
  11.  
  12.         public function get_categoria($cat)
  13.     {
  14.         $rs = $this->db->get_where('cursos', array('categoria' => $cat));
  15.  
  16.         if ($rs->num_rows() > 0) {
  17.             return $rs;
  18.         }
  19.         else{
  20.             return false;
  21.         }
  22.     }

Básicamente es eso cuando digo que son muchas funciones para mas o menos lo mismo, de hecho hasta se repite código ... la cosa es que he estado tratando de tener una sola función "get_curso" que devuelva determinada consulta luego de recibido un parámetro y que, si ninguno de estos se le pasa, simplemente devuelva la consulta general de la base de datos (para el dashboard).

¿Código? Este:

Código PHP:
Ver original
  1. public function get($id = false, $slug = false)
  2.     {
  3.         if (!$id || !$slug) {
  4.             $query = $this->db->get('cursos');
  5.             return $query->result_array();
  6.         }
  7.         elseif ($slug) {
  8.             $query = $this->db->get_where('cursos', array('slug' => $slug));
  9.             return $query->row_array();
  10.         }
  11.         else {
  12.             $query = $this->db->get_where('cursos', array('id' => $id));
  13.             return $query->row_array();
  14.         }
  15.     }

Es un borrador, y de hecho me da problemas, no de sintaxis sino en las vistas y el controlador, porque los errores que me lanza son justamente de "no existe la variabe tal", simplemente no consigue nada pero al parecer funciona porque me pinta la vista, solo que me da errores en el contenido.

¿Es buena idea o costumbre tener un método que haga tantas cosas? ¿O es mejor separar cada consulta con un método?

Gracias por adelantado
  #2 (permalink)  
Antiguo 02/11/2013, 09:33
Avatar de Lautaro_eb  
Fecha de Ingreso: mayo-2010
Ubicación: Bariloche, Argentina
Mensajes: 284
Antigüedad: 14 años, 6 meses
Puntos: 24
Respuesta: ¿Es recomendable un método que haga muchas cosas en un modelo?

Buenas, el tener funciones separadas casi idénticas puede agilizar el trabajo aunque tu método también puede ser conveniente depende de cada programador creo yo
__________________
Mi emprendimiento: Software BRC
Youtube: Tutoriales de programación y electrónica.
  #3 (permalink)  
Antiguo 02/11/2013, 10:32
Avatar de nanotime  
Fecha de Ingreso: noviembre-2011
Ubicación: Cd. Guayana
Mensajes: 145
Antigüedad: 13 años
Puntos: 6
Respuesta: ¿Es recomendable un método que haga muchas cosas en un modelo?

Sí, de hecho acabo de terminar lo que sería el método que responde a distintos parámetros (en teoría) y bueno, la verdad es que funciona a medias.

Código PHP:
Ver original
  1. public function get($id = false, $slug = false, $categ = false)
  2.     {
  3.         if (!$id && !$slug && $categ) {
  4.             $query = $this->db->get('cursos');
  5.             return $query->result_array();
  6.         }
  7.         elseif ($slug) {
  8.             $query = $this->db->get_where('cursos', array('slug' => $slug));
  9.            
  10.             if ($query->num_rows() == 1) {
  11.                 return $query->row_array();
  12.             }
  13.             else {
  14.                 return false;
  15.             }
  16.         }
  17.         elseif ($categ) {
  18.             $query = $this->db->get_where('cursos', array('categoria' => $categ));
  19.  
  20.             if ($query->num_rows() == 1) {
  21.                 return $query->row_array();
  22.             }
  23.             else {
  24.                 return false;
  25.             }
  26.         }
  27.         elseif ($id) {
  28.             $query = $this->db->get_where('cursos', array('id' => $id));
  29.             return $query->row_array();
  30.          }
  31.     }

Técnicamente lo único que funciona es que mientras que sean false los parámetros, devuelve la consulta de todos los items de la base de datos y que cuando se le pase el id devuelva el id de la consulta, pero las categorías y el slug ... hmmm no dan señales de vida ...

Respecto a que depende de cada programador, sí, supongo que si pero a veces me pregunto si no termina siendo mas confuso tener get_curso_id, get_curso_categ, get_curso_slug, etc,etc ... quizá para este proyecto pequeño funcione por ser pocas consultas pero es que el código para cada una es prácticamente idéntico y estaría rompiendo el paradigma DRY, que no es que sea pecado pero no sé si vaya a crecer el código, sin mencionar que estos mismos métodos se usan para un servicio rest.
  #4 (permalink)  
Antiguo 02/11/2013, 10:37
 
Fecha de Ingreso: septiembre-2011
Mensajes: 219
Antigüedad: 13 años, 2 meses
Puntos: 31
Respuesta: ¿Es recomendable un método que haga muchas cosas en un modelo?

Una cuestión a tener en cuenta es cuando queres encadenar métodos, si los tenes todos juntos no lo podrás hacer. De todas maneras, todo depende del tipo de projecto.
  #5 (permalink)  
Antiguo 02/11/2013, 11:31
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: ¿Es recomendable un método que haga muchas cosas en un modelo?

Esos métodos están manejando instancias de modelos, o simplemente filas de la base de datos?
Supongo que son métodos que tienes en un modelo..Cuál es ese modelo? Es es modelo "cursos"? Si lo es, y una instancia de la clase "cursos" representa 1 cierto curso:
- Para obtener los cursos de una categoría, necesito una instancia de curso?
- Cuando se llama a get_categoria (que creo que se debería llamar getCoursesByCategory), se obtienen modelos,o simples filas de la bd?

En general, los sistemas MVC dejan de lado los datasources, y los "incrustan" dentro de los modelos.Pero los modelos son 1 cierta instancia.Que algo que modela 1 instancia de "Curso", también sepa obtenerlos, según distintos criterios, es hacer que una clase haga 2 papeles.De instancia de un objeto de negocio, y de Factoría de esos objetos.
  #6 (permalink)  
Antiguo 02/11/2013, 12:24
Avatar de bet7o  
Fecha de Ingreso: febrero-2010
Ubicación: DF
Mensajes: 315
Antigüedad: 14 años, 9 meses
Puntos: 20
Respuesta: ¿Es recomendable un método que haga muchas cosas en un modelo?

Buenas,

Yo me quedo con la primera versión, métodos que hagan cosas especificas y sean re utilizables, también como dicen cambiaría el nombre de los modelos para que fuesen mas descriptivos.

PSR-1 codificacion estandar basica

Imagina si vas a utilizar el método "get" 1000 veces en todo tu código, cuantos if elseif deberá recorrer para encontrar el correcto? sin duda algo que pegara en el performance.


Saludos.
__________________
Pero el no contaba con una cosa, mi peligroso desinteres por la vida humana

Etiquetas: codeigniter, cosas, muchas
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 20:17.