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.