Tempo estimado de lectura: 6 minutos
Un patrón de deseño non é un código que podemos copiar e inserir no noso programa, como podemos facer con funcións ou bibliotecas estándar. O patrón de deseño é un concepto xeral capaz de resolver un problema particular. Basicamente un modelo cuxos detalles podemos seguir e implementar unha solución que se axuste á realidade do noso programa.
Os modelos adoitan confundirse con algoritmos, porque ambos conceptos describen solucións típicas a algúns problemas coñecidos. Mentres un algoritmo defiSe sempre hai un conxunto claro de accións que poden acadar un determinado obxectivo, un modelo é unha descrición de nivel superior dunha solución. O código do mesmo modelo aplicado a dous programas diferentes pode ser diferente.
Querendo facer unha analoxía, podemos pensar nunha receita de cociña: ambos teñen claros os pasos para conseguir un obxectivo. Non obstante, un modelo parécese máis a un proxecto, do que podes ver cal é o resultado e as súas características, pero a orde exacta de implementación depende de nós quen escribamos o código.
A maioría dos patróns descríbense de forma moi formal para que a xente poida reproducilos en moitos contextos. Vexamos a continuación os elementos que están presentes na descrición dun modelo:
Un programador pode desenvolver software sen coñecer a existencia de patróns de deseño. Moitos si, e por iso implementan algúns esquemas sen sabelo. Pero entón por que debemos dedicar tempo a aprendelas?
Os patróns de deseño difiren en complexidade, nivel de detalle e escala de aplicabilidade ao longo do sistema deseñado.
Por analoxía, podemos facer unha intersección máis segura instalando uns poucos semáforos ou construíndo todo un intercambio multinivel con pasos subterráneos para peóns.
Os modelos máis básicos e de baixo nivel adoitan chamarse modismos . Normalmente só se aplican a unha única linguaxe de programación.
Os modelos máis universais e de alto nivel son modelos arquitectónicos . Os desenvolvedores poden implementar estes patróns en practicamente calquera idioma. A diferenza doutros patróns, pódense usar para deseñar a arquitectura dunha aplicación enteira.
Ademais, todos os modelos pódense clasificar segundo o seu probado ou propósito. As tres clases principais son:
Fachada é un patrón de deseño estrutural que proporciona unha interface simplificada para unha biblioteca, marco ou calquera outro conxunto complexo de clases.
Supoñamos que necesitamos facer que o software funcione, baseado nun gran conxunto de obxectos que pertencen a unha biblioteca ou marco sofisticado. Normalmente, necesitaríamos inicializar todos estes obxectos, facer un seguimento das dependencias, executar métodos na orde correcta, etc.
Como resultado, a lóxica empresarial das clases quedaría estreitamente vinculada aos detalles de implementación de clases de terceiros, o que dificultaría a súa comprensión e xestión.
un facade
é unha clase que proporciona unha interface sinxela a un subsistema complexo que contén moitas partes móbiles. A facade
pode proporcionar unha funcionalidade limitada en comparación co traballo directo co subsistema. Non obstante, só inclúe as funcións que realmente lles importan aos clientes.
Ten un facade
é útil cando necesitamos integrar a aplicación cunha biblioteca sofisticada que ten ducias de funcións, pero só necesitamos unha pequena parte da súa funcionalidade.
Por exemplo, unha aplicación que carga vídeos curtos e divertidos con gatos ás redes sociais podería utilizar unha biblioteca de conversión de vídeo profesional. Non obstante, o único que necesitamos é unha clase co método único encode(filename, format)
. Despois de crear unha clase deste tipo e conectala á biblioteca de conversión de vídeo, teremos a nosa primeira facade
.
Por exemplo, o operador de telefonía dun centro de chamadas é como a facade
. De feito, cando chamamos ao servizo telefónico dunha tenda para facer un pedido telefónico, un operador é noso facade
cara a todos os servizos e departamentos da tenda. O operador ofrece unha interface de voz sinxela para o sistema de pedidos, pasarelas de pago e varios servizos de entrega.
Pensar Fachada como un simple adaptador para algúns subsistemas complexos. Facade
illa a complexidade nunha única clase e permite que outro código de aplicación use a interface sinxela.
Neste exemplo, Facade
oculta a complexidade da API de YouTube e da biblioteca FFmpeg do código do cliente. En lugar de traballar con ducias de clases, o cliente usa un método sinxelo en Facade.
<?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
Coveware by Veeam continuará ofrecendo servizos de resposta a incidentes de extorsión cibernética. Coveware ofrecerá capacidades forenses e de remediación...
O mantemento preditivo está a revolucionar o sector do petróleo e do gas, cun enfoque innovador e proactivo para a xestión das plantas...
A CMA do Reino Unido emitiu unha advertencia sobre o comportamento de Big Tech no mercado da intelixencia artificial. Alí…
O Decreto "Case Green", formulado pola Unión Europea para mellorar a eficiencia enerxética dos edificios, concluíu o seu proceso lexislativo co...