lunes, 30 de junio de 2008

Web Services - Introduccion

¿Que son?
Un web service es un conjunto de estándar y protocolo que sirve para intercambiar información entre distintos sistemas. Un sistema desarrollado con cierta tecnología, por ejemplo Java, puede comunicarse con un sistema en PHP a través de un Web Services, esta es la funcionalidad principal, pero no necesariamente tienen que ser de diferentes plataformas, los sistemas pueden estar realizados en un mismo lenguaje, por Ejemplo comunicar dos sistemas realizados en PHP a través de un web service.

Esto se consigue gracias al uso de estándar abiertos que son regulados por la W3C y OASIS encargados de dicha tarea.


Los estándar que se manejan en un web Service, son Web Services Protocol Stack, XML, SOAP, XML-RCP, HTTP, FTP, SMTP, WSDL, UDDI, y WS-Security

Un ejemplo de utilizacion de un web Service.

La cadena de Hoteles OneTravel, se asocia con la agencia de viajes EcoSpace.

Cada empresa tiene un sistema particular para cada empresa, pero surge la necesidad de reservar una habitación desde el sistema de EcoSpace que repercuta en OneTravel, para saber si tiene disponibilidad para cierta fecha, durante ciertos días. Esta comunicacion la podemos hacer a través de un Web Service.

OneTravel, tiene un WebService (desde ahora WS), en el cual nosotros podemos conseguir.

- El listado de los hoteles asociados a OneTravel.
- Interfaz para reservar una habitación
- Interfaz para liberar una reserva
- Interfaz para saber los detalles de los servicios.


EcoSpace al poder interactuar con OneTravel de forma remota y en linea, se puede reservar una habitación desde el sistema de EcoSpace de forma automatizada y que impacte en el sistema de OneTravel, sin la necesidad de correos electrónicos, o llamadas por teléfono para confirmar, de esta forma nosotros impactamos directamente sobre el sistema de OneTravel.

Los Web Service no solo nos sirven para hacer reservas en un hotel desde una agencia de viajes, sino para cualquier tipo de comunicacion a través de sistemas diferentes. A nuestros WS le podemos dar la cantidad de funcionalidades que necesitemos.



Ventajas de un web Services
Los WS tienen muchas ventajas.
Son puentes de comunicacion a través de aplicaciones desarrolladas en diferentes plataformas independientemente de sus propiedades o plataforma en la que se instale. Una aplicacion desarrollada en Linux, se puede comunicar tranquilamente con una aplicacion desarrollada para Windows.

Se puede dar que una aplicacion solo englobe a un conjunto de WS. Por ejemplo un home Banking. Nosotros autenticamos nuestros datos a un servidor especial que Corre una aplicacion en C que corre sobre un Debian, también tenemos la conexión, con las diferentes empresas de tarjeta de créditos (American Express, Visa, Master, Cabal, etc), esta comunicacion se hace a través de un WS que es administrado por cada empresa. Ademas tenemos el WS de pagomiscuentas.com, que a su vez se conecta con los WS de otras empresas y a su vez con mas WS, permitiendo al usuario pagar la cuenta de teléfono de su casa, a través de su Home Banking, sin la necesidad de ir a los cajeros de esta empresas.


Desventajas
El problema principal que tiene un WS es el rendimiento, al ser un estándar basado en texto, resulta ser mas pesado que con otros estándar de comunicacion.
Al ser procesado por el puerto de HTTP, algunas reglas de los firewall pueden ser violadas.


¿Por que crear un WS?
Los WS son fácil de implementar, tanto para la creación de un WS, como para la implementación y uso de este. A medida que pasa el tiempo mas aplicaciones usan los WS para comunicarse, y esto hace que se genere mas información, y sea mas común hablar de WS. Es comun encontrar en grandes organizaciones uno o mas sistemas internos desarrollados en algún lenguaje para crear aplicaciones de escritorio, y con el crecimiento y auge de Internet, el uso de aplicaciones vía web crece dia a dia. Lenguajes como PHP pueden comunicarse muy facilmente con estos sistemas para brindar informacion o interactuar con un usuario via web.


Referencias
OASIS http://www.oasis-open.org
W3C http://www.w3c.es/Consorcio/

Paradigmas de programación

Paradigmas v1.0

