Disponible material de la presentación sobre "El Estado del Arte y PHP5"

Hace unos minutos he dejado disponible el material usado para la presentación de la charla "El Estado del Arte y PHP5" efectuada en el evento Debian Day (organizado por el grupo Debian Uruguay).

Se puede consultar desde la web o bajarla directamente. El material fue complementado con un poco más de descripciones y conceptos, y todos los enlaces a las fuentes.

La charla se centró en tratar de transmitir cual es el estado actual de la Web, de donde venimos y hacia donde vamos, donde PHP es una herramienta más que nos puede servir para cumplir con nuestros objetivos. Para no ser menos, se usó una herramienta que se apoya en estándares web: S5 (basada en html y javascripts).

Detalle importante sobre la herramienta seleccionada: lo más destacable es que los buscadores podrán indexar el contenido de la presentación y ser encontrada fácilmente. Lo contrario a si fuera un documento pdf, word, powerpoint, o simplemente una web Flash.

Si bajan los fuentes podrán darse cuenta como es que trabaja con solo editar el index.html.

Cualquier duda, corrección o ampliación, con gusto contestaré los correos que me envíen o los comentarios que escriban al pié de este artículo ;-)

Próximamente estará disponible información relacionada con el evento Debian Day

He estado un poco complicado y estoy más lento que de costumbre para contestar los correos sobre el tema de la charla que ofrecí en el evento.

A su vez, se han generado varios intercambios de opiniones, tanto en el artículo de este blog sobre el evento como en blogs de personas que lo presenciaron (hay para todos los gustos, eso es bueno): ganimatux, mark3l, varrojo, Christian Serrón, etc.

Una de mis sugerencias hacia el grupo Debian Uruguay fue que no desaprovecharan la oportunidad para preservar los contenidos de las mismas, tanto para las personas que no pudieron ir, como para las personas que están fuera del país y que les interesa el tema, o directamente, como fuente de consulta futura.

Viviendo en un mundo cada vez más interconectado, donde tenemos en nuestras manos poderosas herramientas de comunicación con solo usar un poco de imaginación (grabar un audio en formato digital), sería un pecado perder todo lo que se ha hecho y la oportunidad de llegar a más personas.

Parece que el audio no ha quedado grabado, y que probablemente exista una grabación "analógica" de alguna charla. Si esto no se pudiera recuperar, veré de compensar a la gente que no pudo participar y grabar:
  • un podcast en solitario, tratando de volver a contar las ideas que quería transmitir, siguiendo la línea de la presentación proyectada.
  • un podcast en conjunto, tratando de discutir el tema y recordar los sucesos que se dieron en la charla (interrupciones, discusiones, opiniones encontradas, etc).
Lo primero es más probable que lo segundo, pero bueno, estoy viendo que me confirmen si realmente no quedó nada registrado (además, sería imposible reproducir todo lo que sucedió durante la misma ;-) ).

Con respecto al material de la presentación

No lo he dejado aún disponible porque quiero completar los datos que faltan (principalmente enlaces) para que sirva de guía y permita acceder a toda la información en "formato más digerible" sobre lo que presenté en la charla.

Creo que está de más decir que estoy a las órdenes para cualquier consulta, duda, o queja de la charla ;-), tanto en mis blogs como en mi correo personal.

Dentro de poco estaré agregando más material sobre la "polémica charla" que tuve el honor de dar.

Material disponible

Por lo pronto ya están las fotos que sacamos en el evento en mi cuenta de flickr.com con el tag debianday (en cada imagen coloqué comentarios, y ustedes pueden dejar los suyos) y mi lista de enlaces sugeridos sobre PHP y concretamente, sobre PHP5.

PD: que complicado es ser "disruptivo" en este país ;-)

Invitado a dar una charla sobre PHP5 en "Debian Day Uruguay"

Mi amigo Marcello Farias me invitó a dar una charla sobre PHP5 en el evento que está organizando con sus colegas: el Debian Day Uruguay .

A nivel mundial es costumbre festejar muchas fechas importantes para el mundo del Software Libre, generalmente, haciendo eventos y charlas sobre temas relacionados.

En este caso, el Debian Day Uruguay, festeja la creación de la distribución GNU/Linux por excelencia, la plataforma de los geeks y "talibanes del Software Libre", la más pura de las puras, donde ningún animal fue lastimado para su creación ni utilizado algún "código privativo" ni maligno.

