Vuelvo a escribir sobre el tema: programar un intérprete, usando C# y algunas ideas de TDD. En este paso, agrego un nuevo ICommand, el WhileCommand:
Pueden bajarse la versión de este paso desde InterpreterStep08.zip. Si quieren ver todos los pasos, sigo manteniendo el códicon en trunk/Interpreter en mi Google Code Project AjCodeKatas.
El código de WhileCommand es simple:
public class WhileCommand : ICommand
{
private IExpression condition;
private ICommand command;
public WhileCommand(IExpression condition, ICommand command)
{
this.condition = condition;
this.command = command;
}
public IExpression Condition { get { return this.condition; } }
public ICommand Command { get { return this.command; } }
public void Execute(BindingEnvironment environment)
{
while (BooleanPredicates.IsTrue(this.condition.Evaluate(environment)))
this.command.Execute(environment);
}
}
Noten que tengo ahora un nuevo BooleanPredicates. Nació de haber refctorizado el código anterior que usé en la implementación de IfCommand. Escribí en el anterior post sobre mis intenciones de hacer ese refactor. Usando TDD, escribí los tests de la nueva clase, ejemplo:
[TestMethod]
public void IsFalse()
{
Assert.IsTrue(BooleanPredicates.IsFalse(null));
Assert.IsTrue(BooleanPredicates.IsFalse(string.Empty));
Assert.IsTrue(BooleanPredicates.IsFalse(0));
Assert.IsTrue(BooleanPredicates.IsFalse((short)0));
Assert.IsTrue(BooleanPredicates.IsFalse((long)0));
Assert.IsTrue(BooleanPredicates.IsFalse(0.0));
Assert.IsTrue(BooleanPredicates.IsFalse((float)0.0));
Assert.IsFalse(BooleanPredicates.IsFalse(new object()));
Assert.IsFalse(BooleanPredicates.IsFalse("foo"));
Assert.IsFalse(BooleanPredicates.IsFalse(1));
Assert.IsFalse(BooleanPredicates.IsFalse((short)2));
Assert.IsFalse(BooleanPredicates.IsFalse((long)3));
Assert.IsFalse(BooleanPredicates.IsFalse(4.0));
Assert.IsFalse(BooleanPredicates.IsFalse((float)5.0));
}
Vean: el test es una especie de especificación escrita en código, que contesta: ¿Qué es lo que considero como false en mi intérprete? Luego de tener el test en verde, pude agregar su llamada en el IfCommand (que YA estaba escrito) y ver de correr los tests de ese comando, para ver que todo siguiera funcionando.
El nuevo comando WhileCommand nació de haberlo testeado, ejemplo:
[TestMethod]
public void EvaluateWhileCommandUsingDecrement()
{
BindingEnvironment environment = new BindingEnvironment();
environment.SetValue("a", 2);
IExpression condition = new VariableBLOCKED EXPRESSION;
}
Podría haber agregado más tests, como qué pasa si al WhileCommand le entrego una condición null, pero, por ahora, el nuevo comando goza de buena salud. Todos los tess siguen en verde:
Buen code coverage:
Próximos pasos: comandos composite, comandos for/foreach, declaración de funciones…
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez