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

Eficiencia de estos códigos

Estas en el tema de Eficiencia de estos códigos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, tengo 2 clases escritas en PHP. Una llamada Alumno y otra Contable. La estructura de la clase Alumno es: Código PHP: class  Alumno  { ...
  #1 (permalink)  
Antiguo 08/09/2012, 13:08
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 16 años, 3 meses
Puntos: 26
Eficiencia de estos códigos

Buenas, tengo 2 clases escritas en PHP. Una llamada Alumno y otra Contable.
La estructura de la clase Alumno es:
Código PHP:
class Alumno {
    private 
$grado;
    private 
$nombre;
    private 
$plato;

    [...]

Donde todos sus variables de instancia son del tipo string.

Por otro lado, la clase Contable posee esta estructura:
Código PHP:
class Contable {
    private 
$alumnos;

    [...]

Donde la variable de instancia alumnos, es un array de objetos Alumno. Ordenados por el siguiente criterio (grado,alumno).

Ahora, esta clase Contable, tiene algunos métodos que me gustaría corroborar su eficiencia. Es decir, si es la mejor forma de que cumplan su función.

Por ejemplo, el método getAlumnosDeGrado, el cual obtiene todos los alumnos que pertenezcan al grado pasado por parámetro:
Código PHP:
public function getAlumnosDeGrado($unGrado){
        
        
$arrayResultante = array();
        
        foreach( 
$this->getAlumnos() as $alumno ){
            if (
$alumno->getGrado() == $unGrado){
                
$arrayResultante[] = $alumno;
            }else{
                break;
            }
        }
        
        return 
$arrayResultante;  
    } 
y el método getCantPlatosDeGrado, el cual dado un grado devuelve un array con clave plato y valor la cantidad de ocurrencias en el grado.
Código PHP:
public function getCantPlatosDeGrado($unGrado){
        
$alumnos $this->getAlumnosDeGrado($unGrado);
        
$arrayResultante = array();
        
        foreach(
$alumnos as $alumno){
            
            if(
array_key_exists($alumno->getPlato(), $arrayResultante)){
                
$arrayResultante[$alumno->getPlato()] += 1;
            }else{
                
$arrayResultante[$alumno->getPlato()] = 0;
            }
            
        }
        
        return 
$arrayResultante;
    } 
Agradecería cualquier tipo de sugerencia desde ya, muchas gracias.
  #2 (permalink)  
Antiguo 08/09/2012, 13:15
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 10 meses
Puntos: 177
Respuesta: Eficiencia de estos códigos

Yo pienso que lo mejor es ejecutar la query con JOIN así solo se hace la consulta una vez , porque de el modo en el que está planteado actualmente se llama a una consulta por cada pasada del ciclo for, cuando con JOIN solo se haría una sola consulta a la base de datos agilizando en gran medida el rendimiento del script.
__________________
la la la
  #3 (permalink)  
Antiguo 08/09/2012, 14:47
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 11 meses
Puntos: 44
Respuesta: Eficiencia de estos códigos

Cita:
Iniciado por truman_truman Ver Mensaje
Yo pienso que lo mejor es ejecutar la query con JOIN así solo se hace la consulta una vez , porque de el modo en el que está planteado actualmente se llama a una consulta por cada pasada del ciclo for, cuando con JOIN solo se haría una sola consulta a la base de datos agilizando en gran medida el rendimiento del script.
Eso es cierto. Aunque supongo que el array de alumnos ya estará cargado antes de utilizar estos métodos.

En el primer foreach, creo que no debes poner el "else" y menos con un break, ya que éste acaba la ejecución del foreach, y dejaría fuera del array a los alumnos de ese grado que estuviesen listados después del que estás tratando.

De todas maneras, ten en cuenta la recomendación del compi de arriba. cuantas menos queries, mejor.

Saludos
  #4 (permalink)  
Antiguo 08/09/2012, 18:11
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 16 años, 3 meses
Puntos: 26
Respuesta: Eficiencia de estos códigos

Gracias por las respuestas, paso a explicar:

Cita:
Iniciado por truman_truman Ver Mensaje
Yo pienso que lo mejor es ejecutar la query con JOIN así solo se hace la consulta una vez , porque de el modo en el que está planteado actualmente se llama a una consulta por cada pasada del ciclo for, cuando con JOIN solo se haría una sola consulta a la base de datos agilizando en gran medida el rendimiento del script.
Existe una única consulta, y se hace al ejecutar el script que hace uso de estas clases. Estas clases no funcionan como un ORM, ni nada por el estilo. Solo tratan de manejar los datos de forma que pueda sacar el informe solicitado sin tener angustiosos y horribles loops anidados je.

Como dice SetheR, el array ya esta cargado.

Por otro lado:

Cita:
Iniciado por SetheR Ver Mensaje
En el primer foreach, creo que no debes poner el "else" y menos con un break, ya que éste acaba la ejecución del foreach, y dejaría fuera del array a los alumnos de ese grado que estuviesen listados después del que estás tratando.
El arreglo ya está ordenado por cursos, porque así viene de la BD. Entonces, para el primer curso que no cumpla debería detenerse el foreach. De ahí el "else" y el "break".

Gracias por pasar por mi post. Cualquier crítica es bienvenida.
Saludos.
  #5 (permalink)  
Antiguo 08/09/2012, 19:10
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 16 años, 3 meses
Puntos: 26
Respuesta: Eficiencia de estos códigos

Cita:
Iniciado por SetheR Ver Mensaje
En el primer foreach, creo que no debes poner el "else" y menos con un break, ya que éste acaba la ejecución del foreach, y dejaría fuera del array a los alumnos de ese grado que estuviesen listados después del que estás tratando.
Cierto ! acabo de testearlo
Ya veo que voy a tener que implementar un while :/

Etiquetas: eficiencia, variables
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 11:04.