Refactorizando legacy code en PHP Parte 2 – Constantes, strings y magia

Hace unos días empezamos a refactorizar una aplicación legacy escrita en PHP, aquí tenéis los primeros pasos para empezar dejé el código en github. Cada post tendrá un tag en github.
Ahora vamos a seguir refactorizando y siguiendo las indicaciones de Paul M. Jones lo primero será intentar ir eliminando los includes para después limpiar un poco el código.

La mejor manera de ir entendiendo el código es eliminar “magic strings” y “magic constant” ya que de esta manera leeremos bastante código que luego podremos ir refactorizando.

Eliminando los include, require,…

Si vemos el código de GameRunner.php tenemos include_once __DIR__ . '/Game.php'; si la aplicación crece esto empezará a ser un problema. Quizás haya escépticos que digan que con includes la aplicación va más rápida porque solo se carga lo necesario. Si ese es vuestro único problema al refactorizar, olvidaos de refactorizar.

Continúa leyendo “Refactorizando legacy code en PHP Parte 2 – Constantes, strings y magia”

Refactorizando legacy code en PHP Parte 1 – ¿Existe algún test por ahí?

Otras veces en el blog hemos hablado de tests, mejores patrones para test y hemos ido dando algunos trucos para poder refactorizar aplicaciones. Hoy damos un paso más y vamos a ir poco a poco refactorizando una aplicacion en PHP, con tests y buenas prácticas.

Desafortunadamente todos hemos tenido que trabajar con código legacy, codigo antiguo, poco legible, código sin tests… así que va siendo hora de aprender a refactorizar aplicaciones legacy. Existen muchos libros que hablan sobre legacy code, en esta serie de posts vamos a basarnos en el proyecto Legacy code retreat y tomaremos como referencia los libros Working Effectively with Legacy Code y Modernizing Legacy Applications in PHP

Continúa leyendo “Refactorizando legacy code en PHP Parte 1 – ¿Existe algún test por ahí?”

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.

Continúa 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();
    }
}

Continúa leyendo “Empezando una kata de código en PHP con PHPUnit”

El patron singleton en PHP y los test unitarios con PHPUnit

Llevamos una serie de post hablando sobre PHPUnit, sobre como hacer asserts y de patrones para hacer mejores test. Hoy vamos a comentar un poco acerca del patrón/antipatrón Singleton.

Según la Wikipedia El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.

Básicamente consiste en garantizar que una clase solo tenga una instancia y un punto de acceso.

Continúa leyendo “El patron singleton en PHP y los test unitarios con PHPUnit”

Haciendo TDD en PHP con Silex y PhpUnit (Parte 2)

Hace unos días hemos empezado a trabajar con TDD y Silex en un proyectos bastante especial, “Como utilizar Tdd con Silex utilizando PhpUnit” para ello ya tenemos configurado todo el entorno par a poder empezar a hacer test, escribir código y refactorizar.

Básicamente nuestro proyecto es la API de una calculadora 😉 es decir es una calculadora con la que podremos realizar operaciones aritméticas de 2 operandos con tan solo hacer peticiones GET a una dirección web. Para ello los pasos que daremos serán, refactorizar la aplicación actual para poder ampliarla con la nueva funcionalidad, crear una librería que realice las operaciones aritméticas, modifica el routing para poder hacer las operaciones haciendo peticiones GET desde un Navegador.

Refactorizar el proyecto de Silex con TDD para ampliar la aplicación.

Ahora que tenemos test (aunque solo sean un par) podemos hacer cambios y asegurarnos de que todo sigue funcionando. Lo primero que haremos será mover toda la lógica de la App. Pero antes que nada debemos asegurarnos de que todo está correcto, así que antes de tocar nada lanzamos nuestros tests.

Continúa leyendo “Haciendo TDD en PHP con Silex y PhpUnit (Parte 2)”

Haciendo TDD en PHP con Silex y PhpUnit (Parte 1)

