Sobes.tech
Middle

¿Utiliza patrones de diseño en su práctica?

sobes.tech AI

Respuesta de la IA

Sí, los uso. Ayudan a resolver tareas típicas, mejorar la estructura del código, su legibilidad y mantenibilidad.

Los patrones principales que aplico:

  • Creacionales:
    • Singleton: Para limitar la clase a una sola instancia.
    • Factory Method: Para crear objetos sin especificar la clase concreta.
    • Abstract Factory: Para crear familias de objetos relacionados.
    • Builder: Para crear objetos complejos paso a paso.
  • Estructurales:
    • Adapter: Para compatibilidad de interfaces.
    • Decorator: Para agregar comportamiento dinámicamente a un objeto.
    • Facade: Para proporcionar una interfaz unificada a un subsistema.
    • Proxy: Para controlar el acceso a un objeto.
  • Comportamiento:
    • Observer: Para implementar un mecanismo de suscripción y notificación.
    • Strategy: Para definir una familia de algoritmos y hacerlos intercambiables.
    • Template Method: Para definir el esqueleto de un algoritmo en una clase base.
    • Command: Para encapsular una solicitud como un objeto.

Por ejemplo, a menudo uso Singleton para trabajar con bases de datos:

<?php
// Database.php
class Database {
    private static ?Database $instance = null;
    private ?PDO $pdo = null;

    private function __construct() {
        // Configuración de conexión a la BD
        $dsn = 'mysql:host=localhost;dbname=mydatabase;charset=utf8';
        $user = 'myuser';
        $password = 'mypassword';

        try {
            $this->pdo = new PDO($dsn, $user, $password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection(): ?PDO {
        return $this->pdo;
    }

    private function __clone() {}
    public function __wakeup() {}
}

Y puedo usar Factory Method para crear diferentes tipos de mensajes u objetos dependiendo de los datos de entrada.

<?php
// MessageFactory.php
interface Message {
    public function send(): string;
}

class EmailMessage implements Message {
    public function send(): string {
        return "Enviando email...";
    }
}

class SmsMessage implements Message {
    public function send(): string {
        return "Enviando SMS...";
    }
}

class MessageFactory {
    public function createMessage(string $type): Message {
        switch ($type) {
            case 'email':
                return new EmailMessage();
            case 'sms':
                return new SmsMessage();
            default:
                throw new InvalidArgumentException("Tipo de mensaje desconocido.");
        }
    }
}

// Uso:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Mostrará "Enviando email..."

La elección del patrón depende de la tarea específica y el contexto. Lo importante es no usarlos solo por usarlos, sino entender cuándo son realmente necesarios para mejorar el código.