εμπορεύματα

Τι είναι τα σχέδια σχεδίασης: γιατί να τα χρησιμοποιήσετε, ταξινόμηση, πλεονεκτήματα και μειονεκτήματα

Στη μηχανική λογισμικού, τα μοτίβα σχεδίασης είναι οι βέλτιστες λύσεις σε προβλήματα που εμφανίζονται συνήθως στο σχεδιασμό λογισμικού.

Είναι σαν pre projectsdefinite, δοκιμασμένα και δοκιμασμένα εργαλεία που μπορείτε να προσαρμόσετε για να λύσετε ένα επαναλαμβανόμενο πρόβλημα σχεδίασης στον κώδικά σας.

Εκτιμώμενος χρόνος ανάγνωσης: 6 λεπτά

Τι είναι ένα σχέδιο σχεδίασης

Ένα σχέδιο σχεδίασης δεν είναι κώδικας που μπορούμε να αντιγράψουμε και να εισαγάγουμε στο πρόγραμμά μας, όπως μπορούμε να κάνουμε με τυπικές συναρτήσεις ή βιβλιοθήκες. Το σχέδιο σχεδίασης είναι μια γενική ιδέα ικανή να λύσει ένα συγκεκριμένο πρόβλημα. Βασικά ένα μοντέλο του οποίου οι λεπτομέρειες μπορούμε να ακολουθήσουμε και να εφαρμόσουμε μια λύση που ταιριάζει στην πραγματικότητα του προγράμματός μας.

Τα μοντέλα συχνά συγχέονται με τους αλγόριθμους, επειδή και οι δύο έννοιες περιγράφουν τυπικές λύσεις σε ορισμένα γνωστά προβλήματα. Ενώ ένας αλγόριθμος defiΕάν υπάρχει πάντα ένα σαφές σύνολο ενεργειών που μπορούν να επιτύχουν έναν συγκεκριμένο στόχο, ένα μοντέλο είναι μια περιγραφή υψηλότερου επιπέδου μιας λύσης. Ο κώδικας από το ίδιο μοντέλο που εφαρμόζεται σε δύο διαφορετικά προγράμματα μπορεί να είναι διαφορετικός.

Θέλοντας να κάνουμε μια αναλογία, μπορούμε να σκεφτούμε μια συνταγή μαγειρικής: και οι δύο έχουν ξεκάθαρα βήματα για την επίτευξη ενός στόχου. Ωστόσο, ένα μοντέλο μοιάζει περισσότερο με ένα έργο, του οποίου μπορείτε να δείτε ποιο είναι το αποτέλεσμα και τα χαρακτηριστικά του, αλλά η ακριβής σειρά υλοποίησης εξαρτάται από εμάς που γράφουμε τον κώδικα.

Από τι αποτελείται ένα σχέδιο σχεδίασης;

Τα περισσότερα μοτίβα περιγράφονται πολύ επίσημα, έτσι ώστε οι άνθρωποι να μπορούν να τα αναπαράγουν σε πολλά πλαίσια. Ας δούμε παρακάτω τα στοιχεία που υπάρχουν στην περιγραφή ενός μοντέλου:

  • Η πρόθεση του μοντέλου περιγράφει συνοπτικά τόσο το πρόβλημα όσο και τη λύση.
  • Το κίνητρο εξηγεί περαιτέρω το πρόβλημα και τη λύση που καθιστά δυνατή το μοντέλο.
  • Δομή των τάξεων δείχνει κάθε μέρος του μοντέλου και πώς σχετίζονται.
  • Το παράδειγμα κώδικα σε μια από τις πιο δημοφιλείς γλώσσες προγραμματισμού διευκολύνει την κατανόηση της ιδέας πίσω από το μοντέλο.

Γιατί να τα χρησιμοποιήσω;

