ארטיקלען

וואָס זענען פּלאַן פּאַטערנז: וואָס נוצן זיי, קלאַסאַפאַקיישאַן, פּראָס און קאָנס

אין ווייכווארג ינזשעניעריע, פּלאַן פּאַטערנז זענען אָפּטימאַל סאַלושאַנז צו פּראָבלעמס וואָס אָפט פאַלן אין ווייכווארג פּלאַן.

זיי זענען ווי פאַר פּראַדזשעקסdefiניט, געפרוווט און טעסטעד מכשירים אַז איר קענען קאַסטאַמייז צו סאָלווע אַ ריקערינג פּלאַן פּראָבלעם אין דיין קאָד.

עסטימאַטעד לייענען צייט: 6 minuti

וואָס איז אַ פּלאַן מוסטער

א פּלאַן מוסטער איז נישט קאָד וואָס מיר קענען נאָכמאַכן און אַרייַנלייגן אין אונדזער פּראָגראַם, ווי מיר קענען טאָן מיט נאָרמאַל פאַנגקשאַנז אָדער לייברעריז. דער פּלאַן מוסטער איז אַ גענעראַל באַגריף וואָס איז ביכולת צו סאַלווינג אַ באַזונדער פּראָבלעם. בייסיקלי אַ מאָדעל וועמענס דעטאַילס מיר קענען נאָכגיין און ינסטרומענט אַ לייזונג וואָס פיץ די פאַקט פון אונדזער פּראָגראַם.

מאָדעלס זענען אָפט צעמישט מיט אַלגערידאַמז, ווייַל ביידע קאַנסעפּס באַשרייַבן טיפּיש סאַלושאַנז צו עטלעכע באַוווסט פּראָבלעמס. בשעת אַ אַלגערידאַם defiאויב עס איז שטענדיק אַ קלאָר גאַנג פון אַקשאַנז וואָס קענען דערגרייכן אַ זיכער ציל, אַ מאָדעל איז אַ העכער מדרגה באַשרייַבונג פון אַ לייזונג. קאָד פון דער זעלביקער מאָדעל געווענדט צו צוויי פאַרשידענע מגילה קען זיין אַנדערש.

ווילן צו מאַכן אַן אַנאַלאַדזשי, מיר קענען טראַכטן פון אַ קוקינג רעצעפּט: ביידע האָבן קלאָר טריט צו דערגרייכן אַ ציל. אָבער, אַ מאָדעל איז מער ווי אַ פּרויעקט, פון וואָס איר קענען זען וואָס די רעזולטאַט און זייַן קעראַקטעריסטיקס זענען, אָבער די פּינטלעך סדר פון ימפּלאַמענטיישאַן דעפּענדס אויף אונדז וואס שרייַבן דעם קאָד.

פון וואָס איז אַ פּלאַן מוסטער?

רובֿ פּאַטערנז זענען דיסקרייבד זייער פאָרמאַלי אַזוי אַז מענטשן קענען רעפּראָדוצירן זיי אין פילע קאַנטעקסץ. לאָמיר זען אונטן די יסודות וואָס זענען פאָרשטעלן אין די באַשרייַבונג פון אַ מאָדעל:

  • די כוונה פון די מאָדעל בעקיצער באשרייבט ביידע די פּראָבלעם און די לייזונג.
  • די מאָוטאַוויישאַן ווייַטער דערקלערט די פּראָבלעם און די לייזונג אַז דער מאָדעל מאכט מעגלעך.
  • סטרוקטור פון קלאסן ווייזט יעדער טייל פון די מאָדעל און ווי זיי זענען שייַכות.
  • די קאָד בייַשפּיל אין איינער פון די מערסט פאָלקס פּראָגראַממינג שפראַכן מאכט עס גרינגער צו פֿאַרשטיין דעם געדאַנק הינטער דעם מאָדעל.

פארוואס נוצן זיי?

א פּראָגראַמיסט קענען אַנטוויקלען ווייכווארג אָן וויסן די עקזיסטענץ פון פּלאַן פּאַטערנז. פילע טאָן, און פֿאַר דעם סיבה זיי ינסטרומענט עטלעכע סקימז אָן געוואוסט עס. אָבער וואָס זאָל מיר פאַרברענגען צייט צו לערנען זיי?

  • די פּלאַן פּאַטערנז זענען אַ קיט פון געפרוווט און טעסטעד סאַלושאַנז צו פּראָסט פּראָבלעמס אין ווייכווארג פּלאַן. אפילו אויב איר קיינמאָל טרעפן די פּראָבלעמס, וויסן פּאַטערנז איז נאָך נוציק ווייַל עס לערנט איר ווי צו סאָלווע אַלע מינים פון פּראָבלעמס מיט אָבדזשעקט-אָריענטיד פּלאַן פּרינסאַפּאַלז.
  • די פּלאַן מאָדעלס defiזיי שאַפֿן אַ פּראָסט שפּראַך וואָס איר און דיין מאַנשאַפֿט קענען נוצן צו יבערגעבן מער יפעקטיוולי. איר קען זאָגן, "אָה, נאָר נוצן אַ סינגלעטאָן צו טאָן דאָס," און אַלעמען וועט פֿאַרשטיין די געדאַנק הינטער דיין פאָרשלאָג. עס איז ניט דאַרפֿן צו דערקלערן וואָס אַ סינגלעטאָן איז אויב איר וויסן דעם מוסטער און זייַן נאָמען.

