Organización de código y uso de funciones de usuario en tiempo de ejecución

Binary_code_on_blue_for_web.jpg
En ciertos desarrollo, se plantea el desarrollo de ciertas partes de forma que en el futuro sean ampliables, sobretodo para rebajar costes y estructurar bien el código. Se muestra a continuación un ejemplo de estructuración y ejecución de métodos.

Objetivo

 
Por ejemplo a al ahora de desarrollar un juego, pongamos algo tipo arcade, donde tenemos una "partida", y al finalizar la misma esta genera una serie de resultados, puntos,  bonus, vidas extras etc. Realizar todas estos calculos y operaciones en una sola funcion es una burrada claro esta, pero ademas si pensamos con vistas de futuro (siempre deberiamos) lo mejor es desarrollar una funcion para cada cosa, y montar una especie de lanzador de funciones, a modo de trigger una vez finalice esa "partida".
 

Solución (modelo)

 
Primero veamos la clase "Play", en la cual es donde iríamos creando las diferentes funciones que realizan cálculos y devuelven la puntuación según si se valida o no como correcto el supuesto, el supuesto no esta programado no es objeto de este post, tan solo se muestra una forma de esquematizar, organizar y lanzar códig
class Play{

	function subir_velmedia(){

		//obtener parametros
		$args = func_get_args();

		//...

		//devolver puntos
		return $args[0]['puntos'];

	}

	function partida_completada(){

		//obtener parametros
		$args = func_get_args();

		//...

		//devolver puntos
		return $args[0]['puntos'];

	}

	function estar_delosprimeros(){

		//obtener parametros
		$args = func_get_args();

		//...

		//devolver puntos
		return $args[0]['puntos'];

	}

}

Solución (lanzador)

 
A continuación se muestra un ejemplo de lanzador utilizando los métodos nativos de php method_exists y call_user_func
require("play.class.php");

$functions = array(
//	INDICE => array('Texto publico','nombre_de_la_funcion',array('puntos'=>10,'params'=>array('parametro1'=>'valor_parametro2','parametro2'=>'valor_parametro2'))),
        0 => array('Sube tu velocidad media','subir_velmedia',array('puntos'=>5,'params'=>array())),
        1 => array('Completa una partida','partida_completada',array('puntos'=>1,'params'=>array())),
        2 => array('Estar entre los primeros 10','estar_delosprimeros',array('puntos'=>3,'params'=>array('primeros'=>10)))
    );	

$Play = new Play();

foreach($functions as $funcion){
	
	//se comprueba que exista la funcion
	if (method_exists($Play,$funcion[1])){

		//unimos la clase con el metodo buscado			
		$variableMetodo = array($Play, $funcion[1]);

		//añadimos a los parametros ya especificados lo que nos viene por post(resutlados de uan partida por ejemplo)
		$funcion[2]=array_merge($funcion[2],array('post'=>$_POST));

		//llamamos a la clase y metodo pasandole los parametros compuestos en la anterior sentencia
		$result = call_user_func($variableMetodo,$funcion[2]);

		echo "Resultado (".$funcion[1]."): ".$result."";

	}else{
		echo "la funcion ".$funcion[1]." NO existe en la clase \"Play\"";
	}
				
}


De esta forma añadir una nueva opción que genere por ejemplo una vida extra, es trivial y sobretodo no modifica el lanzador creado, tan solo debemos añadir el método en el vector correspondiente de funciones y escribir el método junto con su código en la clase Play.
 

Comments

  1. Delphia 2012-01-14 00:54:09

    As Charile Sheen says, this article is "WINNING!"

create gmail account