domingo, 26 de agosto de 2012

PHP Correcto (parte 2)

Continuando con la mini guía, para conseguir una mayor eficiencia y eficacia en nuestras habilidades como programadores.

El el primer post, hablamos de los pasos a seguir para ser buenos programadores, los enumeramos y seguiremos con la numeración, pero antes un paréntesis, hablamos de que debemos elegir un framework, empezar a usarlo y familiarizarse con el, esto es absolutamente necesario si queremos ser mejores programadores, es importante notar que no es bueno hacernos el programador macho que todo lo puede hacer y desde cero, no tiene nada de malo crear grandes cosas "ensamblando", como programadores debemos aprender de otros, los programadores son una comunidad. No, no hablo de los script kiddies que se la pasan siguiendo tutos, copiando y pegando código sin entender nada, no estoy diciendo que seguir tutos y que copiar y pegar código este mal, si no que hay que experimentar con el código copiado, pero sobre todo leer mucho, mucha teoría, la practica no se comprende sin teoría previa de lo contrario no sabrás que hace lo que acabas de copiar y pegar.

Bueno después del paréntesis, entremos en detalle. los siguientes pasos:

4.- Leer y aprender sobre patrones de diseño, los siguientes, evidentemente no son todos, pero son los mas usados y muchos se mezclan:

         MVC (Model-View-Controller) el patrón modelo vista controlador, consiste en dividir nuestras aplicaciones en 3 capas, a saber:

                      Modelo que cosiste en toda la lógica de negocio, mas fácilmente en la forma como se almacenan nuestros datos, como se recuperan, hacer una abstracción de estos datos es lo mas usual, por ejemplo usar un ORM que es un mapeo objeto relacional, donde las entidades de la base de datos se transforman en objetos dentro del programa.

                      Vista es la capa de presentación de datos, donde no se mezcla nada del funcionamiento o tratamiento de los datos.

                      Controlador se encarga de responder a los eventos generados por el usuario a través de la vista, procesar datos "servidos" por el modelo, en general es la lógica de funcionamiento de nuestro programa.

          Este patrón, ofrece muchas ventajas a la hora de escalar nuestros programas, ademas de que permite a equipos de desarrollo trabajar de forma mas eficiente y ordenada.

         DI (Dependency Injection) inyección de dependencias, consiste en que el acoplamiento o dependencia entre nuestros módulos (clases) sea suministrada a través de la parametrizacion en objetos de las clases que requieran, en vez de que ellas mismas los creen, es decir, la clase A necesita a la clase B, inyectar esa dependencia seria que por medio del constructor de A o un setter se le envié (parametrice) dicha dependencia, ejemplo:
                     objeto = new ClaseA(new ClaseB())
                     //por un setter
                     objeto = new ClaseA()
                     objeto.setClaseB(new ClaseB())
         La forma mas común de implementar este patrón es por medio de un contenedor de dependencias, que suministra los objetos a cada clase con forme los necesitan, esta relación de dependencias puede ser plasmada en un fichero de configuración, esto va muy ligado a la inversión de control.

         IoC (Inversion of Control) Inversión de Control es un concepto un tanto escurridizo, consiste en simple y llanamente invertir el "flujo del programa" tipicamente estamos acostumbrados a la programación imperativa donde, le decimos como hacer las cosas a un modulo o programa, luego hacemos procedure calls o llamadas a funciones durante el funcionamiento de nuestro programa, en la inversión de control esperamos respuestas, ejemplo: en el patrón anterior (DI) vimos que la forma de implementar DI era por medio de un contenedor de dependencias, pues bien, este contenedor de dependencias es un IoC ya que es el quien llama a nuestras clases, esto suele usarse cuando una biblioteca implementa estructuras de alto nivel y es el usuario (programador) quien implementa las tareas de bajo nivel, esto es muy común en los frameworks de desarrollo, donde un contenedor se encarga de crear las instancias de los objetos creados por el usuario.

        existen otros que también son importantes de estudiar, como son singleton, factory, strategy, adapter y decorator, aquí pueden ver una explicación excelente para entenderlos: http://www.baluart.net/articulo/introduccion-a-los-patrones-de-diseno-con-php 

5.- A cuantos de nosotros no nos paso, que mientras codificamos nuestros scripts, tendíamos a probarlos directamente sobre nuestro navegador, tratando de simular la actividad de un usuario. Pero luego sufríamos cuando nos aparecían errores que no sabíamos de donde salían, conforme nuestro desarrollo crecía, se volvía mas tortuoso este tema. Esto nos hace perder tiempo y esfuerzo, la razón es porque en realidad esta forma de desarrollar es muy improvisada si bien la mas rápida para desarrollos cortos, para largos es una tortura. Una buena practica de programación, es aprender a manejar las excepciones y a implementar pruebas unitarias.

            Las pruebas unitarias no son mas que el testeo de rutinas que realizan una tarea concreta, pero desacopladas totalmente de la aplicación donde serán destinadas, de forma que al hacerle pruebas únicamente a un "trozo" de código, sabremos exactamente donde esta el error en caso de que se presente, ademas de que sabremos hacerle todos los "supuestos" cosa imposible de hacer una vez "montada" toda la aplicación,  una herramienta que nos ayuda a esta tarea es PHPUnit, este es un framework para implementar nuestras pruebas. Al principio aprender a usar este framework nos resultara una perdida de tiempo o que realmente no sirve, pero a la larga, ahorrara mucho esfuerzo y con esto logramos darle una robustez a nuestros desarrollos como nunca antes se la habíamos dado, esto diferencia a los buenos programadores de los demás.

            Control de excepciones, con esto hacemos que nuestro programa no se paralice completamente, sabemos que sucede exactamente y podemos tomar decisiones al ocurrir una excepción, a esto se le llama cachar una excepción. Otro uso es que si tenemos un modulo que sera usado por otro, con esto podemos avisar a dicho modulo que ha ocurrido un error a esto se le llama lanzar una excepción. PHP en sus versiones recientes, permite el manejo de las excepciones, aunque todavía no lo hace con las funciones nativas, si podemos hacerlo con las nuestras e incluso personalizarlas. Con esto damos mayor robustez a nuestros programas también.

