Tempo estimado de leitura: 6 minutos
Um padrão de projeto não é um código que podemos copiar e inserir em nosso programa, como podemos fazer com funções ou bibliotecas padrão. O padrão de projeto é um conceito geral capaz de resolver um problema específico. Basicamente um modelo cujos detalhes podemos seguir e implementar uma solução que se ajuste à realidade do nosso programa.
Os modelos são frequentemente confundidos com algoritmos, porque ambos os conceitos descrevem soluções típicas para alguns problemas conhecidos. Enquanto um algoritmo defiSe houver sempre um conjunto claro de ações que podem atingir um determinado objetivo, um modelo é uma descrição de nível superior de uma solução. O código do mesmo modelo aplicado a dois programas diferentes pode ser diferente.
Querendo fazer uma analogia, podemos pensar em uma receita culinária: ambas possuem passos claros para atingir um objetivo. Porém, um modelo é mais parecido com um projeto, do qual você pode ver qual é o resultado e suas características, mas a ordem exata de implementação depende de nós que escrevemos o código.
A maioria dos padrões é descrita de forma muito formal para que as pessoas possam reproduzi-los em muitos contextos. Vejamos a seguir os elementos que estão presentes na descrição de um modelo:
Um programador pode desenvolver software sem saber da existência de padrões de projeto. Muitos o fazem e, por esta razão, implementam alguns esquemas sem saber. Mas então por que deveríamos gastar tempo aprendendo-os?
Os padrões de projeto diferem em complexidade, nível de detalhe e escala de aplicabilidade em todo o sistema projetado.
Por analogia, podemos tornar um cruzamento mais seguro instalando alguns semáforos ou construindo um cruzamento completo de vários níveis com passagens subterrâneas para pedestres.
Os modelos mais básicos e de baixo nível são frequentemente chamados expressões idiomáticas . Eles geralmente se aplicam apenas a uma única linguagem de programação.
Os modelos mais universais e de alto nível são modelos arquitetônicos . Os desenvolvedores podem implementar esses padrões em praticamente qualquer linguagem. Ao contrário de outros padrões, eles podem ser usados para projetar a arquitetura de uma aplicação inteira.
Além disso, todos os modelos podem ser classificados de acordo com sua tentou ou propósito. As três classes principais são:
fachada é um padrão de design estrutural que fornece uma interface simplificada para uma biblioteca, estrutura ou qualquer outro conjunto complexo de classes.
Vamos supor que precisamos fazer o software funcionar, baseado em um grande conjunto de objetos que pertencem a uma biblioteca ou framework sofisticado. Normalmente, precisaríamos inicializar todos esses objetos, controlar as dependências, executar métodos na ordem correta e assim por diante.
Como resultado, a lógica de negócios das classes ficaria fortemente acoplada aos detalhes de implementação de classes de terceiros, tornando-as difíceis de compreender e gerenciar.
Uma facade
é uma classe que fornece uma interface simples para um subsistema complexo que contém muitas partes móveis. A facade
pode fornecer funcionalidade limitada em comparação ao trabalho direto com o subsistema. No entanto, inclui apenas os recursos que realmente interessam aos clientes.
Tenha um facade
é útil quando precisamos integrar o aplicativo a uma biblioteca sofisticada que possui dezenas de recursos, mas precisamos apenas de uma pequena parte de sua funcionalidade.
Por exemplo, um aplicativo que carrega vídeos curtos e engraçados com gatos nas redes sociais poderia usar uma biblioteca profissional de conversão de vídeo. No entanto, tudo o que realmente precisamos é de uma classe com o método único encode(filename, format)
. Após criar tal classe e conectá-la à biblioteca de conversão de vídeo, teremos nossa primeira facade
.
Por exemplo, a operadora telefônica de uma central de atendimento é como um facade
. Na verdade, quando ligamos para o serviço telefônico de uma loja para fazer um pedido por telefone, uma operadora é nossa facade
para todos os serviços e departamentos da loja. A operadora fornece uma interface de voz simples para o sistema de pedidos, gateways de pagamento e diversos serviços de entrega.
Pense sobre fachada como um adaptador simples para alguns subsistemas complexos. Facade
isola a complexidade dentro de uma única classe e permite que outro código de aplicativo use a interface simples.
Neste exemplo, Facade
esconde a complexidade da API do YouTube e da biblioteca FFmpeg do código do cliente. Em vez de trabalhar com dezenas de classes, o cliente utiliza um método simples no Façade.
<?php
namespace RefactoringGuru\Facade\RealWorld;
/**
* The Facade provides a single method for downloading videos from YouTube. This
* method hides all the complexity of the PHP network layer, YouTube API and the
* video conversion library (FFmpeg).
*/
class YouTubeDownloader
{
protected $youtube;
protected $ffmpeg;
/**
* It is handy when the Facade can manage the lifecycle of the subsystem it
* uses.
*/
public function __construct(string $youtubeApiKey)
{
$this->youtube = new YouTube($youtubeApiKey);
$this->ffmpeg = new FFMpeg();
}
/**
* The Facade provides a simple method for downloading video and encoding it
* to a target format (for the sake of simplicity, the real-world code is
* commented-out).
*/
public function downloadVideo(string $url): void
{
echo "Fetching video metadata from youtube...\n";
// $title = $this->youtube->fetchVideo($url)->getTitle();
echo "Saving video file to a temporary file...\n";
// $this->youtube->saveAs($url, "video.mpg");
echo "Processing source video...\n";
// $video = $this->ffmpeg->open('video.mpg');
echo "Normalizing and resizing the video to smaller dimensions...\n";
// $video
// ->filters()
// ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
// ->synchronize();
echo "Capturing preview image...\n";
// $video
// ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
// ->save($title . 'frame.jpg');
echo "Saving video in target formats...\n";
// $video
// ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
// ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
// ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
echo "Done!\n";
}
}
/**
* The YouTube API subsystem.
*/
class YouTube
{
public function fetchVideo(): string { /* ... */ }
public function saveAs(string $path): void { /* ... */ }
// ...more methods and classes...
}
/**
* The FFmpeg subsystem (a complex video/audio conversion library).
*/
class FFMpeg
{
public static function create(): FFMpeg { /* ... */ }
public function open(string $video): void { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
class FFMpegVideo
{
public function filters(): self { /* ... */ }
public function resize(): self { /* ... */ }
public function synchronize(): self { /* ... */ }
public function frame(): self { /* ... */ }
public function save(string $path): self { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
/**
* The client code does not depend on any subsystem's classes. Any changes
* inside the subsystem's code won't affect the client code. You will only need
* to update the Facade.
*/
function clientCode(YouTubeDownloader $facade)
{
// ...
$facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");
// ...
}
$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);
Ercole Palmeri
O setor naval é uma verdadeira potência económica global, que navegou para um mercado de 150 mil milhões...
Na segunda-feira passada, o Financial Times anunciou um acordo com a OpenAI. O FT licencia seu jornalismo de classe mundial…
Milhões de pessoas pagam por serviços de streaming, pagando assinaturas mensais. É opinião comum que você…
A Coveware by Veeam continuará a fornecer serviços de resposta a incidentes de extorsão cibernética. A Coveware oferecerá recursos forenses e de remediação…