La idea era que a partir del siguiente test construyamos el objeto correspondiente (el objeto Worker).

var w = new Worker();
w.AddToStack(function () { return 10; });
w.AddToStack(function (val) { return val; });
w.AddToStack(function (val) { return val - 10; });

var counter = 20;

while (w.canUnstack()) {
    var result = w.DoTask(counter);
    counter = result;
    if (result !== 10) {
        alert('Test fail');
        break;
    }
}

Una posible solución es la siguiente


function Worker() {
    var self = this;
    var array = [];
    var stack = 0;

    self.AddToStack = function( f ) {
        array.push(f);
    };

    self.canUnstack = function() {
        if ( array.length == 0 ) {
            return false;
        } else {
            return true;
        }
    };

    self.DoTask = function( valor ) {
        var f = array.pop();
        var resultado = f( valor );

        return resultado;
    };
}

Explicación:

Si analizamos el test la idea principal es que la ejecución del mismo nunca nos alerte “Test fail” y como podemos ver result no puede ser distinto a 10 para que el test pase correctamente. Al mismo tiempo podemos ver que el objeto Worker comprenderá tres funciones addToStack, canUnstack y DoTask. Si nos situamos en la situación de juego la primer función addToStack debería realizar alguna acción de sumar una unidad al stack (stack en inglés = montón) es decir que podríamos decir que el personaje está apilando algo. La segunda función canUnstack nos debería devolver un valor true o false, podríamos resolverlo diciendo que si el stack o montón es igual a cero no podríamos quitar más elementos del mismo. Y por último la función DoTask que nos invita a realizar una tarea, esta tarea es la de quitar un elemento del montón, por ello es que en el test utilizamos el while.

Ahora analicemos el test. Primero se crea una instancia de Worker “w”. La idea ahora es que este “w” ejecute estas tres funciones que se presentan a continuación sin que el test nos devuelva “Test fail”. Lo primero que tenemos que ver es que la función addToStack recibe como parámetro una función. Por ende en nuestro objeto worker podemos ver que la función recibe un parámetro f que guardamos dentro de un array. Al realizar el test entonces estamos guardando tres funciones al array. Con la función canUnstack nos aseguramos de que el array tenga al menos un elemento y devuelva true, en este caso el array tendrá 3 elementos. Al devolver true se ejecuta la función DoTask cuyo parámetro que le enviamos es el número 20. Y esta función lo que hace es tomar el último elemento del array y devolver un valor resultado ejecutando la función que implica ese último elemento con el valor de entrada que le hemos dado, en este caso 20.

Si analizamos la tres funciones addToStack del test vemos (debemos analizar de abajo hacia arriba ya que lo que estamos haciendo es tomar el último elemento del array): Primero DoTask le resta 10 al valor de entrada “val”, en este caso 20, y devuelve por lo tanto 10 (el test pasa una vez). Luego val ahora vale 10, ingresa este valor a la función y la misma lo retorna, devuelve por ende 10 (el test pasa por segunda vez). Por último la función entra sin parámetro y retorna el valor 10 (el test pasa por tercera vez). Aquí el array queda vacío por ende se corta el while del test y termina la prueba.

Anuncios