Claves para mejorar nuestro código.

 

Código

Me gustaría compartir algunas de las cosas que tengo en mente cuando desarollo y hacerlo a mi máximo nivel.

  • MVC : modelo vista controlador.
  • DRY : No te repitas.
  • KISS : mantenelo breve y simple.
  • TDD : Programación orientada a tests.

MVC

El patrón y/o arquitecutra MVC (Model, Vista, Controlador), Nos ayuda a separa la parte de datos de una aplicación, de la parte lógica y de la interfaz de usuario. Hoy en día lo adopta cualquier framework de desarrollo, ahora bien aún teniendo un framework con esta arquitectura si nosotros mismos no adoptamos este patrón, podemos terminar haciendo lo que llamamos coloquialmente, una chapuza.

DRY

Dry (Don’t Repeat Yourself), podríamos traducirlo como no te repitas. Es un filosofía de procesos que promueve la no duplicidad del código, creo que cualquier desarrollador lucha con esto, hay otra cosa que se enseña por ahí, dicen que incluso su promotor podría ser la universidad en España, que es que si algo funciona no lo toques, Dry ya no es el hecho de que un código funcione, sino que al no repetirse, sea más fácil de modificar y detectar algún error, en definitiva ahorrar tiempo para poder relacionarnos con otros seres humanos.

KISS

KISS (Keep It Short and Simple) Mantenlo breve y simple o de una manera más dura que personalmente no me desagrada (Keep It Simple, Stupid). Mantenlo simple, estúpido!. En mi opinion esencial en nuestro día a día, personalmente para llevar a cabo esta “sugerencia”, pienso que mi código sin comentarios se tiene que entender perfectamente, y si me da pereza leerlo es que no cumplo con KISS.

TDD

TDD ( Test-driven development) traducido, desarrollo guiado por pruebas. es la práctica de escribir primero los tests, pensar en los casos que deberías probar, incluso antes de empezar a programar nada, crear el test, y después ya si, programar para que el test pase. Tengo que ser sincero esta última clave, es la que más me cuesta, en mi mente está el que estoy perdiendo el tiempo, me auto engaño, puede que sea cierto que “resultados” no sean visibles al principio con tanta velocidad, pero se que los resultados que obtengo son fiables, y esto al final es tiempo que ganas. Así que no se pierde tiempo ( me lo repito a mi mismo).

 

Instalar entorno para Tests Unitarios en cakePhp 2 (macosx)

 

cakePhp

Una peculiaridad de cakePhp2, es que Usa PhpUnit para la creación de test, y no viene instalada.

Al usar Mamp como servidor local, era algo complicado la instalación de PhpUnit en un projecto en cakePhp, encontré el siguiente Plugin que nos ayuda: https://github.com/Hyra/PHPUnit-Cake2 Gracías a Stef van den Ham.

Como instalar este vendor:

  1. Descargar el zip y descomprimirla en tu proyecto en la carpeta Plugin o bien ejecutar el siguiente código en tu proyecto “git clone https://github.com/Hyra/PHPUnit-Cake2 app/Plugin/Phpunit”
  2. Ejecutar el siguiente código en tu consola dentro de tu proyecto “cake Phpunit.Phpunit install”, si no tienes configurado en el path cake, puede ayudarte este video , recomendamos que se instale en la opción 1 “app/vendors”.
  3. En tu archivo bootstrap.php añade al final “CakePlugin::loadAll();” para que se carguen todos los plugins o bien “CakePlugin::load(‘Phpunit’);” para cargar solo el plugin phpunit.
  4. Con estos pasos ya tiene instalado el entorno de testing con phpUnit, que funcionará en otros sistemas operativos.

 

 

Review del libro Diseño ágil con TDD

 

Libros

Me he leido el libro Diseño ágil con TDD. Me ha gustado mucho la primera parte del libro algo más teórica, hablando más sobre porqué usar tests, la segunda parte del libro más práctica para mi fue algo más aburrida ya que tenía experiencia en la creación de tests.

Es un libro recomendado para todos los programadores con un nivel medio /alto, Y que quieran mejorar en sus prácticas de programación.

Puedes encontrar este libro en su web oficial http://www.dirigidoportests.com/el-libro , gratuito en su edición online, también cuenta con una edición impresa.

Test Unitarios en Cakephp

 

cakePhp

Podreís ver que muchos de mis Posts son sobre cakephp, pero es sobre lo que estoy trabajando ahora mismo.

En este caso me gustaría Explicar como hacer un test unitario en un módelo y su importancia.
A mi me ayuda mucho. No se siempre, si mi modelo está bien hecho, también me ayuda a pensar en todas las funciones que necesito para ese modelo, en diferentes casos que puedo tener de respuesta, y no dar palos de ciego cuando algo no funciona.
Aunque al principio pueda parecer una perdida de tiempo hacer test unitarios, cuando la complegidad se mayor más los necesitaremos, y nos daremos cuenta de que nuestro rendimiento mejora.

Lo primero que deberemos hacer, es crear un fixture, vamos a poner un ejemplo simple, un modelo User con los campos id, name, email.

En el directorio tests/fixtures creamos el archivo user_fixtures.php
En este fichero siempre tendremos que tener la extructura de nuestra tabla, y datos con los que luego haremos nuestros tests.

ejemplo user_fixtures.php

class UserFixture extends CakeTestFixture {
	var $name = 'User';
	var $table = 'users';
	var $fields = array(
		'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 20, 'key' => 'primary'),
		'name' => array('type'=>'string', 'null' => false, 'default' => NULL, 'length' => 100),
		'email' => array('type'=>'string', 'null' => false, 'default' => NULL),
		'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1))
	);
	var $records = array(
		array(
		'id'  => 1,
		'name'  => 'usuario1',
		'email'  => 'usuario1@email.com'),
	var $records = array(
		array(
		'id'  => 2,
		'name'  => 'usuario2',
		'email'  => 'usuario2@email.com'),
	);
}

Una vez hecho el fixture, es momento de pensar en nuestros en un caso de test unitario, el primero que se me ocurre es buscar usuarios por su id.
Creamos en el directorio tests/models el archivo user.test.php, importante siempre en cake el nombre de los arhivos.
Ejemplo user.test.php

App::import('Model', 'user');

class UserTestCase extends CakeTestCase {
	var $user = null;
	var $fixtures = array('app.user');

	function startTest() {
		$this-=>User =& ClassRegistry::init('User');
	}
        function testuserInstance() {
		$this-=>assertTrue(is_a($this-=>User, 'User'));
	}
        function testfindUserId(){
	        // buscamos en el modelo user en la función findUserId la id 1.
		$friendid=$this-=>User-=>findUserId(1);
                // comparamos si el usuario el name de la busqueda, con usuario1, que debería ser true.
		$this-=>assertEqual($friendid['User']['name'],'usuario1');
	}
}

Ya tenemos Hecho un test unitario para el modelo User, ahora mismo esto nos dará Error, debemos crear la funcion findUserId() en el modelos user, aún así nos dará error, hay que hacer que esta función nuestro return sea el usuario 1 que es lo que estamos buscando.
Por cierto para poder hacer test en Cakephp debemos tener el debug del core.php a 2.