Ένας προγραμματιστής μπορεί να αναπτύξει λογισμικό χωρίς να γνωρίζει την ύπαρξη μοτίβων σχεδίασης. Πολλοί το κάνουν και για αυτό το λόγο εφαρμόζουν κάποια σχέδια χωρίς να το γνωρίζουν. Αλλά τότε γιατί πρέπει να αφιερώνουμε χρόνο για να τα μαθαίνουμε;

  • Τα σχέδια σχεδίασης είναι ένα κιτ δοκιμασμένες λύσεις σε κοινά προβλήματα στο σχεδιασμό λογισμικού. Ακόμα κι αν δεν αντιμετωπίσετε ποτέ αυτά τα προβλήματα, η γνώση μοτίβων εξακολουθεί να είναι χρήσιμη επειδή σας διδάσκει πώς να επιλύετε κάθε είδους προβλήματα χρησιμοποιώντας αρχές αντικειμενοστρεφούς σχεδίασης.
  • Τα σχεδιαστικά μοντέλα defiΔημιουργούν μια κοινή γλώσσα που μπορείτε να χρησιμοποιήσετε εσείς και η ομάδα σας για να επικοινωνήσετε πιο αποτελεσματικά. Θα μπορούσατε να πείτε, «Ω, απλώς χρησιμοποιήστε ένα Singleton για να το κάνετε αυτό», και όλοι θα καταλάβουν την ιδέα πίσω από την πρότασή σας. Δεν χρειάζεται να εξηγήσετε τι είναι το singleton αν γνωρίζετε το μοτίβο και το όνομά του.

Ταξινόμηση μοτίβων σχεδίασης

Τα σχέδια σχεδίασης διαφέρουν ως προς την πολυπλοκότητα, το επίπεδο λεπτομέρειας και την κλίμακα εφαρμογής σε όλο το σχεδιασμένο σύστημα.

Κατ' αναλογία, μπορούμε να κάνουμε μια διασταύρωση πιο ασφαλή τοποθετώντας μερικά φανάρια ή χτίζοντας έναν ολόκληρο κόμβο πολυεπίπεδων με υπόγειες διαβάσεις για τους πεζούς.

Τα πιο βασικά, χαμηλού επιπέδου μοντέλα ονομάζονται συχνά ιδιωματισμούς . Συνήθως ισχύουν μόνο για μία μόνο γλώσσα προγραμματισμού.

Τα πιο καθολικά και υψηλού επιπέδου μοντέλα είναι αρχιτεκτονικά μοντέλα . Οι προγραμματιστές μπορούν να εφαρμόσουν αυτά τα μοτίβα σε σχεδόν οποιαδήποτε γλώσσα. Σε αντίθεση με άλλα μοτίβα, μπορούν να χρησιμοποιηθούν για το σχεδιασμό της αρχιτεκτονικής μιας ολόκληρης εφαρμογής.

Επιπλέον, όλα τα μοντέλα μπορούν να ταξινομηθούν ανάλογα με το δικό τους δοκιμασμένος ή σκοπός. Οι τρεις κύριες κατηγορίες είναι:

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.
  • Δημιουργικά μοντέλα παρέχουν μηχανισμούς δημιουργίας αντικειμένων που αυξάνουν την ευελιξία και την επαναχρησιμοποίηση του υπάρχοντος κώδικα.
  • Δομικά μοντέλα εξηγούν πώς να συναρμολογήσετε αντικείμενα και κλάσεις σε μεγαλύτερες δομές, διατηρώντας αυτές τις δομές ευέλικτες και αποτελεσματικές.
  • Μοντέλα συμπεριφοράς ασχολούνται με την αποτελεσματική επικοινωνία και την ανάθεση ευθυνών μεταξύ των αντικειμένων.

Παράδειγμα σχεδιαστικού μοτίβου στο Laravel: Πρόσοψη

Πρόσοψη είναι ένα μοτίβο δομικής σχεδίασης που παρέχει μια απλοποιημένη διεπαφή σε μια βιβλιοθήκη, πλαίσιο ή οποιοδήποτε άλλο σύνθετο σύνολο κλάσεων.

Πρόβλημα

Ας υποθέσουμε ότι πρέπει να κάνουμε το λογισμικό να λειτουργεί, με βάση ένα μεγάλο σύνολο αντικειμένων που ανήκουν σε μια εξελιγμένη βιβλιοθήκη ή πλαίσιο. Κανονικά, θα πρέπει να αρχικοποιήσουμε όλα αυτά τα αντικείμενα, να παρακολουθούμε τις εξαρτήσεις, να εκτελούμε μεθόδους με τη σωστή σειρά και ούτω καθεξής.

Ως αποτέλεσμα, η επιχειρηματική λογική των κλάσεων θα συνδεόταν στενά με τις λεπτομέρειες υλοποίησης κλάσεων τρίτων, καθιστώντας δύσκολη την κατανόηση και τη διαχείρισή τους.

Λύση

