¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. Introducción a los patrones de diseño
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

Introducción a los patrones de diseño

Principios básicos del diseñador de objetos

El estudio de los patrones de diseño nos brinda la oportunidad de recordar algunos de los conceptos fundamentales de la programación orientada a objetos (POO), porque se utilizan de forma intensiva.

Los principios fundamentales de la POO son bien conocidos:

  • la herencia;

  • el encapsulamiento;

  • la abstracción;

  • el polimorfismo.

¿Pero sabría enumerar los diferentes principios SOLID?

1. Los principios SOLID

Estos cinco principios aparecieron en un artículo publicado en el año 2000 que escribió el informático estadounidense Robert C. Martin, apodado afectuosamente «Uncle Bob» («Tío Bob») por la comunidad internacional de desarrolladores.

a. El principio de responsabilidad única

Una clase no debe tener más que una sola responsabilidad (S de Single Responsibility). Estudiemos el código PHP siguiente:

class Logger  
{  
   protected string $tipo;  
     
  
   public function __construct(string $tipo)  
   {  
       if (!in_array(strtolower($tipo), ['archivo', 'bdd'])) {  
           throw new InvalidArgumentException('Tipo no admitido'); 
       }  
  
       $this->tipo = $tipo;  
   }  
  
   public function logEnArchivo(string $nombreArchivo, string  
$dato): void  
   {  
       if ($this->tipo == 'archivo' && is_writable($nombreArchivo)) { 
           // ...  
       }  
   }  
  
   public function logEnBaseDatosSQL(string $cadenaConexion,  
string $dato): void  
   {  
       if ($this->tipo == 'bdd' && !empty($cadenaConexion)) {  
           // ...  
       }  
   }  
} 

Este logger escribe en una base de datos y en un archivo. ¿Por...

Design patterns o patrones de diseño

Los patrones de diseño responden a problemas frecuentes de diseño en el marco de la programación orientada a objetos. Se trata de soluciones reconocidas y probadas cuyo diseño proviene de la experiencia de los programadores experimentados.

Los patrones de diseño de diseño están basados en las buenas prácticas de la programación orientada a objetos; no son inamovibles y es posible adaptarlos según nos convenga, del mismo modo que podemos crear unos nuevos.

Estos design patterns son una herramienta preciada para los diseñadores y desarrolladores que desean crear un código de calidad, pero en ningún caso son imprescindibles para garantizar la robustez del desarrollo de un programa.

Tal vez ya los utiliza sin saberlo y ahora puede hablar de ellos con un vocabulario compartido por toda una comunidad desde hace décadas.

No obstante, hay que tener cuidado con la patternite, esa enfermedad muy expandida que consiste en forzar la utilización de estos preciados aliados en partes del código donde no necesariamente son muy pertinentes (o incluso pueden ser contraproducentes). Cuando descubrí los design patterns, pasé por esa fase de euforia en la que quería utilizar el mayor número posible en un desarrollo que se había convertido en monolítico y que quería reprogramar totalmente. Enseguida...

Descripción de los patrones de diseño

Los patrones de diseño se describen e implementan con ayuda de los siguientes lenguajes:

Los patrones de diseño se describen desde la sección 2 - Patrones de construcción hasta la sección 4 - Patrones de comportamiento. Para cada patrón de diseño se presentan los siguientes elementos:

  • El nombre del patrón de diseño.

  • Su descripción.

  • Un ejemplo describiendo el problema y la solución basada en el patrón de diseño descrito mediante un diagrama de clases UML. En este diagrama, se describe el cuerpo de los métodos utilizando notas en pseudocódigo.

  • La estructura genérica del patrón de diseño, a saber:

  • Su esquema, extraído de cualquier contexto particular, bajo la forma de un diagrama de clases UML.

  • La lista de participantes del patrón de diseño.

  • Las colaboraciones en el patrón de diseño.

  • Los dominios de aplicación del patrón de diseño.

  • Un ejemplo, presentado esta vez bajo la forma de un programa PHP completo. Este programa está desarrollado para utilizarse desde la línea de comandos, por lo tanto, no utiliza una interfaz gráfica sino exclusivamente las entradas/salidas...

Catálogo de patrones de diseño

En este libro se presentan los veintitrés design patterns descritos en el libro de referencia del GoF. Estos patrones de diseño son diversas respuestas a problemas conocidos de la programación orientada a objetos. La lista que sigue no es exhaustiva y es resultado, como hemos explicado, de la experiencia. En este caso presentamos los nombres de los patrones de diseño en inglés y en español, aunque en el resto del libro solo utilizaremos sus nombres en inglés.

  • Abstract Factory (Fábrica abstracta): tiene como objetivo la creación de objetos agrupados en familias sin tener que conocer las clases concretas destinadas a la creación de estos objetos.

  • Builder (Montador): permite separar la construcción de objetos complejos de su implementación de modo que un cliente pueda crear estos objetos complejos con implementaciones diferentes.

  • Factory Method (Fábrica): tiene como objetivo presentar un método abstracto para la creación de un objeto delegando en las subclases concretas la creación efectiva.

  • Prototype (Prototipo): permite crear nuevos objetos por duplicación de objetos existentes llamados prototipos que disponen de la capacidad de clonación.

  • Singleton: permite asegurar que de una clase concreta existe una única instancia en memoria y proporciona un método único que la devuelve....

Organización del catálogo de patrones de diseño

Para organizar el catálogo de design patterns, retomamos la clasificación del GoF que organiza los patrones de diseño según su vocación: construcción, estructuración y comportamiento.

Los patrones de diseño de construcción tienen como objetivo organizar la creación de objetos. Se describen en la parte 2 - Patrones de diseño de construcción. Son un total de cinco: Abstract Factory, Builder, Factory Method, Prototype y Singleton.

Los patrones de diseño de estructuración facilitan la organización de la jerarquía de clases y de sus relaciones. Se describen en la parte 3 - Patrones de diseño de estructuración. Son un total de siete: Adapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy.

Por último, los patrones de comportamiento proporcionan soluciones para organizar las interacciones y para repartir el procesamiento entre los objetos. Se describen en la parte 4 - Patrones de comportamiento. Son un total de once: Chain of responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method y Visitor.

Aspectos específicos de los ejemplos de código PHP

El código que damos como ejemplo en este libro utiliza namespaces y un único archivo de carga automática para el conjunto de los patrones de diseño. Para facilitar la lectura de estos ejemplos, no se ha utilizado ninguna etiqueta phpDocumentor. No obstante, recomendamos encarecidamente emplearlas en el marco de desarrollos profesionales.

Hemos decidido utilizar tipos estrictos para evitar los problemas que puede provocar el tipado dinámico que utiliza por defecto el lenguaje PHP.

La versión de PHP que se ha utilizado para escribir el código de este libro es la 8.0.1. Por último, nótese que el código de los ejemplos respeta las reglas de estilo de la especificación PSR-12. Estas recomendaciones, que pretenden unificar las prácticas de desarrollo en PHP, pueden consultarse en la página siguiente:  https://www.php-fig.org/psr/psr-12/