ActiveRecord

edited septiembre 2007 in Desarrolladores
Hola amigos,

He vuelto a revisar con mas cuidado la clase ActiveRecord y he hecho algunas pequeñas modificaciones para optimizar los procesos y estandarizar el código.

En ActiveRecord he notado algunas inconsistencias en la creación de sentencias SQL y de los condicionales anidados. Estas inconsistencias consisten básicamente en la inclusión de chequeos innecesarios, que aunque no impiden el funcionamiento, si lo hace más extenso, complejo, menos optimo, y mas difícil de mantener el codigo.

A continuación presento una ilustración de lo que quiero decir. El fragmento de código B arroja los mismos resultados que el A; no obstante el fragmento B es más optimo y conciso:
// Ejemplo de Forma NO optima (Codigo A)
	if(condicion_1){
		return true;
	} else {
		if(condicion_2){
			if(condicion_3) {
				return false;
			} else {
				if(condicion_4){
					return true;
				}
			}
		} else{
			return false;
		}
	}
	
	
	// Ejemplo de Forma Optima (Codigo B)
	if(condicion_1){
		return true;
	} elseif(condicion_2){
		if(condicion_3) {
			return false;
		} elseif(condicion_4) {
			return true;
		}
	} else{
		return false;
	}


Hay que tener presente que no es correcto colocar dentro de un else otra condición que abarque todo el else, ya que para ese propósito existe el condicional ifelse que resume lo anterior en un solo paso.

Para mostrar un ejemplo puntual, el sig. trozo de código lo tome del método save de la clase ActiveRecord, se puede notar que en el else habia un condicional sobrante (el if).
#Run Validation Callbacks Before
	if(method_exists($this, 'before_validation')){
		if($this->before_validation()=='cancel') {
			return false;
		}
	} else
		if(isset($this->before_validation)){
			$method = $this->before_validation;
			if($this->$method()=='cancel') {
				return false;
			}
		}
	}

	
	// La forma correcta de hacerlo sería:
	
	#Run Validation Callbacks Before
	if(method_exists($this, 'before_validation')){
		if($this->before_validation()=='cancel') {
			return false;
		}
	} elseif(isset($this->before_validation)){
		$method = $this->before_validation;
		if($this->$method()=='cancel') {
			return false;
		}
	}

Por otra parte, el propósito de la función find_first es devolver un registro, por lo que por razones de rendimiento es conveniente fijar la clausula LIMIT a 1 por defecto en este método, logrando así que una vez que el RDBMS encuentre un registro que coincida con los criterios indicados (si es el caso) no siga recorriendo las filas innecesariamente.

Al igual que cuando en el metodo find se busca por un campo clave (unico) como el caso del ID, ahí es conveniente también fijar el parámetro limit a 1.

Comentarios

  • roger me parece muy bueno el aporte, son detalles que es excelente ir arreglandolos para mejorar el rendimiento del framework.

    Saludos.
Sign In or Register to comment.