Marcello ha hecho un clara introducción al tema en su blog, y la lista de los oradores y los temas es realmente interesante (y la mía desentona un poco, pero bueno, alguien tiene que desarrollar sobre la plataforma libre ;-).

Desde ya están todos invitados.

Curso en Universidad ORT: "Desarrollo de Sistemas Web con PHP 5" (4 meses)


La Universidad ORT está nuevamente publicitando en estos días (mailing, web, prensa) el curso que estaré dictando con el nombre de "Desarrollo de Sistemas Web con PHP 5" (aunque pueden encontrar referencias con otros nombres, como "Programación PHP5", "Programación de Páginas Web con PHP", etc), parte del grupo considerado de "Actualización Profesional".

Aclaración: Digo "nuevamente" porque a pesar que este curso ya lo he dictado directamente en empresas, en ORT el primer período de inscripción (24 de abril) lamentablemente no llenó el cúpo mínimo de alumnos, por lo cual esta es la segunda vez que se publicita. Esperamos que en esta oportunidad llegue con más tiempo y a más gente.

La temática del mismo y la metodología del dictado será completamente diferente a los cursos tradicionales que se pueden encontrar en la plaza local, que se basan exclusivamente en PHP4 (donde la prioridad es conocer exclusivamente el lenguaje y no superar la programación a nivel de scripting).

Para este curso me fijaré como meta formar "Desarrolladores de Sistemas Web", tratando de no caer en los "lugares comunes" de los cursos tradicionales sobre la materia:
  • Evitando el estereotipo clásico de "Programador PHP", orientado explícitamente al lenguaje de programación, donde solo se abordan recetas elaboradas con la experiencia del docente de turno y se termina desconociendo todo el proceso formal de desarrollo de software y las metodologías existentes.
  • Evitando el perfil de "Diseñador PHP", orientado al diseño gráfico con algo de programación, donde el común denominador es la ausencia completa de conceptos claros sobre diseño de sistemas o directamente de programación.
  • Erradicando el uso del "paradigma estructurado" que impide aprovechar los beneficios del "nuevo paradigma" (que ya tiene muchos años) que mejora ostensiblemente los tiempos de mantenimientos de sistemas y el reaprovechamiento de componentes ya desarrollados.
  • Erradicando la "programación estructurada con uso de objetos", que no es lo mismo que decir "Desarrollo 100% Orientado a Objetos", con uso y entendimiento de herramientas de nivel superior, como UML, Patrones de Diseño, Principios de Diseño, Refactoring, etc.
  • y por sobre todas las cosas, a Desarrollar Sistemas Web, verdaderos desarrollos de software, no código-scripting embebido a código HTML alojado en páginas web, aisladas entre sí.
La idea es fusionar conocimientos desde otras plataformas, como Java y .Net, en conjunto con experiencias profesionales trabajando en proyectos del Estado, empresas privadas y emprendimientos personales.

Desarrollar software en PHP5 no tiene nada que envidiarle a otras plataformas de desarrollo, y los conocimientos que se adquirirán en el curso podrán ser aplicados en cualquier tecnología basada en POO.

Considero que este curso transfiere en 4 meses conocimientos que requieren años recolectar, evaluar, depurar, y por sobre todas las cosas, experiencia real extraída del mercado laboral actual, tanto local como extranjero.

Daremos una recorrida al tan nombrado fenómeno de la Web2.0 y de las últimas tendencias, como el nuevo Zend Framework que se está desarrollando, donde iremos incorporando las últimas novedades que vayan surgiendo en el transcurso del curso.

Quiero hacer un curso que a mi me gustaría participar: quiero "enseñarte a pescar, no a comer de mi mano".

Comienzo: 5 de setiembre de 2006.

Horario: Martes y Jueves de 19:30 a 22:30.


Detalles del curso en la Universidad ORT

"Herencia múltiple en PHP5"

Este es un resumen de conclusiones que se vertieron en una discusión sobre el tema en Foros de Web, donde se plantea la duda de si PHP5 soporta herencia múltiple, lo que termina en una discusión filosófica sobre diseño Orientado a Objetos.

La herencia simple