Antes de hablar de programación y de las distintas formas que hay para resolver un problema, esta bueno ir un poco más allá y pensar en:

“¿Qué es una forma de resolver un problema?”

Como en todas las ramas del conocimiento, en la programación existe la noción de Paradigma.

Un paradigma, en general, plantea una forma de encarar los estudios y / o problemas, ejemplos claros son los paradigmas de psicología, que existen las distintas escuelas, que van desde la gestalt a el psicoanálisis, postulando formas de estudiar el comportamiento humano completamente distintas, pese a buscar siempre el mismo fin.

Entonces, los paradigmas, son herramientas conceptuales que se encuentran completamente en el mundo de los pensamientos que dan al programador las nociones y formas de abstracción que sirven para resolver problemas.

Algunos de los paradigmas hoy vigentes se clasifican de esta manera:

· Imperativos

o Estructurado – Procedural

o Orientado a Objetos

o Aspectos

o Orientado a procesos (concurrencia)

· Declarativos

o Orientados a lógica

o Orientados a funciones (del tipo matemáticas)

o Orientados a Consulta / Almacenamiento

Este texto contempla solo las dos grandes clasificaciones: Imperativos y Declarativos.

Paradigmas Imperativos

Estos paradigmas se caracterizan principalmente por el hecho de preocuparse por el problema a resolver (“que”) y por “como” resolverlo.

Cuando un piensa en la resolución de un problema, tiene que pensar en todos los pasos a dar para resolverlo. Luego, a la hora de programar, cada uno de esos pasos se transforma en una instrucción o mejor dicho, un mandato (de ahí la calificación de imperativo).

Paradigmas Declarativos

Estos paradigmas se caracterizan, principalmente, por preocuparse de el problema (“que”) y no del “como” resolverlo. En general, los lenguajes que soportan este tipo de paradigmas, tienen un motor que se encarga de interpretar el “que” y transformarlo en una solución.

Cuando uno piensa en la resolución de un problema en este tipo de paradigmas, tiene que modelar el problema en el marco del paradigma concreto y expresar al motor la necesidad asociada para que el lo resuelva.

Ejemplo

Problema:

Necesitamos conseguir una entrada para el recital de Iron Maiden.

Solución 1:

Sabiendo que estamos en un living en un 7mo piso, y a 3 cuadras a la izquierda y dos adelante (tomando como referencia la puerta del edificio) del lugar de venta, y que tenemos la plata en la mesita de luz:

· caminamos hasta el cuarto

· abrimos la mesita de luz

· agarramos la cantidad de plata necesaria

· vamos hasta la puerta

· llamamos el ascensor

· entramos en el ascensor

· apretamos el botón a planta baja

· salimos del ascensor

· salimos del edificio

· caminamos 3 cuadras a la izquierda

· doblamos a la derecha

· caminamos 2 cuadras

· entramos en el local

· compramos la entrada

Solución 2:

Sabiendo que existe el service chart, que tenemos tarjeta de crédito y tenemos teléfono:

· Llamamos al service chart

· Pedimos que nos envíen la entrada

· Damos el código de tarjeta

· Esperamos la entrada J

Puntos en común:

· Ambas formas requieren recursos

· Ambas formas resuelven el problema

Puntos distintos

· La primer forma es mas económica en plata

· La segunda forma es mas económica en tiempo de la persona

· La primer forma solo sirve si estoy siempre en el mismo lugar

· La segunda forma sirve siempre, el service chart es el que se encarga de saber “como”, a mi solo me importa el “que”

Después de ahondar más en los distintos paradigmas voy a volver sobre esta calificación, para poder generalizar los features, que son en definitiva los que hacen que exista la calificación “Imperativo” y “Declarativo”.

Controladores y vistas

Nuestros modulos estan dentro de la carpeta application.

Los modulos en un sistema que trabaja con MVC estan compuesto de 3 partes.

Modelo
Vista
Controlador.

El modelo ya aclaramos en otra seccion como crearlo.

Lo que necesitamos ver ahora son los controladores, y las vistas.

