Tahmini okuma süresi: 6 minuti
Tasarım deseni, standart işlevler veya kütüphanelerde yapabildiğimiz gibi kopyalayıp programımıza ekleyebileceğimiz kod değildir. Tasarım deseni, belirli bir sorunu çözebilecek genel bir kavramdır. Temelde detaylarını takip edip programımızın realitesine uygun çözümü uygulayabileceğimiz bir model.
Modeller sıklıkla algoritmalarla karıştırılır çünkü her iki kavram da bilinen bazı problemlerin tipik çözümlerini tanımlar. Bir algoritma iken defiHer zaman belirli bir hedefe ulaşabilecek net bir dizi eylem varsa, model, çözümün daha yüksek düzeyde bir açıklamasıdır. Aynı modelin iki farklı programa uygulanan kodu farklı olabilir.
Bir benzetme yapmak istersek bir yemek tarifi düşünebiliriz: Her ikisinin de hedefe ulaşmak için net adımları vardır. Bununla birlikte, model daha çok sonucunun ve özelliklerinin ne olduğunu görebileceğiniz bir projeye benzer, ancak tam uygulama sırası kodu yazan kişiye bağlıdır.
Çoğu kalıp oldukça resmi bir şekilde anlatılmıştır, böylece insanlar bunları birçok bağlamda yeniden üretebilir. Bir modelin açıklamasında mevcut olan unsurları aşağıda görelim:
Bir programcı tasarım kalıplarının varlığını bilmeden yazılım geliştirebilir. Birçoğu bunu yapıyor ve bu nedenle farkında olmadan bazı planlar uyguluyorlar. Peki o zaman neden bunları öğrenmeye zaman ayıralım ki?
Tasarım desenleri karmaşıklık, ayrıntı düzeyi ve tasarlanan sistem genelinde uygulanabilirlik ölçeği açısından farklılık gösterir.
Benzer şekilde, birkaç trafik ışığı yerleştirerek veya yayalar için yer altı geçitleriyle çok seviyeli bir kavşak inşa ederek bir kavşağı daha güvenli hale getirebiliriz.
En temel, düşük seviyeli modeller genellikle deyimler . Genellikle yalnızca tek bir programlama dili için geçerlidirler.
En evrensel ve üst düzey modeller mimari modeller . Geliştiriciler bu kalıpları hemen hemen her dilde uygulayabilirler. Diğer modellerden farklı olarak tüm uygulamanın mimarisini tasarlamak için kullanılabilirler.
Ayrıca tüm modeller özelliklerine göre sınıflandırılabilir. denenmiş veya amaç. Üç ana sınıf şunlardır:
Cephe bir kitaplığa, çerçeveye veya herhangi bir diğer karmaşık sınıf kümesine basitleştirilmiş bir arayüz sağlayan yapısal bir tasarım desenidir.
Gelişmiş bir kütüphaneye veya çerçeveye ait geniş bir nesne kümesine dayalı olarak yazılımın çalışmasını sağlamamız gerektiğini varsayalım. Normalde tüm bu nesneleri başlatmamız, bağımlılıkları takip etmemiz, yöntemleri doğru sırada yürütmemiz vb. gerekir.
Sonuç olarak, sınıfların iş mantığı, üçüncü taraf sınıfların uygulama ayrıntılarına sıkı sıkıya bağlı hale gelecek ve bu da onların anlaşılmasını ve yönetilmesini zorlaştıracaktır.
bir facade
birçok hareketli parça içeren karmaşık bir alt sisteme basit bir arayüz sağlayan bir sınıftır. A facade
doğrudan alt sistemle çalışmaya kıyasla sınırlı işlevsellik sağlayabilir. Ancak yalnızca müşterilerin gerçekten önemsediği özellikleri içerir.
Bir tane var facade
Uygulamayı düzinelerce özelliğe sahip karmaşık bir kitaplıkla entegre etmemiz gerektiğinde kullanışlıdır, ancak işlevselliğinin yalnızca küçük bir kısmına ihtiyacımız vardır.
Örneğin, kedilerin yer aldığı kısa komik videoları sosyal medyaya yükleyen bir uygulama, potansiyel olarak profesyonel bir video dönüştürme kitaplığı kullanabilir. Ancak gerçekten ihtiyacımız olan tek şey, tek yöntemli bir sınıftır. encode(filename, format)
. Böyle bir sınıf oluşturup video dönüştürme kütüphanesine bağladıktan sonra ilk sınıfımıza sahip olacağız. facade
.
Örneğin bir çağrı merkezinin telefon operatörü bir facade
. Aslında telefonla sipariş vermek için bir mağazanın telefon servisini aradığımızda, operatör bizimdir. facade
Mağazanın tüm hizmet ve departmanlarına yönelik. Operatör, sipariş sistemine, ödeme ağ geçitlerine ve çeşitli teslimat hizmetlerine basit bir sesli arayüz sağlar.
Hakkında düşün Cephe bazı karmaşık alt sistemler için basit bir adaptör olarak. Facade
Karmaşıklığı tek bir sınıf içinde izole eder ve diğer uygulama kodlarının basit arayüzü kullanmasına olanak tanır.
Bu örnekte, Facade
YouTube API ve FFmpeg kitaplığının karmaşıklığını istemci kodundan gizler. Müşteri onlarca sınıfla çalışmak yerine Facade üzerinde basit bir yöntem kullanıyor.
<?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
Veeam Coveware, siber şantaj olaylarına müdahale hizmetleri sağlamaya devam edecek. Coveware adli tıp ve iyileştirme yetenekleri sunacak…
Kestirimci bakım, tesis yönetimine yenilikçi ve proaktif bir yaklaşımla petrol ve gaz sektöründe devrim yaratıyor.…
İngiltere CMA, Big Tech'in yapay zeka pazarındaki davranışları hakkında bir uyarı yayınladı. Orada…
Avrupa Birliği'nin binalarda enerji verimliliğini artırmak amacıyla formüle ettiği "Yeşil Evler" Kararnamesi yasama sürecini tamamladı...