קלאַסאַפאַקיישאַן פון פּלאַן פּאַטערנז

פּלאַן פּאַטערנז אַנדערש אין קאַמפּלעקסיטי, מדרגה פון דעטאַל און וואָג פון אָנווענדלעך אין די דיזיינד סיסטעם.

לויט אַנאַלאַדזשי, מיר קענען מאַכן אַ ינטערסעקשאַן סאַפער דורך ינסטאָלינג עטלעכע פאַרקער לייץ אָדער בויען אַ גאַנץ מולטילעוועל ויסבייַט מיט ונטערערד פּאַסידזשיז פֿאַר פּאַדעסטריאַנז.

די מערסט יקערדיק, נידעריק-מדרגה מאָדעלס זענען אָפט גערופן אידיאָמען . זיי יוזשאַוואַלי אַפּלייז בלויז צו אַ איין פּראָגראַממינג שפּראַך.

די מערסט וניווערסאַל און הויך-מדרגה מאָדעלס זענען אַרקאַטעקטשעראַל מאָדעלס . דעוועלאָפּערס קענען ינסטרומענט די פּאַטערנז אין כמעט קיין שפּראַך. ניט ענלעך אנדערע פּאַטערנז, זיי קענען זיין געוויינט צו פּלאַן די אַרקאַטעקטשער פון אַ גאַנץ אַפּלאַקיישאַן.

דערצו, אַלע מאָדעלס קענען זיין קלאַסאַפייד לויט זייער געפרואווט אָדער ציל. די דריי הויפּט קלאסן זענען:

כידעש נוזלעטער
דו זאלסט נישט פאַרפירן די מערסט וויכטיק נייַעס וועגן כידעש. צייכן אַרויף צו באַקומען זיי דורך E- בריוו.
  • קרייישאַנאַל מאָדעלס זיי צושטעלן מעקאַניזאַמז פֿאַר שאַפונג פון אַבדזשעקץ וואָס פאַרגרעסערן בייגיקייַט און רייוס פון יגזיסטינג קאָד.
  • סטראַקטשעראַל מאָדעלס זיי דערקלערן ווי צו אַסעמבאַל אַבדזשעקץ און קלאסן אין גרעסערע סטראַקטשערז, בעכעסקעם די סטראַקטשערז פלעקסאַבאַל און עפעקטיוו.
  • בעהאַוויאָראַל מאָדעלס זיי האַנדלען מיט עפעקטיוו קאָמוניקאַציע און אַסיינמאַנט פון ריספּאַנסאַבילאַטיז צווישן אַבדזשעקץ.

בייַשפּיל פון פּלאַן מוסטער אין לאַראַוועל: פאַסאַד

פאַקאַדע איז אַ סטראַקטשעראַל פּלאַן מוסטער וואָס גיט אַ סימפּלאַפייד צובינד צו אַ ביבליאָטעק, פריימווערק אָדער קיין אנדערע קאָמפּלעקס גאַנג פון קלאסן.

פּראָבלעם

לאָמיר יבערנעמען מיר דאַרפֿן צו מאַכן ווייכווארג אַרבעט, באזירט אויף אַ גרויס גאַנג פון אַבדזשעקץ וואָס געהערן צו אַ סאַפיסטאַקייטיד ביבליאָטעק אָדער פריימווערק. נאָרמאַללי, מיר וואָלט דאַרפֿן צו ינישאַלייז אַלע די אַבדזשעקץ, האַלטן שפּור פון דיפּענדאַנסיז, ויספירן מעטהאָדס אין די ריכטיק סדר, און אַזוי אויף.

ווי אַ רעזולטאַט, די געשעפט לאָגיק פון די קלאסן וואָלט זיין טייטלי קאַפּאַלד מיט די ימפּלאַמענטיישאַן דעטאַילס פון דריט-פּאַרטיי קלאסן, מאכן זיי שווער צו פֿאַרשטיין און פירן.

סאָלוזיאָנע

א facade איז אַ קלאַס וואָס גיט אַ פּשוט צובינד צו אַ קאָמפּלעקס סאַבסיסטעם וואָס כּולל פילע מאָווינג טיילן. א facade קען צושטעלן לימיטעד פאַנגקשאַנאַליטי קאַמפּערד מיט ארבעטן גלייַך מיט די סאַבסיסטאַם. אָבער, עס כולל בלויז די פֿעיִקייטן וואָס קאַסטאַמערז טאַקע זאָרגן וועגן.