Hace ya bastante tiempo que en el blog estamos hablando sobre PhpUnit, TDD e incluso hemos nombrado a Silex, creo que ya va siendo hora de crear un pequeño proyecto en el que aplicar todo esto. Llevo ya unos días trabajando sobre mi cuenta de github (https://github.com/jeslopcru) en un pequeño proyecto PHP donde utilizo Silex, PHP y TDD. Es solo una pequeña prueba de concepto para ver que es posible hacer TDD utilizando Silex y por tanto también podría ser posible hacer TDD utilizando Symfony2.

En este proyecto montaremos todo el entorno utilizando Composer junto PhpUnit y symfony/browser-kit (para poder hacer tests funcionales a los controladores symfony). También utilizaremos monolog para los logs. Así que vamos manos a la obra.

Información acerca del proyecto

Vamos a crear una calculadora con la que podremos hacer operaciones básicas, para utilizarla haremos uso del navegador, es decir, como URL utilizaremos algo así http://www.example.com/add?numberA=2&numberB=3 y la respuesta será la suma de ambos parámetros.
Si, es cierto, en un primer momento no parece un gran proyecto, pero lo importante de esto es que construiremos todo esto utilizando el microframework Silex y trabajando mediante TDD.

Creando el proyecto

Para crear el proyecto lo más cómodo es utilizar una herramienta como virtualhost.sh. Este script permite crear toda la configuración necesaria para crear un crear un site en Apache, mapear la dirección en etc/hosts y configurar el log de apache. Para instalarlo solo tenemos que abrir un terminal y escribir brew install virtualhost.sh

Continúa leyendo “Haciendo TDD en PHP con Silex y PhpUnit (Parte 1)”

PHPUnit y buenas prácticas

Hace ya unas semanas realicé unos post sobre como instalar PHPUnit para empezar con TDD. Hace unos días me llegó desde twitter un post sobre “Ser profesional” (http://plqd.blogspot.com.es/2013/07/ser-profesional.html) En el Pepe Doval cuenta experiencias tratando con personas más o menos profesional. Uno de los puntos clave que cuenta Doval es que el mundo de la programación es muy cambiante, llegan nuevos lenguajes y tecnologías cada día, por ello lo mejor la mejor manera de ser un profesional es aplicar buenas prácticas, desde comentar bien el código, hacer buenos commit, practicar TDD. Por eso llegado a este punto voy a escribir sobre buenas prácticas con PHPUnit.

He de decir que no soy un experto en la materia, esto son solo una serie de recomendaciones extraídas de Internet y que yo intento utilizar en la medida de lo posible, aunque para ser sincero no siempre consigo utilizarlas 😉

Vamos a basarnos en el ejemplo de la cuenta bancaria, es el mismo del post anterior sobre PHPUnit y el ejemplo clave de la documentación de PHPUnit (http://phpunit.de/manual/current/en/index.html)

Sé descriptivo acerca de lo que estás probando

Los test que escribimos deben ser autodescriptivos y con solo un vistazo al código debemos saber que se está probando. Esto puede ser fácil de decir pero bastante difícil de hacer, por ello en PHPUnit están las anotaciones como @Covers.

Continúa leyendo “PHPUnit y buenas prácticas”

Empezando con TDD – Primer ejemplo paso a paso

Ya lo tenemos todo instalado, xammp funcionando, eclipse pdt con el plugin de phpunit y hemos probado que todo funciona correctamente con un pequeño ejemplo. Ahora vamos con lo divertido.

Para recordarlo vamos a resumir en un momento esto del TDD

Test Driven Development (TDD)

TDD es una técnica para desarrollar y diseñar software. Consiste en escoger un requisito a desarrollar y aplicar estas reglas.

1 No escribir código ninguno, escribir primero una prueba (test)para el requisito.
2 Verificar que la prueba falla.
3 Escribir el código para pasar la prueba.
4 Ejecutar la prueba y comprobar que el código funciona.
5 Refactorizar el código para evitar duplicación.

Aserciones

Antes de entrar en materia, debemos conocer las aserciones, cada vez que escribimos n test debemos comprobar si se cumple una condición. Para ello PHPUnit nos provee de una serie de funciones llamadas asserts.

En la Wikipedia podemos ver que una aserción es un predicado (i.e., una sentencia verdadero-falso) incluido en un programa como indicación de que el programador piensa que dicho predicado siempre se cumple en ese punto del flujo de programa.

Aquí la tabla con las aserciones que se pueden utilizar en PHPUnit http://phpunit.de/manual/3.6/en/appendixes.assertions.html, pero no debemos preocuparnos no hay nada que “crtl + espacio” (autocompletado) no pueda solucionar 😉

Continúa leyendo “Empezando con TDD – Primer ejemplo paso a paso”

Empezando con TDD – Configurando el entorno (XAMPP + ECLIPSE PDT + PHPUNIT)

Ya hemos hablado en el blog de Scrum, de kanban, de herramientas de gestión de proyectos. Ahora quiero ir un poco más allá y empezar con TDD. Últimamente he estado adentrándome en encontrar una manera de desarrollar software con calidad y creo que utilizar Test Driven Development es un buen comienzo. Así que haya vamos.

Introducción

Test Driven Development (TDD) es una técnica de diseño e implementación de software incluida dentro de la metodología XP. Se basa en la idea de desarrollar pruebas, codificar y refactorizar el código construido.

TDD se basa en la idea de realizar pruebas unitarias para el código que debemos construir.

Continúa leyendo “Empezando con TDD – Configurando el entorno (XAMPP + ECLIPSE PDT + PHPUNIT)”