* Controllers
Dentro de la carpeta application tenemos por ejemplo el modulo usuarios, este tiene una carpeta con el mismo nombre. Dentro de esa carpeta podemos ver 2 carpetas mas, controllers, y views. Una particularidad es que un modulo no necesariamente tiene que tener un solo controller puede tener mas de uno, en nuestro caso vamos a tener dos. Un indexController.php y un adminController.php, el primero se va a encargar de procesar todas las acciones dentro del frontend, y el otro, todo lo referente al backend. Pero podemos hacerlo en mas controller, o en uno solo, esto es particular de cada uno.

Nuestros controllers tienen que heredar Zend_Controller_Action, pero como hicimos con los modelos podemos heredar una clase intermedia, eso depende de cada uno.

Cada metodo publico (deberian ser los unicos), tiene el posfijo Action, el cual representa que eso es una accion. Un ejemplo de un controller seria el siguiente.


class Usuarios extends Zend_Db_Table
{
public static function getUsuarios()
{
$view->usuarios = Usuarios::getUsuarios();
$this->render();
}
public function addAction()
{
$this->render();
}
}
?>


Si en la url no especificamos un action, el metodo por default es index. En nuestro ejemplo va a buscar al modelo de usuarios, todos los registros y los va a enviar a la vista a traves de $this->view, esto va a crear una variable $this->usuarios en nuestra vista.


* Vistas.
La carpeta de vistas esta dividida inicialmente en tres partes, filters, helpers, y scripts, en filters, vamos a guardar los filters (cuak), si queremos saber mas sobre esto podemos ir a esta url. http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.definition
En helpers van todos nuestros helpers para ese modulo especifico, si es un helper generico podemos ubicarlo dentro de nuestras librerias.
La carpeta scripts, contiene en nuestro caso tres carpetas admin, index y error. Esto se debe a que usamos dos controllers, si tuvieramos uno solo tendriamos index y error solamente.

Dentro de index para seguir con nuestro ejemplo tenemos varios archivos .phtml, esta extension determina que es una vista. Si nosotros tenemos el metodo index en nuestro controller, debemos tener una vista index.phtml, lo mismo para add, add.phtml. Esto ZF lo interpreta automaticamente, pero tambien podemos decirle que ejecute una vista en particular, o que no ejecute ninguna.

un ejemplo de index.phtml seria.














Esto nos va a mostrar todos los registros devueltos por el modelo.

Creando modelos

A partir de la estructura de directorios que hicimos en el post anterior, vamos a crear nuestros primeros modelos.

Los modelos contienen la logica de negocio, en nuestro caso los modelos estan fuera de los modulos, para evitar la dependencia de un modulo especifico. Esto se debe a que un modulo, puede usar varios modelos, y no su modelo en particular.

En mi caso los modelos heredan la clase Zend_Db_Table, pero podemos incluir una clase propia intermedia. Eso es totalmente configurable.

Los metodos publicos de los modelos son estaticos e instancian a la clase, esto se hace para que se puedan acceder desde cualquier lado del sistema, sin la necesidad de instanciar la clase, y si usamos Zend Studio for Eclipse, al escribir el nombre de la clase, por ejemplo Usuarios:: nuestro IDE nos muestra el listado de metodos publicos.

una clase modelo puede tener la siguiente estructura





class Usuarios extends Zend_Db_Table
{
protected $_name = 'usuarios';
public static function getUsuarios()
{
$usuarios = new Usuarios ();
return $usuarios->fetchAll();
}
}
?>


Para llamar al metodo getUsuarios desde cualquier parte del sistema podemos hacer Usuarios::getUsuarios(); y nos va a devolver los registros de la tabla usuarios.

Estructura basica para trabajar con Zend Framework

Zend Framework es un conjunto de componentes que nos facilitan la resolucion de problemas comunes, el acceso a una base de datos, la administracion de permisos, la creacion de WS, el manejo de OpenId, envio de mails, creacion de pdf, etc. En cada version del framework se agregan mas componentes.

El framework trabaja con MVC pero no obliga a hacerlo, podemos usar Zend Framework como libreria de una aplicacion sin ser MVC, pero este cuenta con componentes para el Manejo de MVC, Zend_View, y Zend_Controller.

En nuestra estructura de es directorios vamos a tener el siguiente esquema

* Application: aca van todos los modulos y funcionalidades del sistema. Dentro de cada modulo, dos carpetas, controllers y views. Los modelos estan fuera de application, y dentro de la raiz del proyecto, el motivo es que esten dentro del path del sistema, asi pueden ser llamados desde cualquier punto del sistema, gracias al autoload de ZF.