Es la que tienen todos los lenguajes orientados a objetos: heredamos los atributos de una sola clase padre, lo cual nos permite reutilizar código. Si fuera herencia múltiple, podríamos heredar de más de un padre.

Ejemplo de como se codificaría

La herencia múltiple, si fuera implementada en PHP, se codificaría de la siguiente manera:


class C extends A,B{
// código
}


Donde la clase C hereda atributos y/o métodos de dos clases, A y B.

Por ejemplo, la clase "HombreLobo" puede heredar de la clase "Hombre" y de la clase "Lobo", pero el problema es que se pueden hacer tantas combinaciones que será difícil seguir y mantener un diseño de este tipo. Por eso muchos lenguajes no la implementan, no por un tema técnico, solo por un tema de salvaguardar la integridad del diseño.

¿Se puede hacer o no?

Por lo que he visto en varios lenguajes, la discusión legítima no es "si se puede hacer o no". En muchos casos no se implementa (como en Java, PHP, etc) porque habilitarla es un posible camino al desastre.

Verdaderamente no es problema técnico, o de evolución, es un problema de criterios de diseño "OO".

Herencia múltiple a través de interfaces

De todas formas siempre hay una puerta trasera: hacer herencia múltiple a través de interfaces; pero el sentido es distinto a hacerlo con clases. Las herencias de clases definen el "que son" y las interfaces agrupan clases que definen el "que hacen".

Las interfaces permiten pasar del estilo de diseño "orientado a la implementación" a uno "orientado a la interfaz", donde todas las clases acceden a servicios a través de interfaces que son implementadas por clases concretas. Y al no depender de clases concretas (solo de entidades abstractas) nuestro diseño será más reutilizable que el anterior.

El mayor problema

Los problemas más comunes que puede dar la implementación de herencias múltiples son las "colisiones de nombres" y la "herencia repetida".

Las colisiones se pueden dar cuando las clases empiezan a tener los mismos nombres en los métodos generando la duda de cual método debo usar de las dos clases y la herencia repetida es cuando nuestra clase hereda de dos clases que a sus vez son hijas del mismo padre, por lo cual estemos posiblemente heredando características repetidas.

¿Que sugieren las "Guias de Diseño OO"?

Y ya que estamos del tema "diseño", lo comento: las guías de diseño recomiendan que para una buena jerarquía de herencia:

- Se deben tener no más de 7 (+-2) niveles
- Las jerarquías "gordas y bajas" son síntoma de "poca especialización"
- Las jerarquías "altas y flacas" son síntoma de "excesiva especialización".

¿Si tantas recomendaciones existen para la herencia simple, que queda esperar para la herencia múltiple?

¿Y los grandes libros de Patrones de Diseño?

Hasta yo puedo crear un patrón y usar la herencia múltiple, pero eso no quiere decir que sea la mejor solución a un problema, ni que este pueda aplicarse en otros contextos (la esencia de los patrones).

Tomando como referencia un libro base reconocido mundialmente como es el GOF , donde ninguno de los patrones (de los 23) hacen uso de la herencia múltiple, y tampoco la sugieren, y menos, se quejan de su falta.

Los patrones de diseño son considerados la mejor "receta de cocina" para resolver un problema recurrente, con el mejor diseño posible, donde puede ser aplicado en otros contextos (concepto de patrón: "elemento reutilizable de experiencia y conocimiento").

No he leído hasta el momento en ningún texto que documente principios, sugerencias, guías o buenas prácticas de diseño la recomendación de usar la herencia múltiple. Es más, lo que he visto es todo lo contrario, hacen mucho hincapié en controlar el uso de la herencia simple, llegando a desaconsejar hasta la sobreescritura de los métodos por el hecho de "¿para que heredas si luego sobreescribes el comportamiento?".

Tampoco he leido que exista una discusión importante sobre el tema ni que hubiera una campaña para su uso. Creo que no se discute mucho el hecho de la "no conveniencia" del uso de la herencia múltiple.

Resumen Final

El tema va más allá del lenguaje, el problema no es si un lenguaje lo soporta o no, el problema es si se debe usar o no, y los efectos que pueden causar sobre nuestro diseño y su posterior mantenimiento.

