Cikkek

Mik azok a tervezési minták: miért használja őket, osztályozás, előnyei és hátrányai

A szoftverfejlesztésben a tervezési minták optimális megoldást jelentenek a szoftvertervezés során gyakran előforduló problémákra.

Olyanok, mint az előzetes projektekdefivéges, kipróbált és tesztelt eszközök, amelyek testreszabhatók a kódban előforduló, visszatérő tervezési problémák megoldására.

Becsült olvasási idő: 6 minuti

Mi az a tervezési minta

A tervezési minta nem olyan kód, amelyet másolhatunk és beilleszthetünk a programunkba, ahogyan azt szabványos függvényekkel vagy könyvtárakkal tehetjük. A tervezési minta egy általános koncepció, amely képes megoldani egy adott problémát. Alapvetően egy olyan modell, amelynek részleteit követni tudjuk, és a programunk valóságához illeszkedő megoldást megvalósíthatunk.

A modelleket gyakran összekeverik az algoritmusokkal, mivel mindkét fogalom néhány ismert probléma tipikus megoldásait írja le. Miközben egy algoritmus defiHa mindig van egy világos cselekvési halmaz, amellyel egy bizonyos célt el lehet érni, a modell a megoldás magasabb szintű leírása. Ugyanabból a modellből származó kód két különböző programra eltérő lehet.

Ha hasonlattal akarunk élni, eszünkbe jut egy főzési recept: mindkettőnek világos lépései vannak a cél eléréséhez. A modell azonban inkább egy projekt, aminek meg lehet nézni, hogy mi az eredménye és a jellemzői, de a megvalósítás pontos sorrendje rajtunk múlik, kik írjuk a kódot.

Miből készül a tervezési minta?

A legtöbb mintát nagyon formálisan írják le, így az emberek sok kontextusban reprodukálhatják őket. Lássuk az alábbiakban a modell leírásában szereplő elemeket:

  • A szándék A modell röviden leírja a problémát és a megoldást is.
  • A motiváció tovább magyarázza a problémát és a megoldást, amelyet a modell lehetővé tesz.
  • Szerkezet osztályok bemutatja a modell egyes részeit, és hogyan kapcsolódnak egymáshoz.
  • A kód példa az egyik legnépszerűbb programozási nyelven megkönnyíti a modell mögött rejlő gondolat megértését.

Miért használja őket?

A programozó anélkül tud szoftvert fejleszteni, hogy ismerné a tervezési minták létezését. Sokan megteszik, és ezért bizonyos sémákat anélkül hajtanak végre, hogy tudnának. De akkor miért szánjunk időt ezek tanulására?

  • A tervezési minták egy készletből állnak kipróbált megoldások a szoftvertervezés gyakori problémáira. Még ha soha nem is találkozik ezekkel a problémákkal, a minták ismerete akkor is hasznos, mert megtanítja, hogyan lehet mindenféle problémát megoldani objektumorientált tervezési elvek használatával.
  • A tervezési modellek defiEgy közös nyelvet hoznak létre, amellyel Ön és csapata hatékonyabban kommunikálhat. Mondhatnád: „Ó, csak használj Singletont ehhez”, és mindenki megérti a javaslata mögött rejlő gondolatot. Nem kell elmagyarázni, mi az a szingli, ha ismeri a mintát és a nevét.

Tervezési minták osztályozása

A tervezési minták összetettségükben, részletességükben és az alkalmazhatóság mértékében különböznek a tervezett rendszerben.

Hasonlóan, biztonságosabbá tehetünk egy kereszteződést néhány közlekedési lámpa felszerelésével vagy egy teljes többszintű csomópont kiépítésével, földalatti átjárókkal a gyalogosok számára.

A legalapvetőbb, alacsony szintű modelleket gyakran hívják idiómák . Általában csak egyetlen programozási nyelvre vonatkoznak.

A leguniverzálisabb és legmagasabb szintű modellek építészeti modellek . A fejlesztők gyakorlatilag bármilyen nyelven megvalósíthatják ezeket a mintákat. Más mintákkal ellentétben egy teljes alkalmazás architektúrájának megtervezésére használhatók.

Továbbá minden modell osztályozható aszerint megpróbálta vagy cél. A három fő osztály a következő:

Innovációs hírlevél
Ne maradjon le az innovációval kapcsolatos legfontosabb hírekről. Regisztráljon, hogy megkapja őket e-mailben.
  • Kreatív modellek olyan objektum létrehozási mechanizmusokat biztosítanak, amelyek növelik a meglévő kód rugalmasságát és újrafelhasználását.
  • Strukturális modellek elmagyarázzák, hogyan lehet objektumokat és osztályokat nagyobb struktúrákká összeállítani, rugalmasan és hatékonyan megőrizni ezeket a struktúrákat.
  • Viselkedési modellek hatékony kommunikációval és az objektumok közötti felelősségek kiosztásával foglalkoznak.

Példa a Laravel tervezési mintájára: Homlokzat

épülethomlokzat egy szerkezeti tervezési minta, amely egyszerűsített felületet biztosít egy könyvtárhoz, keretrendszerhez vagy bármely más összetett osztálykészlethez.

Probléma

Tegyük fel, hogy a szoftvert működésre kell hoznunk egy kifinomult könyvtárhoz vagy keretrendszerhez tartozó objektumok nagy halmaza alapján. Általában ezeket az objektumokat inicializálnunk kell, nyomon kell követnünk a függőségeket, a metódusokat a megfelelő sorrendben kell végrehajtanunk, és így tovább.

Ennek eredményeként az osztályok üzleti logikája szorosan összekapcsolódna a harmadik féltől származó osztályok megvalósítási részleteivel, ami megnehezíti azok megértését és kezelését.

Megoldás

egy facade egy olyan osztály, amely egyszerű interfészt biztosít egy összetett, sok mozgó alkatrészt tartalmazó alrendszerhez. A facade korlátozott funkcionalitást biztosíthat az alrendszerrel való közvetlen munkához képest. Ez azonban csak azokat a funkciókat tartalmazza, amelyek az ügyfelek számára valóban fontosak.

Van egy facade akkor hasznos, ha az alkalmazást egy kifinomult könyvtárral kell integrálnunk, amely több tucat funkciót tartalmaz, de a funkcionalitásnak csak egy kis részére van szükségünk.

Például egy olyan alkalmazás, amely macskákat bemutató rövid, vicces videókat tölt fel a közösségi médiára, professzionális videókonverziós könyvtárat használhat. Valójában azonban csak egy osztályra van szükségünk egyetlen metódussal encode(filename, format). Miután létrehoztunk egy ilyen osztályt és csatlakoztattuk a videokonverziós könyvtárhoz, meglesz az első facade.

Például egy call center telefonkezelője olyan, mint a facade. Valójában, amikor felhívjuk egy üzlet telefonos szolgáltatását telefonos rendelés leadása érdekében, egy kezelő a miénk facade az üzlet összes szolgáltatása és részlege felé. Az üzemeltető egyszerű hangos interfészt biztosít a rendelési rendszerhez, fizetési átjárókhoz és különféle kézbesítési szolgáltatásokhoz.

Valódi példa PHP-ben

Gondol róla épülethomlokzat egyszerű adapterként néhány összetett alrendszerhez. Facade elkülöníti a bonyolultságot egyetlen osztályon belül, és lehetővé teszi más alkalmazáskódok számára az egyszerű felület használatát.

Ebben a példában Facade elrejti a YouTube API és az FFmpeg könyvtár összetettségét az ügyfélkód elől. Ahelyett, hogy több tucat osztállyal dolgozna, az ügyfél egy egyszerű módszert használ a Facade-on.

<?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

Innovációs hírlevél
Ne maradjon le az innovációval kapcsolatos legfontosabb hírekről. Regisztráljon, hogy megkapja őket e-mailben.

Friss cikkek

A Veeam a legátfogóbb támogatást nyújtja a ransomware-ekhez, a védelemtől a válaszadásig és helyreállításig

A Coveware by Veeam továbbra is nyújt kiberzsarolási incidensekre reagáló szolgáltatásokat. A Coveware kriminalisztikai és kármentesítési lehetőségeket kínál majd…

23 április 2024

Zöld és digitális forradalom: Hogyan alakítja át a prediktív karbantartás az olaj- és gázipart

A prediktív karbantartás az üzemirányítás innovatív és proaktív megközelítésével forradalmasítja az olaj- és gázszektort.…

22 április 2024

Az Egyesült Királyság trösztellenes szabályozója a BigTech riadalmat keltette a GenAI miatt

A brit CMA figyelmeztetést adott ki a Big Tech mesterséges intelligencia piacán tanúsított magatartása miatt. Ott…

18 április 2024

Casa Green: energiaforradalom a fenntartható jövőért Olaszországban

Az Európai Unió által az épületek energiahatékonyságának fokozása érdekében megfogalmazott „Zöld Házak” rendelet a…

18 április 2024