* Config: incluye los .ini de configuracion. Configuracion de Base de datos, o configuraciones varias.

* HTML: Esta es la unica carpeta de acceso publico, cualquiera agregando la url puede acceder desde el navegador. Esta carpeta esta dividida en varios items. Inicialmente, tenemos una carpeta clientScripts donde esta todo nuestros js, en scripts, tenemos una carpeta layout, con todos los layout del sistema, una carpeta images, y otra styles.

* Library: Aca esta la libreria de Zend, y podemos agregar una carpeta con nuestras librerias.

* Models: Todos los modelos. Los metodos publicos son estaticos, para que no sea necesario instanciar la clase para usarlos.

* Sql: Aca esta los dump de la base de datos.

Y por ultimo tenemos nuestro bootstrap, index.php , que se encarga de ejecutar los modulos, y la configuracion basica del sistema, ademas de cargar las librerias necesarias. El .htacces redirecciona todas las peticiones al index.php.


Otros articulos:
Estructura de directorios - Blog de Zsamer

miércoles, 25 de junio de 2008

Deshabilitar Zend_Layout para un controller

Siguiendo con el tema el componente Zend_Layout puede surgirnos la necesidad que a cierto controller no cargarle el layout.
Obviamente esto es posible. Con solo agregar la siguiente linea en el Action del controller que queremos deshabilitar el layout es suficiente.



$this->_helper->layout->disableLayout();


Mas Info

Zend_Layout, tener mas de un layout en nuestro sistema.

Generalmente para los sistemas web tenemos dos partes, frontend (la parte del usuario), y un backend. Es probable que compartan el diseño, pero el backend tiende a ser mas simple que el frontend, para diferenciarlo, y que no sea tan molesto el trabajo diario, debido al exceso de contenido.

Si leyeron la guia de implementación de Zend_Layout, de zsamer en su blog. Solo nos muestra un solo layout.

Pero si nosotros queremos tener mas de un layout lo podemos configurar muy facilmente.

Primero en el bootstrap configuramos los layout que va a usar nuestro sistema, y en que ruta vamos a tenerlo. En mi caso los guardo en /html/scripts/layout, pero eso es relativo a cada uno.

Agregamos el siguiente código.


$options = array(
'layout' => 'Frontend',
'layout' => 'Backend',
'layoutPath' => 'html/scripts/layout/'
);
Zend_Layout::startMvc($options);


Con esto ya tenemos configurado nuestro Bootstrap con los dos layout Frontend, y Backend, tengan en cuenta que Frontend va a quedar como layout default. Dentro de la carpeta html/scripts/layout, debe haber un frontend.phtml, y un backend.phtml con la estructura de nuestra web.

Una vez creado nuestros archivos desde el controller que vamos a ejecutar backend o un layout que no sea el default, antes de ejecutar el render, seteamos el layout que queremos que se muestre
en nuestro caso backend.

La linea que debemos agregar es la siguiente
$this->_helper->layout->setLayout('backend');

Y listo, si ejecutamos nuestra aplicacion vamos a poder ver como conviven pacíficamente varios layouts. ;)


Mas info:
Manual Oficial
Entrada en el blog de zsamer
Wikibook

martes, 24 de junio de 2008

Utilizando Zend_Feed

Estoy haciendo el desarrollo de un portal de noticias, que dentro de poco voy a liberar una primer version. Hoy me tocaba la tarea de hacer la suscripcion Atom de las noticias del portal para lo cual use Zend_Feed.

Voy a mostrar como quedo mi ejemplo.

En un primer paso arme el controller para el modulo Rss.


class Rss_IndexController extends Me_Generic_Controller
{
public function indexAction ()
{
Zend_Loader::loadClass('Zend_Feed');
Zend_feed::importArray(Rss::getArray(), 'atom')->send();
$this->_helper->viewRenderer->setNoRender();
}
}
?>


Tenemos por ahora solo un metodo index, desde ese index cargamos Zend_Feed con Zend_loader, despues vamos a obtener del modelo Rss un array con el contenido que va a tener nuestro Atom. Para procesar ese Array vamos a usar Zend_Feed::importArray, el cual convierte el array en un xml valido. Lo otro que vamos a hacer es evitar que cargue la vista del modulo.