האָבן איין facade עס איז נוציק ווען מיר דאַרפֿן צו ויסשטימען די אַפּ מיט אַ סאַפיסטאַקייטיד ביבליאָטעק וואָס האט דאַזאַנז פון פֿעיִקייטן, אָבער מיר דאַרפֿן בלויז אַ קליין טייל פון זייַן פאַנגקשאַנאַליטי.

פֿאַר בייַשפּיל, אַ אַפּ וואָס ופּלאָאַדס קורץ מאָדנע ווידיאס מיט קאַץ צו געזעלשאַפטלעך מידיאַ קען פּאַטענטשאַלי נוצן אַ פאַכמאַן ווידעא קאַנווערזשאַן ביבליאָטעק. אָבער, אַלע מיר טאַקע דאַרפֿן איז אַ קלאַס מיט די איין אופֿן encode(filename, format). נאָך קריייטינג אַזאַ אַ קלאַס און קאַנעקטינג עס צו די ווידעא קאַנווערזשאַן ביבליאָטעק, מיר וועלן האָבן אונדזער ערשטער facade.

פֿאַר בייַשפּיל, דער טעלעפאָן אָפּעראַטאָר פון אַ רופן צענטער איז ווי אַ facade. אין פאַקט, ווען מיר רופן אַ קראָם ס טעלעפאָן דינסט צו שטעלן אַ טעלעפאָן סדר, אַן אָפּעראַטאָר איז אונדזער facade צו אַלע די סערוויסעס און דיפּאַרטמאַנץ פון די קראָם. דער אָפּעראַטאָר גיט אַ פּשוט קול צובינד צו די אָרדערינג סיסטעם, צאָלונג גייטווייז און פאַרשידן עקספּרעס באַדינונגס.

פאַקטיש ביישפּיל אין PHP

טראכט וועגן פאַקאַדע ווי אַ פּשוט אַדאַפּטער פֿאַר עטלעכע קאָמפּלעקס סאַבסיסטאַמז. Facade יזאָלייץ די קאַמפּלעקסיטי אין אַ איין קלאַס און אַלאַוז אנדערע אַפּלאַקיישאַן קאָד צו נוצן די פּשוט צובינד.

אין דעם בייַשפּיל, Facade כיידז די קאַמפּלעקסיטי פון די YouTube API און FFmpeg ביבליאָטעק פֿון דעם קליענט קאָד. אַנשטאָט צו אַרבעטן מיט דאַזאַנז פון קלאסן, דער קליענט ניצט אַ פּשוט אופֿן אויף פאַסאַד.

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

כידעש נוזלעטער
דו זאלסט נישט פאַרפירן די מערסט וויכטיק נייַעס וועגן כידעש. צייכן אַרויף צו באַקומען זיי דורך E- בריוו.

לעצטע ארטיקלען

Veeam פֿעיִקייטן די מערסט פולשטענדיק שטיצן פֿאַר ראַנסאָמוואַרע, פֿון שוץ צו ענטפער און אָפּזוך

Coveware דורך Veeam וועט פאָרזעצן צו צושטעלן ענטפער באַדינונגס פֿאַר סייבער יקסטאָרשאַן אינצידענט. קאָוועוואַרע וועט פאָרשלאָגן פאָרענסיקס און רימעדייישאַן קייפּאַבילאַטיז ...

קסנומקס אפריל קסנומקס

גרין און דיגיטאַל רעוואלוציע: ווי פּרידיקטיוו וישאַלט איז טראַנספאָרמינג די אָיל און גאַז אינדוסטריע

פּרידיקטיוו וישאַלט איז רעוואַלושאַנייזינג די ייל & גאַז סעקטאָר, מיט אַן ינאַווייטיוו און פּראָואַקטיוו צוגאַנג צו פאַבריק פאַרוואַלטונג.…

קסנומקס אפריל קסנומקס

וק אַנטיטראַסט רעגולאַטאָר רייזאַז ביגטעטש שרעק איבער GenAI

די UK CMA האט ארויס אַ ווארענונג וועגן ביג טעק ס נאַטור אין די קינסטלעך סייכל מאַרק. דאָרט…

קסנומקס אפריל קסנומקס

Casa Green: ענערגיע רעוואָלוציע פֿאַר אַ סאַסטיינאַבאַל צוקונפֿט אין איטאליע

די "קאַסע גרין" דעקרעט, פארמולירט דורך די אייראפעישע יוניאַן צו פאַרבעסערן די ענערגיע עפעקטיווקייַט פון בנינים, האט פארענדיקט זיין לעגיסלאַטיווע פּראָצעס מיט ...

קסנומקס אפריל קסנומקס

לייענען כידעש אין דיין שפּראַך

כידעש נוזלעטער
דו זאלסט נישט פאַרפירן די מערסט וויכטיק נייַעס וועגן כידעש. צייכן אַרויף צו באַקומען זיי דורך E- בריוו.

גיי אונדז