ένα facade είναι μια κλάση που παρέχει μια απλή διεπαφή σε ένα σύνθετο υποσύστημα που περιέχει πολλά κινούμενα μέρη. ΕΝΑ facade μπορεί να παρέχει περιορισμένη λειτουργικότητα σε σύγκριση με την απευθείας εργασία με το υποσύστημα. Ωστόσο, περιλαμβάνει μόνο τα χαρακτηριστικά για τα οποία ενδιαφέρονται πραγματικά οι πελάτες.

Πάρε ένα facade είναι χρήσιμο όταν χρειάζεται να ενσωματώσουμε την εφαρμογή με μια εξελιγμένη βιβλιοθήκη που έχει δεκάδες δυνατότητες, αλλά χρειαζόμαστε μόνο ένα μικρό μέρος της λειτουργικότητάς της.

Για παράδειγμα, μια εφαρμογή που ανεβάζει σύντομα αστεία βίντεο με γάτες στα μέσα κοινωνικής δικτύωσης θα μπορούσε ενδεχομένως να χρησιμοποιήσει μια επαγγελματική βιβλιοθήκη μετατροπών βίντεο. Ωστόσο, το μόνο που χρειαζόμαστε πραγματικά είναι μια κλάση με την ενιαία μέθοδο encode(filename, format). Αφού δημιουργήσουμε μια τέτοια τάξη και τη συνδέσουμε στη βιβλιοθήκη μετατροπών βίντεο, θα έχουμε την πρώτη μας facade.

Για παράδειγμα, ο τηλεφωνητής ενός τηλεφωνικού κέντρου είναι σαν ένα facade. Στην πραγματικότητα, όταν καλούμε την τηλεφωνική υπηρεσία ενός καταστήματος για να κάνουμε μια τηλεφωνική παραγγελία, ένας χειριστής είναι δικός μας facade προς όλες τις υπηρεσίες και τα τμήματα του καταστήματος. Ο χειριστής παρέχει μια απλή φωνητική διεπαφή στο σύστημα παραγγελιών, τις πύλες πληρωμής και διάφορες υπηρεσίες παράδοσης.

Πραγματικό παράδειγμα στην PHP

Σκέφτομαι για Πρόσοψη ως απλός προσαρμογέας για ορισμένα πολύπλοκα υποσυστήματα. Facade απομονώνει την πολυπλοκότητα μέσα σε μια κλάση και επιτρέπει σε άλλους κώδικα εφαρμογής να χρησιμοποιούν την απλή διεπαφή.

Σε αυτό το παράδειγμα, Facade κρύβει την πολυπλοκότητα του YouTube API και της βιβλιοθήκης FFmpeg από τον κώδικα πελάτη. Αντί να εργάζεται με δεκάδες κλάσεις, ο πελάτης χρησιμοποιεί μια απλή μέθοδο στο 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

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.

Πρόσφατα άρθρα

Το Veeam διαθέτει την πιο ολοκληρωμένη υποστήριξη για ransomware, από προστασία έως απόκριση και ανάκτηση

Η Coveware από την Veeam θα συνεχίσει να παρέχει υπηρεσίες αντιμετώπισης περιστατικών εκβιασμών στον κυβερνοχώρο. Το Coveware θα προσφέρει ιατροδικαστικές και δυνατότητες αποκατάστασης…

Απρίλιος 23 2024

Πράσινη και ψηφιακή επανάσταση: Πώς η προβλεπτική συντήρηση μεταμορφώνει τη βιομηχανία πετρελαίου και φυσικού αερίου

Η προγνωστική συντήρηση φέρνει επανάσταση στον τομέα του πετρελαίου και του φυσικού αερίου, με μια καινοτόμο και προορατική προσέγγιση στη διαχείριση των εγκαταστάσεων.…

Απρίλιος 22 2024

Η ρυθμιστική αρχή αντιμονοπωλιακής νομοθεσίας του Ηνωμένου Βασιλείου εγείρει συναγερμό της BigTech για το GenAI

Η βρετανική CMA εξέδωσε προειδοποίηση σχετικά με τη συμπεριφορά της Big Tech στην αγορά τεχνητής νοημοσύνης. Εκεί…

Απρίλιος 18 2024

Casa Green: ενεργειακή επανάσταση για ένα βιώσιμο μέλλον στην Ιταλία

Το διάταγμα «Case Green», που διατυπώθηκε από την Ευρωπαϊκή Ένωση για τη βελτίωση της ενεργειακής απόδοσης των κτιρίων, ολοκλήρωσε τη νομοθετική του διαδικασία με…

Απρίλιος 18 2024

Διαβάστε την Καινοτομία στη γλώσσα σας

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.

Seguici