Por ahora va muy simple. Ahora vamos al modelo.



class Rss extends Zend_Db_Table
{
const CANT_NOTICIAS = '20';
const CHARSET = 'utf-8';
public static function getArray ()
{
$noticias = Noticias::getXCantidad(self::CANT_NOTICIAS);
$datos['title'] = 'Portal de noticias';
$datos['link'] = 'http://localhost/diario/rss/';
$datos['lastUpdate'] = Fechas::getMkFromFechaHora(Noticias::getLastDate());
$datos['charset'] = self::CHARSET;
$i = 0;
foreach ($noticias as $noticia) {
$datos['entries'][$i]['title'] = utf8_encode($noticia->titulo);
$datos['entries'][$i]['link'] = 'http://localhost/diario/noticias/?noticia=' . $noticia->id_noticia;
$datos['entries'][$i]['description'] = utf8_encode($noticia->texto_portada);
$datos['entries'][$i]['content'] = utf8_encode($noticia->texto);
$datos['entries'][$i]['lastUpdate'] = Fechas::getMkFromFechaHora($noticia->aud_fecha_hora_ingreso);
++ $i;
}
return $datos;
}
}
?>



Por ahora tambien va a tener un metodo solo, getArray en la primeras lineas traemos desde el modelo de Noticias las ultimas 20 noticias cargadas y activas. Declaramos un titulo a nuestro feed, que va a ser el titulo del portal de noticias, agregamos el link al feed, la fecha de la ultima actualizacion que va a estar con formato mktime y el charset, en nuestro ejemplo sera utf-8.

Con el objeto con las ultimas veinte noticias, vamos a iterarlos, para conseguir el detalle de cada noticia. Y vamos a completar los datos correspondientes, y por ultimo vamos a devolver el array generado.

Cuando le devolvemos al controller el array, este lo transforma en un Atom valido.

Cuando ejecutamos.

http://www.dominio.com/rss


nos va mostrar el Atom de las ultimas 20 noticias ;)




Pero falta algo, como hacer que desde el home nos aparezca el icono de rss y nos permita agregar en nuestro feed con la url http://www.dominio.com/ como hacemos con cualquier blog.

Muy facil
Dentro del head de nuestro html, agregamos la siguiente linea

1

2 <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $this->baseUrl;?>/rss/" />



en href ponemos la url a nuestro feed.



asi nos quedaria

Facil, no?

Otros links

Syndicate content with Zend Framework Zend_Feed classes

Internet Explorer en Linux

Si necesitamos por esas cosas de la vida ver una web con IE podemos instalar IEs4Linux. Este software es open source, si queres podes colaborar vía paypal.

El proceso de instalación es muy fácil, y esta disponible una guia para las distribuciones mas importantes.

Estuve probando esta aplicacion para un error especifico con IE6, y el error lo genero perfectamente :( .

En la imagen se puede ver el programa corriendo en un Ubuntu 8.04, además marco un problema con el interlineado que solo aparece con Explorer :@.

jueves, 19 de junio de 2008

Zend Framework y el Patron MVC

En un post anterior vimos como trabajar con MVC, pero en esta oportunidad vamos a ver como trabajar con MVC con Zend Framework.

El documento esta en ingles, pero lo suficiente mente claro ;)


Programacion Orientada a Objetos II

Ampliando la documentacion del post anterior de POO. Voy a compartirles un manual escrito por la gente de desarrollo web muy completo sobre PHP5.


Creacion de scripts en linux

Encontre este interesante articulo creado por jcmoreno. Un usuario de slideshare, que nos explica como crear scripts avanzados en Linux


Programacion Orientada a Objetos

No seremos programadores Zend sino programamos orientado a objetos. En este documento vamos a tener una introduccion a los conceptos basicos de la POO. Y nos puede servir de guia para nuestros primeros pasos.

Tambien es importante que tengan como referencia la web oficial de PHP, y su capitulo de PHP5

Python para todos

La gente de mundo geek realizo un manual de Python, titulado "Python para todos".
Es un manual muy bien escrito y claro. Es una excelente guia para aprender a usar Python y tenerlo como libro de referencia.

