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
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.
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.
As Charile Sheen says, this article is "WINNING!"