Makaleler

Tasarım kalıpları nelerdir: neden kullanılmalı, sınıflandırma, artıları ve eksileri

Yazılım mühendisliğinde tasarım kalıpları, yazılım tasarımında yaygın olarak ortaya çıkan sorunlara en uygun çözümlerdir.

Ön proje gibilerdefiKodunuzda yinelenen bir tasarım sorununu çözmek için özelleştirebileceğiniz, denenmiş ve test edilmiş araçlar.

Tahmini okuma süresi: 6 minuti

Tasarım Deseni Nedir?

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.

Tasarım Deseni neyden yapılmıştı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:

  • Niyet Modelin hem sorunu hem de çözümünü kısaca açıklamaktadır.
  • Motivasyon ayrıca sorunu ve modelin mümkün kıldığı çözümü açıklar.
  • Yapı sınıfların sayısı modelin her bir parçasını ve bunların nasıl ilişkili olduğunu gösterir.
  • Kod örneği En popüler programlama dillerinden birinde kullanılması, modelin arkasındaki fikri anlamayı kolaylaştırır.

Neden bunları kullanıyorsunuz?

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 bir kittir denenmiş ve test edilmiş çözümler Yazılım tasarımında sık karşılaşılan sorunlara. Bu sorunlarla hiç karşılaşmasanız bile kalıpları bilmek yine de faydalıdır çünkü nesne yönelimli tasarım ilkelerini kullanarak her türlü sorunu nasıl çözeceğinizi öğretir.
  • tasarım modelleri defiSizin ve ekibinizin daha etkili iletişim kurmak için kullanabileceği ortak bir dil oluştururlar. "Ah, bunu yapmak için bir Singleton kullanın" diyebilirsiniz; herkes önerinizin arkasındaki fikri anlayacaktır. Deseni ve adını biliyorsanız singleton'un ne olduğunu açıklamaya gerek yoktur.

Tasarım Desenlerinin Sınıflandırılması

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:

İnovasyon bülteni
İnovasyonla ilgili en önemli haberleri kaçırmayın. Onları e-posta ile almak için kaydolun.
  • Yaratıcı modeller esnekliği ve mevcut kodun yeniden kullanımını artıran nesne oluşturma mekanizmaları sağlarlar.
  • Yapısal modeller nesneleri ve sınıfları daha büyük yapılar halinde nasıl birleştireceklerini, bu yapıları esnek ve verimli tutacaklarını açıklıyorlar.
  • Davranış modelleri nesneler arasında etkili iletişim ve sorumlulukların atanmasıyla ilgilenirler.

Laravel'de Tasarım Deseni Örneği: Cephe

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.

Problema

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.

Çözüm

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.

PHP'de gerçek örnek

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

İnovasyon bülteni
İnovasyonla ilgili en önemli haberleri kaçırmayın. Onları e-posta ile almak için kaydolun.

Son Makaleler

Veeam, korumadan yanıt ve kurtarmaya kadar fidye yazılımı için en kapsamlı desteği sunuyor

Veeam Coveware, siber şantaj olaylarına müdahale hizmetleri sağlamaya devam edecek. Coveware adli tıp ve iyileştirme yetenekleri sunacak…

Nisan 23 2024

Yeşil ve Dijital Devrim: Kestirimci Bakım Petrol ve Gaz Endüstrisini Nasıl Dönüştürüyor?

Kestirimci bakım, tesis yönetimine yenilikçi ve proaktif bir yaklaşımla petrol ve gaz sektöründe devrim yaratıyor.…

Nisan 22 2024

Birleşik Krallık antitröst düzenleyicisi GenAI konusunda BigTech alarmını yükseltti

İngiltere CMA, Big Tech'in yapay zeka pazarındaki davranışları hakkında bir uyarı yayınladı. Orada…

Nisan 18 2024

Casa Green: İtalya'da sürdürülebilir bir gelecek için enerji devrimi

Avrupa Birliği'nin binalarda enerji verimliliğini artırmak amacıyla formüle ettiği "Yeşil Evler" Kararnamesi yasama sürecini tamamladı...

Nisan 18 2024