Si observamos la evolución de los lenguajes podremos ver que cada vez se orientan más a seguir las pautas que se dictan en la esfera del diseño, y esto no es para extrañarse, la programación es solo una parte de todo el proceso de desarrollo de software.

Nota al margen: con respecto a mis conclusiones sobre la herencia múltiple, no son de mi exclusiva invención ni se me ocurrieron meditando bajo un manzano... luego de leer muchas opiniones al respecto que apuntaban a tratar el tema como si fuera solo una "evolución", o la visión completamente opuesta, que los nuevos lenguajes "la carecen" (como si estuviéramos hablando de una debilidad) fue que me puse a investigar y a tratar de discernir entre lo subjetivo y lo objetivo.

Y como se concluye en la discusión del foro, los lenguajes son herramientas que se deben ajustar a los criterios de un diseño.

Al final de cuentas, todo es una discusión de diseño OO, aprender a usar una herramienta y a no abusar de las posibilidades de la misma, lo que puede volverla en contra nuestra.

Artículo basado en una discusión originada en Foros del Web

Artículo relacionado

Introducción: Cómo traducir de UML a PHP5 (I)

Estoy viendo muy seguido en foros que frecuento regularmente a muchos programadores que quieren dar "el gran salto" y evolucionar desde la programación estructurada hacia la programación orientada a objetos. El error más común que percibo es la falta completa de conceptos base, seguida de una pobre lectura de ejemplos sintácticos que no ayudan a comprender cómo verdaderamente se usan los objetos y cómo hacer para interactuar con ellos.

Estoy fervientemente convencido que enseñar conceptos de POO sin ayuda de UML es elegir el camino más empinado para el novicio. Cuando de abstracciones se trata, el cerebro trabaja mejor jugando con "imágenes", creando simples representaciones de lo que llamamos objetos y sus relaciones (tema que trataremos en otro artículo).

Bueno, no perdamos más tiempo y solucionemos esta carencia en 6 pasos concretos ;-)


Introducción: Representación de una clase

Una clase se representa con un "rectángulo" dividido en 3 zonas horizontales:
  • La primer zona se utiliza para colocar el nombre de la clase. Por convención los nombres de las clases inician con la primera letra en mayúsculas, y todas en singular (Persona, Cliente, Vendedor, Perro, Fruta, etc)
  • La segunda zona se utiliza para colocar la lista de atributos. Cada atributo iniciará con un símbolo que representará la "visibilidad" del mismo, que podrá ser "público" (+), "privado" (-) o "reservado" (#).
  • La tercer zona se utiliza para colocar los métodos de la clase. Cada método, igual que sucede con los atributos, deberá tener los mismos símbolos de "visibilidad" que se aplican con los atributos.
Se dice que la "zona de atributos" representa el estado actual del objeto (que cambiará según los valores que pueda tener en un momento dado) y la "zona de métodos" el comportamiento del mismo (dice qué puede hacer, qué se puede cambiar del mismo, qué se le puede preguntar, etc), configurando una suerte de "interfaz" que permitirá que otros objetos puedan interactuar con él (los objetos interactúan con otros objetos a través de sus métodos).

En este ejemplo podemos observar además que para cada atributo o método deberemos definir cual será el tipo de valor que manejará (String, Date, Integer, etc), no importando verdaderamente si nuestro lenguaje lo soporta en un 100%.

No hay que olvidar que UML es un lenguaje de modelado que permite comprender los diseños sin tener que llegar a conocer el código, y la traducción no está atada a ningún lenguaje de programación. Si el lenguaje es OO, se puede traducir, y tal vez, algunos detalles menores queden por el camino, pero que no debería afectar al concepto general de lo que se quiere transmitir.

Por ejemplo, PHP es un lenguaje de "tipado dinámico" (o lo opuesto a decir "tipado fuerte") donde según la asignación de valores (o su contexto de uso) define el tipo de la variable. Para el caso de la traducción del UML, cada vez que veamos el "tipo", este dato nos servirá como documentación sobre qué información manejaremos internamente, pero no se traducirá en código explícito (porque el lenguaje no lo provee).

Nota: por eso muchos critican a PHP en general. Al no tener un "tipado fuerte" no lo consideran un lenguaje orientado a objetos "robusto" (al existir menos controles sobre los valores que manejan las variables). Según el autor de PHP, esto es una ventaja del lenguaje -la flexibilidad- y juega en favor de los programadores, no en contra.

Paso 1) "Nombre del archivo"

