April 2012 - Posts
Anterior Post
Siguiente Post
Ahora veamos de tratar uno de los requerimientos: que los días laborables/no laborables sean configurables, ya sea por feriados puntuales, feriados que se repiten año a año, o porque la propia semana tenga otro reparto de días laborables.
El primero que se me ocurre es contemplar que el sábado sea día laboral. Escribo el test:
[TestMethod]
public void SetSaturdayAsAWorkingDay()
{
WorkingDaysCalendar calendar = new WorkingDaysCalendar();
calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Saturday);
DateTime saturday = new DateTime(2012, 3, 10);
Assert.AreEqual(saturday.DayOfWeek, DayOfWeek.Saturday);
Assert.IsTrue(calendar.IsWorkingDay(saturday));
}
Al ejecutarlo, da rojo, porque el código que tengo hasta ahora pone a los sábados como días no laborables. Siguiendo la idea de poner el mínimo código necesario para pasar el test, y que sigan dando verde los anteriores, éste es el código que agregué (y luego refactoricé un poco):
private DayOfWeek? workingDay;
public bool IsWorkingDay(DateTime day)
{
if (this.workingDay.HasValue && this.workingDay.Value == day.DayOfWeek)
return true;
if (day.DayOfWeek == DayOfWeek.Sunday || day.DayOfWeek == DayOfWeek.Saturday)
return false;
return true;
}
public void AddDayOfWeekAsWorkingDay(DayOfWeek dayOfWeek)
{
this.workingDay = dayOfWeek;
}
Con esto, el test da en verde. Ejecuto toda la batería de test y sigue dando verde.
Noten que la variable adicional es “nulleable”. Podría haber puesto un arreglo, una lista de días laborables o algo así. PERO NINGUN TEST ME LO PIDIO. Es decir, no hay caso de uso del código que estamos desarrollando que necesite esa flexibilidad. Seguramente en los próximos test tendré que agregarlo. Pero no cruzar el puente ANTES de llegar al puente.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Anterior Post
Siguiente Post
Sigo con la descripción de los tests que fui escribiendo para este problema. Ahora que ya tengo un test para ver si sábado es día laborable, agregué un test para ver si cada domingo es día laborable:
[TestMethod]
public void TypicalSaturdayIsANonWorkingDay()
{
WorkingDaysCalendar calendar = new WorkingDaysCalendar();
DateTime saturday = new DateTime(2012, 3, 10);
Assert.AreEqual(saturday.DayOfWeek, DayOfWeek.Saturday);
Assert.IsFalse(calendar.IsWorkingDay(saturday));
}
Inicialmente, el test quedó en rojo. El problema es que el código que llevo escrito solamente reconoce como no laborable a los Sábados. Modifiqué la función que determina eso a:
public bool IsWorkingDay(DateTime day)
{
if (day.DayOfWeek == DayOfWeek.Sunday || day.DayOfWeek == DayOfWeek.Saturday)
return false;
return true;
}
Y el test pasó. Vean que aparecen dos constantes en el código interno. No me preocupa por ahora, porque refleja lo que tengo hasta ahora en los tests. En algún momento, tendré que contemplar (como pedía el problema original) que hay otras semanas típicas: por ejemplo, para un peluquero el sábado puede ser día laborable, y para una panadería el domingo es laborable pero el lunes no.
Llegado a este punto, escribí un test que sale un poco de TDD “estricto”. Es un tests que me dió en verde desde el comienzo. Es el que prueba los días de una semana típica:
[TestMethod]
public void TypicalWeek()
{
WorkingDaysCalendar calendar = new WorkingDaysCalendar();
DateTime monday = new DateTime(2012, 3, 12);
Assert.AreEqual(monday.DayOfWeek, DayOfWeek.Monday);
Assert.IsTrue(calendar.IsWorkingDay(monday));
Assert.IsTrue(calendar.IsWorkingDay(monday.AddDays(1)));
Assert.IsTrue(calendar.IsWorkingDay(monday.AddDays(2)));
Assert.IsTrue(calendar.IsWorkingDay(monday.AddDays(3)));
Assert.IsTrue(calendar.IsWorkingDay(monday.AddDays(4)));
Assert.IsFalse(calendar.IsWorkingDay(monday.AddDays(5)));
Assert.IsFalse(calendar.IsWorkingDay(monday.AddDays(6)));
}
Me gusta tener ese test, para que alguien pueda ver, en un solo lugar, lo que considero para esta API como semana típica. Otros “approach”: no escribir este test, o escribirlo y eliminar los anteriores. Pero yo me “encariño” :-) con los tests, y es raro que los elimine. También dan una idea de la historia, de la evolución de la API. Así que agregué este test de arriba, nacido prístinamente en verde, y dejé los anteriores.
Próximos posts: cómo admitir otro tipo de semanas “típicas”, feriados, etc.
Como siempre, toda esta serie de cambios quedó reflejado en el log del proyecto. Ver https://github.com/ajlopez/TddOnTheRocks
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Gracias a el Java User Group de Argentina:
http://www.jugargentina.org/
el próximo jueves participaré de su Meetup en Buenos Aires:
http://www.jugargentina.org/events/60301992/
Se votaron charlas, y la que había sugerido, ganó la encuesta. Voy a presentar una introducción a Clojure, el lenguaje creado por Rick Hickey que ejecuta sobre la VM de Java, tiene también variantes para .NET CLR y hasta hay Clojurescript sobre Javascript.
Mi idea es presentar las características principales del lenguaje, basado en Lisp, pero con ideas nuevas, como:
- Nuevas estructuras (conjuntos, mapas, secuencias …)
- Manejo de concurrencia (por ejemplo, aparece una implementación de Software Transactional Memory)
- Acceso a la librería de Java
Pensé que tenía 20 o 30 minutos disponibles, como en otras meetups. Pero en las reuniones de Jugar se da una sola charla por vez. Así que voy a aprovechar para dar algo más de Clojure, posiblemente use Leiningen y levante Noir (un framework web).
Creo que ya se llenó el cupo, pero si les interesa Java y su actividad, les recomiendo anotarse como miembros del grupo. Como siempre, terminaré publicando por acá los recursos, ejemplos que haya comentado en la charla. Posiblemente, la gente de Jugar la grabe y la comparta por su web. También, el sábado estaré dando una VAN de Alt.NET Hispano, donde uno de los temas será Clojure (además de Ruby y Python).
Mis enlaces del tema:
http://delicious.com/ajlopez/clojure
Mis posts
http://ajlopez.wordpress.com/category/clojure/
Les recuerdo que hay una lista en español sobre Clojure http://groups.google.com/group/clojure-hispano
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
En Marzo dí una charla presencial en el Microsoft User Group de Argentina, en Buenos Aires, ver:
Esos Raros Lenguajes Nuevos: Javascript/Node, Scala, Erlang, Clojure, Ruby, Python
Ahora, el sábado que viene (14 de Abril) y el siguiente sábado (21 de Abril) la gente de ALT.NET Hispano ha organizado dos VAN (reuniones virtuales) para que pueda comentar sobre esos lenguajes, que no son tan raros ni tan nuevos, pero que en general pueden parecerlo dentro de la comunidad .NET:
- Javascript en NodeJs
- Scala
- Erlang
- Clojure
- Python
- Ruby
Este es el anuncio de la primera reunión:
La comunidad ALT.NET Hispano (http://altnethispano.org) realizará una VAN sobre Esos raros lenguajes nuevos NodeJs, Scala, Clojure, Erlang, Python, Ruby Parte 1, con Angel Java Lopez.
Fecha: Sábado 14 de Abril del 2012 a las 18:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas.
Pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en: https://groups.google.com/d/topic/altnet-hispano/mRQRHvoAvKc/discussion
Para mayor información sobre cómo atender la reunión consulten: http://tinyurl.com/van-hispano
Mi idea es mostrar a qué problemas se orientan estos lenguajes. Por ejemplo, cómo tratan de resolver temas de escalabilidad y computación distribuida en los cuatro primeros (Javascript en NodeJs, Scala, Erlang, Clojure). Y cómo se ha ido formando comunidades, y ecosistemas de paquetes y desarrollo web, especialmente en los dos últimos (Python y Ruby). Mi plan es dar los tres primeros (Javascript/NodeJs, Scala, Erlang) este sábado que viene, y los otros (Clojure, Python, Ruby) en la siguiente sesión.
Este es el primer post de la serie, donde voy a ir escribiendo, comentando sobre recursos y enlaces que fui descubriendo, además de los ya presentados en el post que mencioné al principio.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Es tiempo de escribir la lista de resoluciones para este mes de Abril de 2012. Primero, un repaso de las de Marzo:
- Templates en AjGenesis en Ruby pendiente
- Soporte de control de flujo en AjLang completo
- Soporte de objetos nativos en AjLisp in Java pendiente
- Primeras estruturas, matching simple, simple REPL en AjErl (erlang en C#) parcial
- Primeras páginas web en AjContab, con un simple ASP.NET MVC, con dominio en memoria pendiente
- Mover AjPython a GitHub, y revisar su implementación completo
- Mover AjSudoku a GitHub, y revisar tests y code coverage completo
- Empezar a refactorizar el algoritmo interno de AjRools para usar RETE pendiente
- Comenzar a procesar formularios en AjComprobantes completo
Hmmm.. demasiado pendiente ;-) Ok, para balancearlos, estuve trabajando en nuevos items:
- Comenzar Acquarella Syntax Highlither completo
- Comenzar AjTalk en Javascript/NodeJs completo
- Comenzar AjLogo en Javascript/NodeJs completo
- Comenzar SetTuples set programming en C# completo
Las resoluciones de este mes:
- Completar Acquarella (detectar comentarios, números, nuevos estilos y lenguajes, extensión por lenguaje …)
- Trabajar en AjTalk en Javascript/NodeJs (soporte de clases, procesamiento de fileouts…)
- Trabajar en AjLogo in Javascript/NodeJs (soporte de canvas)
- Completar el soporte de verbos iniciales en SetTuples
- Dar una charla sobre Lenguajes de Programación (Javascript/NodeJs, Clojure, Erlang, Python, Ruby, Scala)|
- Modelo de AjContab en memoria
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez