Refactorizando legacy code en PHP Parte 9 – Los últimos toques

Ya casi estamos acabando con la refactorización, parece mentira cuando empezamos con un solo archivo PHP, ahora tenemos clases, interfaces e incluso inversión de dependencias. Somos capaces de modificar algo sin miedo porque tenemos tests que nos indican si estamos cometiendo errores. Además podemos ampliar la funcionalidad de nuestra aplicación de una manera más o menos sencilla.

En este tutorial vamos a atacar a la “clase” GameRunner. Bueno a los métodos del archivo GameRunner para convertirlos en una clase para más adelante terminar de refactorizar los métodos que nos quedan de la clase Game.

Llegando a ser orientado a objetos

A pesar de que tenemos la mayor parte de nuestro código orientado a objetos, algunas funciones están solas en un archivo. Así que el objetivo de este post es convertir esos procedimientos en algo más orientado a objetos.

Continúa leyendo «Refactorizando legacy code en PHP Parte 9 – Los últimos toques»

Anuncio publicitario

Refactorizando legacy code en PHP Parte 8 – Inyección de dependencias

Volvemos otra vez a la carga refactorizando nuestra aplicación php legacy. Esta es la serie de posts más larga que he hecho hasta el momento, pero creo que el tema lo merece.

Esta entrega empezaremos ha plantear la arquitectura de la aplicación, o al menos una separación lógica de clases que irá evolucionando. Nuestra arquitectura debe centrarse en la lógica de negocio. Alrededor de esta tendremos varios módulos “auxiliares” que tienen diversos fines.

Por ejemplo conectar al usuario con la aplicación, en nuestro caso será la linea de comandos. Por otro lado tenemos la persistencia, que en nuestro caso no nos afecta ya que no utilizamos nada de este tipo. También tenemos las factorías y constructores y por ultimo están las clases que representan la entrada al sistema. En nuestra aplicación de Trivial podría considerarse la clase GameRunner de este tipo.

Continúa leyendo «Refactorizando legacy code en PHP Parte 8 – Inyección de dependencias»

Refactorizando legacy code en PHP Parte 7 – Capa de presentación

La capa de presentación

Ya llevamos 7 entregas de como refactorizar una aplicación PHP legacy. Ahora llega el momento de empezar a separar responsabilidades, de ir creando distintas clases y sobre todo de ir mejorando nuestra aplicación legacy en PHP.
Hemos visto a lo largo de los posts que la capa de presentación juega un papel fundamental en nuestro juego de Trivial. Vamos a tratar de identificar todos los sitios donde se haga “presentación” y trataremos de empujar esa “reponsabilidad de representar la salida de la aplicación” a un solo lugar. Para ello nos basaremos en los principios SOLID.

Fundamentos SOLID

Cuando comenzamos una refactorización y empezamos a cambiar código debemos guiarnos por unos principios. Estos principios nos ayudarán a ir tomando decisiones en cada paso de la refactorización. Si hablamos de programación orientada a objetos, los principios que debemos tener en mente son entre otros SOLID. Según la Wikipedia SOLID es un acrónimo mnemotécnico introducido por Robert C. Martin “Uncle Bob” que representa cinco principios básicos de la programación orientada a objetos y el diseño. Cuando se aplican estos principios en conjunto es más probable que un desarrollador cree un sistema que sea fácil de mantener y ampliar en el tiempo.

Continúa leyendo «Refactorizando legacy code en PHP Parte 7 – Capa de presentación»

Refactorizando legacy code en PHP Parte 6 – Métodos complejos

Llevamos ya un tiempo hablando de como refactorizar una aplicación legacy en PHP. Desde que empezamos hemos ido aprendiendo poco a poco a ir reescribiendo código sin perder la funcionalidad de la aplicación. Llegados a este punto, nuestra aplicación legacy ya tiene algunos tests unitarios, utilizamos mocks en algunas partes y lo más importante: Estamos aprendiendo a conocer todo el sistema, hemos leído el código unas cuantas veces y ahora sí podemos atacar a los métodos más complejos.
En mi cuenta de github está todo el proceso que hemos llevado a cabo, además mediante los tags podemos ir viendo como hemos ido evolucionando esta aplicación legacy en PHP para ir convirtiéndola en una aplicación PHP con tests, fácil de entender y con funciones pequeñas.

