Sobes.tech
Middle

Usa padrões de design na sua prática?

sobes.tech IA

Resposta da IA

Sim, uso-os. Eles ajudam a resolver tarefas típicas, melhorar a estrutura do código, a sua legibilidade e manutenção.

Os principais padrões que aplico:

  • Criacionais:
    • Singleton: Para limitar a classe a uma única instância.
    • Factory Method: Para criar objetos sem especificar a classe concreta.
    • Abstract Factory: Para criar famílias de objetos relacionados.
    • Builder: Para criar objetos complexos passo a passo.
  • Estruturais:
    • Adapter: Para compatibilidade de interfaces.
    • Decorator: Para adicionar comportamento dinamicamente a um objeto.
    • Facade: Para fornecer uma interface unificada a um subsistema.
    • Proxy: Para controlar o acesso a um objeto.
  • Comportamentais:
    • Observer: Para implementar um mecanismo de assinatura e notificação.
    • Strategy: Para definir uma família de algoritmos e torná-los intercambiáveis.
    • Template Method: Para definir o esqueleto de um algoritmo numa classe base.
    • Command: Para encapsular uma solicitação como um objeto.

Por exemplo, frequentemente uso Singleton para trabalhar com bases de dados:

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

    private function __construct() {
        // Configuração de conexão à 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() {}
}

E posso usar Factory Method para criar diferentes tipos de mensagens ou objetos dependendo dos dados 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 mensagem desconhecido.");
        }
    }
}

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

A escolha do padrão depende da tarefa específica e do contexto. O importante é não usá-los apenas por usá-los, mas entender quando eles são realmente necessários para melhorar o código.