Εκτιμώμενος χρόνος ανάγνωσης: 6 λεπτά
Ένα σχέδιο σχεδίασης δεν είναι κώδικας που μπορούμε να αντιγράψουμε και να εισαγάγουμε στο πρόγραμμά μας, όπως μπορούμε να κάνουμε με τυπικές συναρτήσεις ή βιβλιοθήκες. Το σχέδιο σχεδίασης είναι μια γενική ιδέα ικανή να λύσει ένα συγκεκριμένο πρόβλημα. Βασικά ένα μοντέλο του οποίου οι λεπτομέρειες μπορούμε να ακολουθήσουμε και να εφαρμόσουμε μια λύση που ταιριάζει στην πραγματικότητα του προγράμματός μας.
Τα μοντέλα συχνά συγχέονται με τους αλγόριθμους, επειδή και οι δύο έννοιες περιγράφουν τυπικές λύσεις σε ορισμένα γνωστά προβλήματα. Ενώ ένας αλγόριθμος defiΕάν υπάρχει πάντα ένα σαφές σύνολο ενεργειών που μπορούν να επιτύχουν έναν συγκεκριμένο στόχο, ένα μοντέλο είναι μια περιγραφή υψηλότερου επιπέδου μιας λύσης. Ο κώδικας από το ίδιο μοντέλο που εφαρμόζεται σε δύο διαφορετικά προγράμματα μπορεί να είναι διαφορετικός.
Θέλοντας να κάνουμε μια αναλογία, μπορούμε να σκεφτούμε μια συνταγή μαγειρικής: και οι δύο έχουν ξεκάθαρα βήματα για την επίτευξη ενός στόχου. Ωστόσο, ένα μοντέλο μοιάζει περισσότερο με ένα έργο, του οποίου μπορείτε να δείτε ποιο είναι το αποτέλεσμα και τα χαρακτηριστικά του, αλλά η ακριβής σειρά υλοποίησης εξαρτάται από εμάς που γράφουμε τον κώδικα.
Τα περισσότερα μοτίβα περιγράφονται πολύ επίσημα, έτσι ώστε οι άνθρωποι να μπορούν να τα αναπαράγουν σε πολλά πλαίσια. Ας δούμε παρακάτω τα στοιχεία που υπάρχουν στην περιγραφή ενός μοντέλου:
Ένας προγραμματιστής μπορεί να αναπτύξει λογισμικό χωρίς να γνωρίζει την ύπαρξη μοτίβων σχεδίασης. Πολλοί το κάνουν και για αυτό το λόγο εφαρμόζουν κάποια σχέδια χωρίς να το γνωρίζουν. Αλλά τότε γιατί πρέπει να αφιερώνουμε χρόνο για να τα μαθαίνουμε;
Τα σχέδια σχεδίασης διαφέρουν ως προς την πολυπλοκότητα, το επίπεδο λεπτομέρειας και την κλίμακα εφαρμογής σε όλο το σχεδιασμένο σύστημα.
Κατ' αναλογία, μπορούμε να κάνουμε μια διασταύρωση πιο ασφαλή τοποθετώντας μερικά φανάρια ή χτίζοντας έναν ολόκληρο κόμβο πολυεπίπεδων με υπόγειες διαβάσεις για τους πεζούς.
Τα πιο βασικά, χαμηλού επιπέδου μοντέλα ονομάζονται συχνά ιδιωματισμούς . Συνήθως ισχύουν μόνο για μία μόνο γλώσσα προγραμματισμού.
Τα πιο καθολικά και υψηλού επιπέδου μοντέλα είναι αρχιτεκτονικά μοντέλα . Οι προγραμματιστές μπορούν να εφαρμόσουν αυτά τα μοτίβα σε σχεδόν οποιαδήποτε γλώσσα. Σε αντίθεση με άλλα μοτίβα, μπορούν να χρησιμοποιηθούν για το σχεδιασμό της αρχιτεκτονικής μιας ολόκληρης εφαρμογής.
Επιπλέον, όλα τα μοντέλα μπορούν να ταξινομηθούν ανάλογα με το δικό τους δοκιμασμένος ή σκοπός. Οι τρεις κύριες κατηγορίες είναι:
Πρόσοψη είναι ένα μοτίβο δομικής σχεδίασης που παρέχει μια απλοποιημένη διεπαφή σε μια βιβλιοθήκη, πλαίσιο ή οποιοδήποτε άλλο σύνθετο σύνολο κλάσεων.
Ας υποθέσουμε ότι πρέπει να κάνουμε το λογισμικό να λειτουργεί, με βάση ένα μεγάλο σύνολο αντικειμένων που ανήκουν σε μια εξελιγμένη βιβλιοθήκη ή πλαίσιο. Κανονικά, θα πρέπει να αρχικοποιήσουμε όλα αυτά τα αντικείμενα, να παρακολουθούμε τις εξαρτήσεις, να εκτελούμε μεθόδους με τη σωστή σειρά και ούτω καθεξής.
Ως αποτέλεσμα, η επιχειρηματική λογική των κλάσεων θα συνδεόταν στενά με τις λεπτομέρειες υλοποίησης κλάσεων τρίτων, καθιστώντας δύσκολη την κατανόηση και τη διαχείρισή τους.
ένα facade
είναι μια κλάση που παρέχει μια απλή διεπαφή σε ένα σύνθετο υποσύστημα που περιέχει πολλά κινούμενα μέρη. ΕΝΑ facade
μπορεί να παρέχει περιορισμένη λειτουργικότητα σε σύγκριση με την απευθείας εργασία με το υποσύστημα. Ωστόσο, περιλαμβάνει μόνο τα χαρακτηριστικά για τα οποία ενδιαφέρονται πραγματικά οι πελάτες.
Πάρε ένα facade
είναι χρήσιμο όταν χρειάζεται να ενσωματώσουμε την εφαρμογή με μια εξελιγμένη βιβλιοθήκη που έχει δεκάδες δυνατότητες, αλλά χρειαζόμαστε μόνο ένα μικρό μέρος της λειτουργικότητάς της.
Για παράδειγμα, μια εφαρμογή που ανεβάζει σύντομα αστεία βίντεο με γάτες στα μέσα κοινωνικής δικτύωσης θα μπορούσε ενδεχομένως να χρησιμοποιήσει μια επαγγελματική βιβλιοθήκη μετατροπών βίντεο. Ωστόσο, το μόνο που χρειαζόμαστε πραγματικά είναι μια κλάση με την ενιαία μέθοδο encode(filename, format)
. Αφού δημιουργήσουμε μια τέτοια τάξη και τη συνδέσουμε στη βιβλιοθήκη μετατροπών βίντεο, θα έχουμε την πρώτη μας facade
.
Για παράδειγμα, ο τηλεφωνητής ενός τηλεφωνικού κέντρου είναι σαν ένα facade
. Στην πραγματικότητα, όταν καλούμε την τηλεφωνική υπηρεσία ενός καταστήματος για να κάνουμε μια τηλεφωνική παραγγελία, ένας χειριστής είναι δικός μας facade
προς όλες τις υπηρεσίες και τα τμήματα του καταστήματος. Ο χειριστής παρέχει μια απλή φωνητική διεπαφή στο σύστημα παραγγελιών, τις πύλες πληρωμής και διάφορες υπηρεσίες παράδοσης.
Σκέφτομαι για Πρόσοψη ως απλός προσαρμογέας για ορισμένα πολύπλοκα υποσυστήματα. 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
Η Coveware από την Veeam θα συνεχίσει να παρέχει υπηρεσίες αντιμετώπισης περιστατικών εκβιασμών στον κυβερνοχώρο. Το Coveware θα προσφέρει ιατροδικαστικές και δυνατότητες αποκατάστασης…
Η προγνωστική συντήρηση φέρνει επανάσταση στον τομέα του πετρελαίου και του φυσικού αερίου, με μια καινοτόμο και προορατική προσέγγιση στη διαχείριση των εγκαταστάσεων.…
Η βρετανική CMA εξέδωσε προειδοποίηση σχετικά με τη συμπεριφορά της Big Tech στην αγορά τεχνητής νοημοσύνης. Εκεί…
Το διάταγμα «Case Green», που διατυπώθηκε από την Ευρωπαϊκή Ένωση για τη βελτίωση της ενεργειακής απόδοσης των κτιρίων, ολοκλήρωσε τη νομοθετική του διαδικασία με…