Entendiendo el método roll()

Cuando leemos el método roll nos damos cuenta de que no devuelve nada por lo que puede que este método sea algo difícil de probar. Así que lo mejor que podemos ir haciendo son pequeñas refactorizaciones automáticas con nuestro IDE y algún “rename” de variables que veamos clarísimo. Si vemos que la refactorización se pone un poco cuesta arriba siempre podemos utilizar el test master comparando ficheros de texto.

Continúa leyendo «Refactorizando legacy code en PHP Parte 6 – Métodos complejos»

Refactorizando legacy code en PHP Parte 5 – creando test sencillos

Refactoring de una aplicación PHP Legacy. Después del intenso post sobre como empezar con loo test unitarios en un refactoring en este vamos a trabajar con la clase Game.php, empezaremos a crear pequeños test de funcionalidades para ir refactorizando. Recordemos que la idea es empezar a refactorizar desde verde para intentar no introducir errores en nuestro refactor.

Creando un “Game”

Lo primero que necesitamos para poder empezar a testear es una instancia de Game, para ello lo primero que haremos sera crearnos nuestra clase específica para test (GameTest) y crear un pequeño test para crear una nueva partida de Trivial.

class GameTest extends PHPUnit_Framework_TestCase
{
    public function testCreateAGameOk()
    {
        $game = new Game();
        $this->assertInstanceOf('Game', $game);
    }
}

Parece sorprendente pero sin mayor problema hemos podido crear una instancia de Game fácilmente y nada se rompe.

Continúa leyendo «Refactorizando legacy code en PHP Parte 5 – creando test sencillos»

Refactorizando legacy code en PHP Parte 4 – como empezar con test unitarios en un refactoring

Continuamos con la serie refactoring PHP legacy code. en el post de hoy empezaremos a hacer test unitarios que serán la base de todos los cambios y refactorizaciones futuras. Extraeremos funcionalidades, pequeñas piezas de código que podremos probar con test unitarios.Aunque parezca que solo son unos simples test, no debemos olvidar que estamos trabajando con código “feo”, sin coding estándar. Como siempre iremos dando pequeños pasos para tropezar.

Test unitarios con PHPUnit

Ya hemos hablado en el blog de test unitarios puedes encontrarlo aquí así que no vamos a dar una introducción a los tests unitarios. Además como ya tenemos composer con phpunit instalado solo tenemos que empezar.

Los test unitarios deben ser independientes

Buscando funciones aisladas

Si el código lo permite (como este caso) es recomendable empezar a escribir test de código que podamos probar. Esto nos será útil para comprender la lógica de funciones pequeñas y para ir cubriendo poco a poco el código a testear.

Analizando nuestros archivos, podemos descartar de momento el método run de GameRunner.php porque no tiene ninguna lógica y aunque podemos probarlo no tiene sentido gastar demasiado tiempo en el todavía. Vamos a por un trabajo más fácil para coger un poco de práctica antes. ¿Recordáis el método isCorrectAnswer() que refactorizamos en el anterior post? Vamos a por él.

Lo primero es centrarnos solo en esta función, por lo que de momento vamos a marcar como skipped el test de GameRunnerTest.php y vamos a crear un test específico para testear la función is isCorrectAnswer, pero tenemos un problema la funcion rand() necesitamos hacer algo para controlarla 😉 Así que lo primero será ir a la documentación y hacer una pequeña prueba ¿que pasa si min y max son iguales?

    function testCanFindCorrectAnswer()
    {
        for ($i = 0; $i < 10; $i++) {
            var_dump(rand($i,$i));
        }
    }

¡Mola! Ya tenemos una manera de forzar números aleatorios como nosotros queramos.

Continúa leyendo «Refactorizando legacy code en PHP Parte 4 – como empezar con test unitarios en un refactoring»

Refactorizando legacy code en PHP Parte 3 – Condiciones complejas

Seguimos con la serie como refactorizar código legacy en PHP. Normalmente una de las características del código legacy es que es complejo, ya no solo porque la sintaxis sea difícil, sino porque para tratar de entenderlo hay que hacer un gran esfuerzo mental. Bucles, if imposibles, declaraciones de variables mezcladas con mil cosas más, métodos excesivamente largos.

Continúa leyendo «Refactorizando legacy code en PHP Parte 3 – Condiciones complejas»

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í?»