Kata FizzBuzz

De la misma forma que un futbolista entrena cada día, un programador también tiene que “entrenar” para desarrollar mejor software. Creo que la mejor manera de practicar código es hacer una kata.

Para empezar, he escogido una kata sencilla, como es FizzBuzz y solo he realizado una primera iteración de 25 minutos.

Kata FizzBuzz

Escribe un programa que imprima los números del 1 al 100, pero aplicando las siguientes normas:

  • Devuelve Fizz si el número es divisible por 3.
  • Devuelve Buzz si el número es divisible por 5.
  • Devuelve FizzBuzz si el número es divisible por 3 y por 5.

Seguir leyendo “Kata FizzBuzz”

Mejorando con Mockery – Separando responsabilidades

Hace poco empezamos haciendo nuestra primera kata de código utilizando phpunit. En una primera iteración conseguimos una calculadora totalmente funcional. El código de la kata está en github (http://github.com/jeslopcru/php-coding-dojo).
Esta vez vamos a dar un pequeño empujón a la kata, emepzando a utilizar Mockery y sobre todo vamos a seguir aprendiendo buenas prácticas de desarrollo. Para hacer más intenresante la kata podemos activar phpcs o php-cs-fixer para que antes de hacer un commit analicemos el proyecto para hacer que nuestro código se adapte a un estandar. Yo como guía para instalarlo he utilizado esta referencia (http://sergigp.com/phpstorm-integrando-herramientas-de-calidad-de-codigo)

¿Donde lo dejamos?

Teníamos una calculadora funcional, que era capaz de sumar y restar, pero quizás ese switch es algo “feo”. Para quien no lo recuerde este esta es la función que estamos comentando:

    protected function calculate($num, $symbol)
    {
        if (!is_numeric($num)) {
            throw new InvalidArgumentException();
        }

        switch ($symbol) {
            case '+':
                $this->result += $num;
                break;

            case '-':
                $this->result -= $num;
                break;
        }
    }

Añadir más funciones a la calculadora haría aumentar el switch y eso creo que no es una buena solución.

Casi cada vez que utilizamos un switch podemos mejorarlo utilizando polimorfismo. Es cierto que esta regla de cambiar switch por polimorfismo no puede usarse siempre, pero sería bueno tenerla siempre en mente.

Seguir leyendo “Mejorando con Mockery – Separando responsabilidades”

Empezando una kata de código en PHP con PHPUnit

Hace ya un tiempo asistí a una kata TDD en PHPMad, la verdad es que me gustó y pude aprender bastante.

Para entendernos una kata (aplicado a la programación), se traduce en pequeños ejercicios, de menos de 1 hora de duración, que nos ayudan a aprender y mejorar.

Con las katas aparte de aprender podemos mejorar nuestras habilidades y/o nuestros hábitos a la hora de programar. También podemos utilizar atajos de teclado y coger el hábito de “pensar antes de picar”. Así que hoy vamos a hacer una pequeña kata.

El problema que he elegido es una calculadora, que aunque sea un ejemplo muy visto, nos irá ilustrando como ir afrontando el reto. El ejemplo está sacado del libro diseño ágil con TDD.

Como base vamos a partir del proyecto https://github.com/matthiasnoback/php-coding-dojo donde tenemos todo lo necesario para hacer funcionar PHPStorm y PHPUnit en conjunto. Si queréis ir echando un vistazo, mis soluciones las iré colgando en mi cuenta de github: https://github.com/jeslopcru/php-coding-dojo

El problema de la calculadora

#Calculator:

Quiero lanzar al mercado un software educativo para enseñar matemáticas a niños. Necesito que puedan jugar o practicar a través de una página web pero también a través del teléfono móvil y quizás más adelante también en la consola Xbox. El juego servirá para que los niños practiquen diferentes temas dentro de las matemáticas y el sistema debe recordar a cada niño, que tendrá unnombre de usuario y una clave de acceso.
El sistema registrará todos los ejercicios que han sido completados y la puntuación obtenida para permitirles subir de nivel si progresan. Existirá unusuario tutor que se registra a la vez que el niño y que tiene la posibilidad de acceder al sistema y ver estadísticas de juego del niño. El tema más importante ahora mismo es la aritmética básica con números enteros. Es el primero que necesito tener listo para ofrecer a los profesores de enseñanza primaria un refuerzo para sus alumnos en el próximo comienzo de curso. El módulo de aritmética base incluye las cuatro operaciones básicas (sumar,restar, multiplicar y dividir) con números enteros. Los alumnos no solo tendrán que resolver los cálculos más elementales sino también resolver expresiones con paréntesis y/o con varias operaciones encadenadas. Así aprenderán la precedencia de los operadores y el trabajo con paréntesis: las propiedades distributiva,asociativa y conmutativa. Los ejercicios estarán creados por el usuario profesor que introducirá las expresiones matemáticas enel sistema para que su resultado sea calculado automáticamente y almacenado. El profesor decide en qué nivel va cada expresiónmatemática. En otros ejercicios se le pedirá al niño que se invente las expresiones matemáticas y les ponga un resultado. El programa dispondrá de una calculadora que sólo será accesible para los profesores y los jugadores de niveles avanzados. La calculadora evaluará y resolverá las mismas expresiones del sistema de juego.
Cuando el jugador consigue un cierto número de puntos puede pasar de nivel, en cuyo caso un email es enviado al tutor para que sea informado de los logros del tutelado. El número mínimo de puntos para pasar de nivel debe ser configurable.

Nuestro primer Test

Lo primero será crear una carpeta para el proyecto llamada CalculatorProject y dentro una carpeta Tests que albergará nuestro primer test.
Como estamos haciendo TDD, debemos tener en mente siempre el ciclo de test driven development Test – Code – Refactor Así crearemos una clase llamada CalculatoerTest con nuestro primer test para la calculadora

<?php

namespace CalculatorProject\Tests;

use CalculatorProject\Calculator;

class CalculatorTest extends \PHPUnit_Framework_TestCase
{

    public function testInstance()
    {
        new Calculator();
    }
}

Seguir leyendo “Empezando una kata de código en PHP con PHPUnit”