Continuaremos en la próxima con lo que considero la cima de esta montaña.

Saludos. :)


jueves, 16 de agosto de 2012

PHP correcto (parte 1)

Bueno, después de ausentarme mucho tiempo, estoy de vuelta :)

Ahora les hablare de la manera correcta (como yo lo entiendo) de desarrollar en PHP. Muchos programadores, me incluyo, comienzan mal, pero no esta mal, es un proceso natural, lo que si estaría mal, es estancarse y conformarse con una forma de programación. Si bien no existe una forma canónica de programar en PHP, si hay métodos para hacerlo mejor. Esto pretende ser una guía muy simple para orientar y así conseguir mayor eficacia y eficiencia en nuestros desarrollos.

PHP desde que lo conocí, ha sufrido muchisimos cambios, últimamente a tenido transformaciones muy notables, que hay cambiado por completo la forma de ver este lenguaje, en ultimas versiones se han integrado conceptos avanzados como son: traits, espacios de nombres, reflexión, paradigma de programación funcional (lambda), entre otros. Con esto PHP se vuelve cada vez mas poderoso y esto solo indica que es un lenguaje que permanecerá por muchisimo tiempo mas y dudo mucho que otras tecnologías lo alcancen, asi que quienes desarrollan en este lenguaje y obtienen ganancias por el, pueden estar tranquilos que va a durar muchos años mas como el lenguaje predilecto para la web.

Comencemos. Después de hacer código espagueti, uno termina preguntándose, si hay maneras de no solo hacer su código mas escalable y mantenible, si no de ser un programador mas productivo y profesional. PHP es muy flexible y permite infinidad de formas de lograrlo, pero se han desarrollado técnicas mas apropiadamente principios, patrones de diseño y herramientas tales como DI, IoC, mvc, frameworks, TTD, BDD, etc. que están mas que probadas, sin ir mas lejos los principales frameworks hacen uso de estos técnicas de ingeniería de software.

En forma de lista iniciaremos:

1.- Instalar el entorno mas actual de PHP y MySql (a estas alturas ya dominamos todos este tema).

2.- Elegir un framework de desarrollo, que nos permitirá implementar el mas importante paradigma de programación utilizado en la web y el cual es el MVC (modelo vista controlador) así como una abstracción de datos, entre otros. Esta elección queda a total discreción del programador, yo recomendaría el "oficial" zend framework 2 y uno que es increíblemente rápido y sobre todo sencillo de aprender, ademas de que es hispano, KumbiaPHP, aunque esta en versión beta es muy estable.

 3.- Estudiar sobre los principios de desarrollo, estas trascienden a un paradigma o patrón de desarrollo, hablamos de quizá las tres mas determinantes:

            DRY (Don't Repeat Yourself) conocido también como "no te repitas".

           "no reinventes la rueda" se basa en la premisa de que si estas por codificar una rutina para una tarea muy común, seguramente alguien, o mas bien debería decir, alguna comunidad ya lo hizo y mejor.

            KISS (Keep It Simple, Stupid) "mantenlo simple, estúpido" un poco agresivo pero necesario ya que muchos son necios en este tema y pretenden hacerse los "programadores machos" y crear códigos ilegibles e imposibles de mantener o algoritmos muy complejos para tareas que no lo requieren.

           SOLID este es especifico al desarrollo orientado a objetos, que como sabemos es el mas usado. Es un acronimo mnemonico en ingles de:
                      S - SRP (Single responsibility principle) los objetos tienen una única responsabilidad
                      O - OCP (Open/Close Principle) las entidades de software deben ser cerradas para su modificación, pero abiertas a su extensión.
                      L - (Liskov Substitution Principle) los objetos deben ser reemplazables por instancias de sus subtipos sin alterar el funcionamiento del programa.
                              I - ISP (Interface segregation principle) muchas interfaces especificas son mejor que una sola de propósito general.
                      D - DIP (Dependency inversion principle) se debe depender de abstracciones no de concreciones.
       
         aqui una explicación mas amplia del principio SOLID, se puede investigar uno por uno, para comprender los mejor. http://www.genbetadev.com/paradigmas-de-programacion/solid-cinco-principios-basicos-de-diseno-de-clases

Lo anterior fija las bases con las que nos guiaremos al codificar de ahora en adelante, desde luego hay que profundizar en estos temas.


Seguiremos hablando mas sobre esta pequeña guía, en próximas entradas.

Saludos.