El libro fue liberado bajo la licencia Creative Common. Así que sientanse libre de copiarlo las veces que lo necesiten.

El temario que vamos a encontrar es el siguiente.

  • Tipos básicos
  • Control de flujo
  • Funciones
  • Orientación a objetos
  • Programación funcional
  • Excepciones
  • Módulos y paquetes
  • Entrada / Salida
  • Expresiones regulares
  • Sockets
  • Interacción con webs
  • Threads
  • Serialización de objetos


Los que quieran descargarse el libro o saber mas al respecto pueden visitar la web de Mundo Geek en la sección del libro. O pueden usar la descarga directa que habilite hoy.

martes, 17 de junio de 2008

Zend Studio for Eclipse 6.01.

Ya tenemos la nueva versión de Zend Studio para "comprar".

Al parecer solucionaron los problemas de cuelgues habituales en ZS.

Lo mas destacado de los cambios son.

- Soporte para Zend_Layout.
- Zend Framework 1.5.2
- Paquete de lenguajes para Alemán, Italiano y Danés (para cuando el español? )
- Supuestamente solucionaron los problemas de cuelgues y consumo excesivo de memoria. Para solucionar esto en la versión 5 tenia que deshabilitar los builders, y Validation de cada proyecto.
- Refactoring: Ahora además de hacer refactoring rename, también podemos mover y organizar includes


Pero en definitiva, después de leer todo esto me baje el trial y lo probé un poco.

Esta es la pantalla que aparece mientras carga el IDE.




Una vez cargado lo primero que hice fue modificar mi workspaces a /var/www. Cuando se reinicio aparecieron los proyectos que ya tenia cargado en la versión anterior.

Lo segundo a configurar es la forma en que nos formatea el código, y para eso fui a windows->preferences->php->formatter y elegí la opción Zend Framework en Active Profile. Acá también podemos configurar nuestros propios standar de código (no recomendable).



Cuando quise entrar en Code Gallery, el sistema colapso y tuve que cerrarlo forzosamente.

Como ven en la imagen el consumo de memoria era bastante alto.




La realidad que el resto anda muy bien, podemos ver al eterno builder trabajando más rápido.




Y las nuevas opciones de refactoring en el menú contextual.



Zend Studio es el IDE mas completo y profesional para PHP5 y su integracion con Zend Framework. Pero todavía le falta algunos puntos como la optimizacion de recursos.

Lo probé en un Pentium 4 2.8 ghz 1gb de memoria ram con Ubuntu 8.04


Si queres saber mas sobre esta versión entra en este link

miércoles, 11 de junio de 2008

Utilizando componentes ZF individualmente

Una de las ventajas que tiene Zend Framework sobre otros, es que podemos usar sus componentes sin necesidad de migrar todo el sistema al framework, de esta manerapodríamos incluir en nuestro proyecto solo el componente de Base de datos Zend_Db. Lo único que tendríamos que hacer es en nuestra raíz del sistema crear una carpeta Zend que contenga las librerías que necesitemos para ese componente, es recomendable descargar todas las librerías.

Un ejemplo muy simple, para conectarnos en una base local, e insertar datos seria este

1  
<?php
2  
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
3  
$db = new Zend_Db_Adapter_Pdo_Mysql(array(
4              
'host'     => 'localhost',
5              
'username' => 'desarrollo',
6              
'password' => 'jsdlk123o',
7              
'dbname'   => 'trueque'
8          
));
9  
10  
$datos = array (                   
11                      
'nombre' => 'Josemir',       
12                      
'estado' => '1',
13      );
14  
$db->insert 'nombre_de_la_tabla'$datos );
15  
?>





Y listo. De la misma manera que usamos insert, podemos hacerlo con cualquiera de los otros metodos.

No solo es util para Zend_Db, sino para cualquiera de los demas componentes. En algunos casos es necesario cargar anteriormente el componente Zend_Loader.

Esto es util cuando queremos ir migrando de a poco nuestros sistemas.

lunes, 9 de junio de 2008

Errores tipicos programando POO en PHP5

Preparando la clase de PHP Orientada a objetos que empiezo a dictar hoy, me encontre con estos 10 tipicos errores, Programando PHP Orientado a Objetos. Muchos puntos parecen basicos pero increiblemente se ven a menudo.

