Creación: 1-1-2011
Índice de contenidos
1. Introducción
2. Entorno
3. Los test
4. La clase
5. Conclusiones
6. Sobre el autor
1. Introducción
El pasado día 30 asistí a una reunión de Madrid.rb
(http://groups.google.com/group/madrid-rb). Se trata de un grupo de Madrid donde se reúne gente interesada en Ruby, y la programación en general.
Y ¿por qué fui?, bueno, pues porque aunque soy Javero desde hace muchos años, hay que aprender de todo en esta vida 😉 y como el 30 hacían un Coding Dojo, me animé a asistir para practicar un poco.
Os puedo decir que el evento fue estupendo y la gente fenomenal. Os animo a todos a asistir a sus reuniones, aunque no seáis de Ruby, porque os puede venir muy bien para intercambiar opiniones y pensamientos, y además siempre os podéis tomar luego unas cañas en la post-reunión, que esta gente de Ruby son muy majos 😉
En concreto en la reunión hicimos la kata de los números Romanos en formato “randori”. De lo que se trata es de tener a una única pareja programando la kata, un conductor y un navegante, pero cada 3 minutos se va cambiando a un miembro de la pareja, y así va rotando todo el mundo por los dos puestos.
El facilitador de la reunión fue Enrique Comba (http://ecomba.pro/), él preparó el entorno de trabajo, y fue especialmente divertido porque había que hacerlo con el Vim y con su teclado ingles, jur jur jur, a más de uno le dio quebraderos de cabeza esta combinación explosiva 😉
Al finalizar la sesión Enrique hizo la kata y nos dejó a todos con la boca abierta con el algoritmo para convertir número arábigos en números romanos. Por lo menos a mí, que nunca había sido capaz de terminarla con éxito y con estilo 😛 jajaja y es que lo importante para hacer la kata de los números romanos es saberse los números romanos 😛
Me gustó tanto que al final por la noche me puse a hacerla en casa, pero esta vez en Java, y he querido compartir con vosotros lo que me salió, que por cierto funciona 🙂
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro 17′ (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM, 128GB Solid State Drive).
- NVIDIA GeForce 9400M + 9600M GT with 512MB
- Sistema Operativo: Mac OS X Snow Leopard 10.6.5
- JDK 1.6.0_22
3. Los test
package com.autentia.kata.romanos; import static org.junit.Assert.*; import org.junit.Test; import static org.hamcrest.CoreMatchers.*; public class RomanConverterTest { private final RomanConverter romanConverter = new RomanConverter(); @Test public void should_convert_1_in_I() throws Exception { assertThat(romanConverter.convert(1), is("I")); } @Test public void should_convert_2_in_II() throws Exception { assertThat(romanConverter.convert(2), is("II")); } @Test public void should_convert_3_in_III() throws Exception { assertThat(romanConverter.convert(3), is("III")); } @Test public void should_convert_4_in_IV() throws Exception { assertThat(romanConverter.convert(4), is("IV")); } @Test public void should_convert_5_in_V() throws Exception { assertThat(romanConverter.convert(5), is("V")); } @Test public void should_convert_6_in_VI() throws Exception { assertThat(romanConverter.convert(6), is("VI")); } @Test public void should_convert_7_in_VII() throws Exception { assertThat(romanConverter.convert(7), is("VII")); } @Test public void should_convert_8_in_VIII() throws Exception { assertThat(romanConverter.convert(8), is("VIII")); } @Test public void should_convert_9_in_IX() throws Exception { assertThat(romanConverter.convert(9), is("IX")); } @Test public void should_convert_1949_in_MCMXLIX() throws Exception { assertThat(romanConverter.convert(1949), is("MCMXLIX")); } @Test public void print_all_roman_between_1_and_110() { // Esto no es un test, pero me hacía ilusión ver todos los numeritos ;) for (int i = 1; i < 111; i++) { System.out.println(i + ": " + romanConverter.convert(i)); } } }
4. La clase
package com.autentia.kata.romanos; /** * Clase para convertir número arábigos en números romanos. * <p/> * <a href="http://www.mscperu.org/utiles/utilidades/num_roman.htm" * >http://www.mscperu.org/utiles/utilidades/num_roman.htm</a> * * <pre> * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 * I II III IV V VI VII VIII IX X XI XII XIII XIV XV * </pre> */ public class RomanConverter { private static final int[] specialArabicNumbers = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; private static final String[] specialRomanSymbol = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; private StringBuilder roman; public String convert(int arabic) { int remainingArabic = arabic; roman = new StringBuilder(20); for (int romanSymbolIndex = 0; romanSymbolIndex < specialRomanSymbol.length; romanSymbolIndex++) { remainingArabic = addRomanSymbolIfArabicIsLargeEnough(remainingArabic, romanSymbolIndex); } return roman.toString(); } private int addRomanSymbolIfArabicIsLargeEnough(int arabic, int romanSymbolIndex) { int integerDivision = arabic / specialArabicNumbers[romanSymbolIndex]; concatenate(specialRomanSymbol[romanSymbolIndex], integerDivision); int remaining = arabic % specialArabicNumbers[romanSymbolIndex]; return remaining; } private void concatenate(String romanSymbol, int times) { for (int i = 0; i < times; i++) { roman.append(romanSymbol); } } }
5. Conclusiones
No dejéis de practicar, y ser promiscuos en vuestras relaciones profesionales. No os encerréis en un único entorno o lenguaje. Hablar y mezclaros con gente de otros entornos y lenguajes, y os garantizo que siempre aprenderéis algo nuevo.
6. Sobre el autor
Alejandro Pérez García, Ingeniero en Informática (especialidad de Ingeniería del Software) y Certified ScrumMaster
Socio fundador de Autentia (Formación, Consultoría, Desarrollo de sistemas transaccionales)
mailto:alejandropg@autentia.com
Autentia Real Business Solutions S.L. – «Soporte a Desarrollo»
Interesante y ligerito, buena lectura para empezar la mañana, sobre todo las conclusiones, muchas veces alguien te señala la luna y nos quedamos mirando al dedo. No paremos de practicar, aprender y disfrutar, que nos oxidamos, no salimos de lo nuestro y luego solo nos queda la queja.