Programación (PHP) – Patrones de diseño

Los patrones de diseño en ingeniería de software son soluciones reutilizables a problemas comunes que se presentan en el desarrollo de software.

Estos patrones son guías para la estructuración de código y ayudan a mejorar la escalabilidad, mantenibilidad y la calidad general de las aplicaciones.

Se pueden dividir en tres categorías principales:
Patrones Creacionales: Se enfocan en la manera en que se crean los objetos, asegurando que el proceso sea flexible y reutilizable.
Patrones Estructurales: Ayudan a la composición de clases u objetos para formar estructuras más complejas y eficientes.
Patrones de Comportamiento: Se centran en cómo los objetos se comunican e interactúan.

¿Cómo funcionan?

Los patrones de diseño proporcionan un esquema o plan de cómo resolver un problema específico en un contexto particular. Funcionan como una plantilla que podemos adaptar a nuestras necesidades, en lugar de copiar y pegar código. Siempre es importante hacer un buen análisis antes de implementar un patrón para ver si verdaderamente es la solución que necesitamos.

Vamos a comenzar con un patrón que ya hemos visto en clase y lo hemos usado para la conexión a bases de datos, el Patrón Singleton, que es un patrón de diseño creacional. Este patrón garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. Es útil, por ejemplo, en la gestión de conexiones a bases de datos como ya lo hemos mencionado.

<?php
class Singleton {
    private static $instance = null; // La única instancia de la clase
    private $data; // Un atributo de ejemplo

    // Constructor privado para evitar la creación de instancias directas
    private function __construct() {
        $this->data = "Información de la instancia Singleton";
    }

    // Método estático que devuelve la única instancia de la clase
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }

    // Método de ejemplo para obtener los datos
    public function getData() {
        return $this->data;
    }
}

// Ejemplo de uso
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();

// Verificar que ambas instancias sean la misma
echo $singleton1->getData(); // Imprime "Información de la instancia Singleton"
echo ($singleton1 === $singleton2) ? 'Son la misma instancia' : 'Son instancias diferentes';
?>

Explicación del patrón mencionado arriba

Constructor privado: Evita que la clase sea instanciada directamente con new.
Método getInstance(): Comprueba si la instancia ya existe; si no, la crea. Luego devuelve esa única instancia.
Una sola instancia: Cualquier llamada a Singleton::getInstance() siempre devolverá la misma instancia.
Este patrón es útil cuando necesitas controlar un recurso único como un logger o una conexión a la base de datos, evitando múltiples conexiones o instancias innecesarias.

En el desarrollo de aplicaciones web, se utilizan varios patrones de diseño que ayudan a gestionar la complejidad y a organizar el código de manera eficiente. Vamos a ver algunos más que podemos implementar en nuestros proyectos del CTT

MVC (Model-View-Controller)

El patrón MVC es muy popular en el desarrollo web, ya que separa la lógica de la aplicación en tres componentes principales:
Model (Modelo): Maneja la lógica de la aplicación y la interacción con la base de datos.
View (Vista): Representa la interfaz de usuario.
Controller (Controlador): Actúa como un intermediario entre el modelo y la vista, gestionando la entrada del usuario y la lógica de la aplicación.
Este patrón permite un desarrollo modular y facilita el mantenimiento, ya que las responsabilidades están claramente definidas.

Este ejemplo que vamos a ver a continuación, simulará un sistema básico donde un usuario puede ver una lista de productos. Dividiremos el código en los componentes Modelo, Vista y Controlador.

Modelo (ProductModel.php)

<?php
class ProductModel {
    private $products = [
        ["id" => 1, "name" => "Producto 1", "price" => 100],
        ["id" => 2, "name" => "Producto 2", "price" => 150],
        ["id" => 3, "name" => "Producto 3", "price" => 200],
    ];

    public function getProducts() {
        return $this->products;
    }
}
?>

Vista (ProductView.php)

<?php
class ProductView {
    public function render($products) {
        echo "<h1>Lista de Productos</h1>";
        echo "<ul>";
        foreach ($products as $product) {
            echo "<li>{$product['name']} - Precio: \${$product['price']}</li>";
        }
        echo "</ul>";
    }
}
?>

Controlador (ProductController.php)

<?php
require_once 'ProductModel.php';
require_once 'ProductView.php';

class ProductController {
    private $model;
    private $view;

    public function __construct() {
        $this->model = new ProductModel();
        $this->view = new ProductView();
    }

    public function showProducts() {
        $products = $this->model->getProducts();
        $this->view->render($products);
    }
}

// Instanciamos el controlador y mostramos los productos
$controller = new ProductController();
$controller->showProducts();
?>

Archivo Principal (index.php)

<?php
require_once 'ProductController.php';

$controller = new ProductController();
$controller->showProducts();
?>

Modelo (ProductModel.php): Contiene un arreglo de productos y un método getProducts() que devuelve los productos.
Vista (ProductView.php): Recibe los datos y los muestra en un formato HTML.
Controlador (ProductController.php): Gestiona la lógica de la aplicación. Solicita los productos al modelo y pasa los datos a la vista para su representación.
Archivo Principal (index.php): Actúa como el punto de entrada para ejecutar la lógica del controlador y mostrar la vista.

Otro ejemplo un poco más profesional con conexión a bases de datos usando MVC lo pueden encontrar en mi repositorio: Ejemplo MVC Con Docker

Deja un comentario

I’m Luis E. Fagúndez

Bienvenidos a mi página web personal. Mi nombre es Luis, me gusta enseñar, programar y tomar litros y litros de café.

En esta web vas a encontrar materiales sobre educación, programación, Gnu/Linux, software libre y mucho más.

Esta web busca brindar información sobre las asignaturas que imparto en DGETP-UTU, así como proyectos personales y otras cosas.

Gracias por ser parte de esta hermosa comunidad.

Formas de contacto