El articulo fue extraido de Cristal Labs

1. Usar variables globales dentro las clases: una de las ventajas más importantes de la programación orientada a objetos es la reusabilidad de los códigos. Al usar variables globales ($_GET, $_SESSION, $_POST, $_COOKIE, global) dentro de las clases, esta se ve comprometida considerablemente. La razón es que todos los proyectos no tienen las mismas variables globales.

2. Mezclar código HTML en la definición de las clases: es una de las cosas que me sorprenden cada vez que la veo. Es inaceptable que esto se le haya ocurrido a algunos. Al mezclar HTML en el código PHP se compromete la reusabilidad de la clase, no todos los proyectos tienen el mismo código HTML.

3. Imprimir salida (echo) dentro de las clases: aunque esto se parece a la anterior, me refiero a los echo o similares dentro de los métodos. Si una clase no está destinada para emitir salida no lo debe hacer. Para eso muchos utilizamos sistemas de plantillas.

4. Identificadores de clases, métodos y propiedades sin sentido: un identificador siempre debe ser lo más descriptivo posible. A muchos le gusta usar identificadores increíblemente irrelacionados con su propósito. Esto compromete enormemente la lectura de un código. (Mira las reglas de codificación en PHP)

5. Mezclar uso de versiones de php en una misma clase: a partir de la versión 5 de PHP, la programación orientada a objetos se puede implementar de una manera más formal, pues se introdujo los modificadores de visibilidad public, private, protected. Aparte de que se pueden crear clases de alto nivel (clase Abstractas) y métodos abstractos con la palabra reservada abstract. También se pueden definir los métodos y propiedades estáticas formalmente con la palabra reservada static. Mezclar la programación orientada a objetos en PHP 4 (donde todo era publico) con la de PHP 5 hace un código “sucio”. Consejo: elige una de las versiones y programa para ella.

6. Más de una clase en un mismo archivo: definir distintas clases en un mismo archivo es otra de las cosas que no se debe hacer. Las clase se han de componer lo más reusables posible y si puedes nombrar al archivo con el nombre de la clase muchísimo mejor. Sigue el camino de los grandes lenguajes como: Actionscript, Asp.net, Java entre otros.

7. No hacer pruebas unitarias a las clases: al terminar de codificar una clase recuerda de hacer pruebas unitarias para asegurar el correcto funcionamiento de clase. Esto es simplemente probar todos los posibles caminos que pueda tomar un estado (propiedad), parámetro de método, etc para que la clase no “explote”.

8. Todos los métodos y las propiedades publicas en una clase de PHP 5: los programadores novatos cometen el error de definir todos los métodos y propiedades como públicos, por desconocer las ventajas de los modificadores visibilidad. En PHP este es un problema grave porque no hay tipeado de datos. El problema de las propiedades públicas es que no podemos controlar de manera fácil el tipo de datos que contiene por lo que nuestra clase pudiera explotar por un tipo de dato inesperado. Si no estas seguro de que visibilidad le debes poner a una propiedad hazla privada. Valida los tipos de datos de las propiedades al menos de una manera básica.

9. Duplicación de métodos para ocultar falla de lógica: A diferencia de otros lenguajes como Java y C++, PHP no admite la sobrecarga de métodos. Al menos no de la manera tradicional. Esto, sin embargo, no es excusa para duplicar métodos sólo porque un dato cambia para la operación que éste realiza.

10. Variables de configuración dentro de las clases: Los datos de configuración de base de datos, web services y otros deben ir en un archivo de configuración aparte, NO dentro de la clases que hacen uso de estas. Aunque se admite en clases que sea exclusivamente para ello.


A estos puntos yo añadiria los siguientes

A- No usar clases genericas, que incluyan metodos o propiedades que no tengan nada que ver con el identificador

B- No declarar las propiedades como publicas, para eso tenemos los metodos getter y setter. Cada objeto y solo ese objeto debe saber sus propiedades.

Y seguramente me estoy olvidando de alguna más

martes, 3 de junio de 2008

Ruby Facíl

Ruby Facíl es un libro con licencia creative commons creado por Diego F. Guillém Nakamura, el libro es bastante simple y claro si queremos empezar a aprender Ruby, esta edicion no habla de Rails, el framework que hizo famoso a Ruby, pero es una buena base.