Normalmente usamos un nombre seguido de la extensión: prueba.php. En el caso de los objetos, hay muchas opiniones al respecto. La mayoría de los autores sugiere diferenciar un archivo que define una clase de un archivo que usa varias clases predefinidas.

He visto autores que usan la siguiente nomenclatura: class.NombreDeLaClase.php.

En mi caso, yo siempre me sentí más cómodo usando NombreDeLaClase.class.php y así sigo manteniendo la estrategia de no alejarme mucho de Java para contar con un modelo de referencia para poder aprender de él.

La única ventaja que encuentro en la primera opción es que si listamos todos los archivos de un directorio, todos los que empiecen con "class." estarán juntos.

Para seguir el ejemplo, mi ejemplo, usaremos: Persona.class.php

Paso 2) "Definir la clase"

Aquí debemos ceñirnos a la sintaxis del lenguaje de turno al cual queremos convertir desde un diagrama UML. En nuestro caso, es PHP5, por lo cual solo debemos ir hasta el manual, buscar la parte donde hablan de creación de clases y hacer la siguiente conversión mecánica.

Nota: si usamos Eclipse como IDE para desarrollar, al momento de decirle "crear nuevo archivo php" y colocarle de nombre ".class.php", nos arma un esqueleto más completo de forma totalmente automática ;-)

Paso 3) "Definir los atributos"

Si ya tenemos el esqueleto principal, solo debemos leer uno a uno los atributos del UML y pasarlos a código casi de forma directa:
Como comentaba, no tenemos que preocuparnos de no disponer de un "tipado fuerte" (como sucede con Java) que nos obligue a escribir en la definición de atributos de que tipo son.
Podemos aplicar algunas "sutilezas" pero que en realidad no aportan mucho valor:

private $nombre="";

Con esta asignación estamos diciendo que el atributo es de tipo String.

En este caso, y para PHP, el tipado en el UML nos aporta información extra para la documentación de nuestro sistema (por lo cual no hay que obviarla a la hora de diseñar, aunque nuestro lenguaje no lo soporte explícitamente).

Paso 4) "Definir los métodos"

Siguiendo el mismo razonamiento que el usado en el caso anterior con los atributos, los métodos deben definir también su visibilidad:

Paso 5) "Definir un constructor"

Generalmente, aunque esto es flexible, en un diagrama UML que representa una clase no hace falta agregar como método el propio constructor de la clase; en sí, se sobreentiende que constará de uno y no aportaría nada nuevo a la documentación del diseño (de la misma forma que sucedería con los métodos "getter" y "setter", que hablaremos en otro artículo).

Como los atributos son "privados" (no se tiene acceso a los mismos desde fuera de la clase) para poder asignarles valores iniciales en el momento justo de la creación, deberemos crear un método constructor:

Recibimos los 3 parámetros desde el constructor y luego los asignamos a los atributos de la clase.

Este método se ejecuta "automáticamente" cuando hacemos un "new" para crear una instancia a partir de la clase (que se ve en el próximo paso).

Paso 6) "Probarlo"

Creamos la clase, usando el constructor, para luego usar un método del objeto.


Este ejemplo, en realidad, no imprimirá la edad del "vendedor", puesto que para simplificar el ejemplo y no agregar "ruido" al código (¡si habré visto libros con códigos innecesariamente complejos!), no está implementada la fórmula para calcular la edad a partir de la fecha de nacimiento ingresada (pero creo que la idea general se entiende).


Resumen final

Fuimos viendo paso a paso como se traduce a PHP5 la representación en UML de una clase definida en el contexto de la programación orientada a objetos. Conocimos las 3 zonas que definen una clase (nombre, atributos y métodos), la visibilidad (métodos y atributos), el constructor (para definir un comportamiento al crear el objeto) y finalmente, como probar la clase creada.

¿Dudas o sugerencias? Bienvenidas en los comentarios de este artículo ;-)

Artículo basado en una respuesta que di en Foros del Web

Actualización (27/07/2006): las capturas de pantallas están hechas sobre las siguientes herramientas: la versión "comunitaria" (gratuita) de Poseidon (basado en el proyecto libre ArgoUML) y Eclipse (usando el paquete EasyEclipse for PHP).

Conceptos: "Separar el código de la capa de presentación"

Muchas veces me han hecho esta pregunta, y muchas veces la he leído en foros de discusión, lo cual escribir repetidamente la respuesta se me hace un poco cansador.

En los próximos artículos voy a ir documentando estos casos, así cuando me lo vuelvan a preguntar, los remito aquí ;-)

En la programación por capas siempre debemos separar nuestro sistema en más de una "capa", donde por un lado tendremos una capa con la responsabilidad de implementar la "lógica" de nuestro sistema, y separar en otras capas las demás responsabilidades: capa de persistencia, de presentación (también llamada "interfaz" o "gui"), etc.

Capa de Lógica

A la capa de lógica también se le puede conocer con distintos nombres ("lógica de negocios", "dominio del problema", etc) y no necesariamente es una, puede estar compuesta por varias con distintos niveles de complejidad dentro (es decir, una capa que internamente tiene varias capas). Aquí es donde verdaderamente resolvemos el problema concreto, separado de los demás detalles que conforman nuestro sistema (que serían las otras capas, o las otras responsabilidades).

"Bajo Acoplamiento" versus "Reacción en Cadena"

Conceptualmente, lo único que debemos hacer es tener "separada" las responsabilidades en fuentes distintos, o en conjuntos de fuentes distintos (dependiendo el tamaño de nuestro sistema). Es decir, un conjunto de fuentes solo trabajarán la parte de la "lógica" donde tendrán prohibido hacer algo de la "presentación", y viceversa. Cada uno tendrá un punto de contacto que podrán ser datos pasados por parámetros, un objeto parámetro, una capa de "fachada", etc.

Aplicar cualquier estrategia que nos evite que nuestros subsistemas (o capas) estén "altamente acoplados", evitando que cada uno conozca detalles internos del otro para que cuando uno cambie no sea afectado en cadena la integridad de nuestro sistema, situación que nos obligará a modificar muchos fuentes para solucionarlo.

Un ejemplo práctico

En la capa de lógica tengo los fuentes que crean un resumen de cuenta de un cliente; arma la información necesaria a partir de los datos que fueron solicitados oportunamente a la capa de persistencia, para luego de terminada la tarea, cederle la responsabilidad a la capa de presentación para que -a partir de los datos ya procesados- armar una pantalla con columnas y colores, ubicando los datos donde corresponden.

La lógica no debe desplegar nada en pantalla ni tener acceso directo a la base de datos.

Su punto de contacto con los datos debe ser una clase que representará a la capa correspondiente a la cual le pedimos los datos con la mínima cantidad de información posible. No tendría sentido tener nuestro sistema separado en capas y que la lógica envíe sentencias SQL, lo que significaría que nuestra capa conoce demasiados detalles internos de otra capa, rompiendo el encapsulamiento. De la misma forma, tendríamos otra clase que representará a la "capa de presentación" que se encargará de recibir los datos y que nuestra "lógica" se desentenderá posteriormente (ya no será su responsabilidad).

¿PHP lo soporta?

Se puede hacer perfectamente con PHP, pero el tema es más simple de lo que parece: no debemos tener todo entreverado en los mismos fuentes, debemos ser ordenados y metódicos, separar cada objeto según su responsabilidad, y colocarlos en "contenedores" distintos.

Una forma de hacerlo es a través de herramientas, como Smarty, que permite trabajar separadamente tu código (la lógica) del código html (la presentación), donde dispondremos de un lenguaje propio para resolver problemas de la interfaz, facilitando la separación de capas.

Otra forma de hacer es con las propias "herramientas" que nos debería proveer el lenguaje (como sucede con Java o .Net), que nos facilitaría enormemente la administración y uso de las capas, tema tratado oportunamente en otro artículo en este blog.

Artículo basado en una respuesta que di en Foros del Web

"Hoja de referencia rápida para el Smarty template engine"

"Smarty es uno de los templates engine (y tal vez un poco más allá) más populares entre los programadores que usan PHP. En somewhere in … colourful moments , publicaron un cheat sheet (hoja de referencia rápida) orientada a diseñadores de plantillas, que pueden encontrar bastante útil: Smarty cheat sheet for template designers."

Más información:

Entradas populares