ពេលវេលាអានប៉ាន់ស្មាន៖ 6 មីទីតូ។
គំរូរចនាមិនមែនជាកូដដែលយើងអាចចម្លង និងបញ្ចូលទៅក្នុងកម្មវិធីរបស់យើង ដូចដែលយើងអាចធ្វើជាមួយមុខងារស្តង់ដារ ឬបណ្ណាល័យ។ គំរូរចនាគឺជាគំនិតទូទៅដែលមានសមត្ថភាពដោះស្រាយបញ្ហាជាក់លាក់ណាមួយ។ ជាទូទៅ គំរូដែលមានព័ត៌មានលម្អិតដែលយើងអាចអនុវត្តតាម និងអនុវត្តដំណោះស្រាយដែលសមនឹងការពិតនៃកម្មវិធីរបស់យើង។
ម៉ូដែលច្រើនតែច្រឡំជាមួយក្បួនដោះស្រាយ ព្រោះគំនិតទាំងពីរពណ៌នាអំពីដំណោះស្រាយធម្មតាចំពោះបញ្ហាដែលគេស្គាល់មួយចំនួន។ ខណៈពេលដែលក្បួនដោះស្រាយមួយ។ defiប្រសិនបើតែងតែមានសំណុំសកម្មភាពច្បាស់លាស់ដែលអាចសម្រេចបាននូវគោលដៅជាក់លាក់មួយ គំរូគឺជាការពិពណ៌នាកម្រិតខ្ពស់នៃដំណោះស្រាយ។ កូដពីគំរូដូចគ្នាដែលបានអនុវត្តចំពោះកម្មវិធីពីរផ្សេងគ្នាអាចខុសគ្នា។
ដោយចង់បង្កើតភាពស្រដៀងគ្នា យើងអាចគិតពីរូបមន្តធ្វើម្ហូប៖ ទាំងពីរមានជំហានច្បាស់លាស់ដើម្បីសម្រេចគោលដៅមួយ។ ទោះជាយ៉ាងណាក៏ដោយ គំរូមួយគឺដូចជាគម្រោងមួយ ដែលអ្នកអាចមើលឃើញពីលទ្ធផល និងលក្ខណៈរបស់វា ប៉ុន្តែលំដាប់ជាក់លាក់នៃការអនុវត្តគឺអាស្រ័យលើយើងដែលសរសេរកូដ។
គំរូភាគច្រើនត្រូវបានពិពណ៌នាជាផ្លូវការ ដូច្នេះមនុស្សអាចផលិតវាឡើងវិញក្នុងបរិបទជាច្រើន។ តោះមើលធាតុខាងក្រោមដែលមាននៅក្នុងការពិពណ៌នាអំពីគំរូ៖
អ្នកសរសេរកម្មវិធីអាចបង្កើតកម្មវិធីដោយមិនដឹងពីអត្ថិភាពនៃគំរូរចនា។ មនុស្សជាច្រើនធ្វើ ហើយសម្រាប់ហេតុផលនេះ ពួកគេអនុវត្តគ្រោងការណ៍មួយចំនួនដោយមិនដឹងខ្លួន។ ប៉ុន្តែ ហេតុអ្វីបានជាយើងគួរចំណាយពេលរៀនសូត្រពីគេ?
គំរូនៃការរចនាមានភាពខុសប្លែកគ្នានៅក្នុងភាពស្មុគស្មាញ កម្រិតនៃព័ត៌មានលម្អិត និងទំហំនៃការអនុវត្តទូទាំងប្រព័ន្ធដែលបានរចនា។
ដោយភាពស្រដៀងគ្នា យើងអាចធ្វើឲ្យផ្លូវប្រសព្វមួយមានសុវត្ថិភាពជាងមុនដោយដំឡើងភ្លើងចរាចរណ៍ពីរបីកម្រិត ឬបង្កើតផ្លូវបំបែកពហុកម្រិតទាំងមូលជាមួយនឹងផ្លូវក្រោមដីសម្រាប់អ្នកថ្មើរជើង។
ម៉ូដែលកម្រិតទាបជាមូលដ្ឋានបំផុតត្រូវបានគេហៅថាជាញឹកញាប់ សព្វវចនាធិប្បាយ . ជាធម្មតាពួកវាអនុវត្តចំពោះភាសាសរសេរកម្មវិធីតែមួយប៉ុណ្ណោះ។
ម៉ូដែលសកលនិងកម្រិតខ្ពស់បំផុតគឺ គំរូស្ថាបត្យកម្ម . អ្នកអភិវឌ្ឍន៍អាចអនុវត្តលំនាំទាំងនេះជាភាសាស្ទើរតែទាំងអស់។ មិនដូចលំនាំផ្សេងទៀតទេ ពួកវាអាចត្រូវបានប្រើដើម្បីរចនាស្ថាបត្យកម្មនៃកម្មវិធីទាំងមូល។
ជាងនេះទៅទៀត ម៉ូដែលទាំងអស់អាចត្រូវបានចាត់ថ្នាក់តាមលក្ខណៈរបស់វា។ ព្យាយាម ឬគោលបំណង។ ថ្នាក់សំខាន់បីគឺ៖
Facade ។ គឺជាគំរូរចនារចនាសម្ព័ន្ធដែលផ្ដល់ចំណុចប្រទាក់សាមញ្ញទៅបណ្ណាល័យ ក្របខ័ណ្ឌ ឬសំណុំថ្នាក់ស្មុគស្មាញផ្សេងទៀត។
ឧបមាថាយើងត្រូវការបង្កើតកម្មវិធី ដោយផ្អែកលើសំណុំវត្ថុដ៏ធំដែលជាកម្មសិទ្ធិរបស់បណ្ណាល័យ ឬក្របខ័ណ្ឌស្មុគ្រស្មាញ។ ជាធម្មតា យើងត្រូវចាប់ផ្តើមវត្ថុទាំងអស់នេះ តាមដានភាពអាស្រ័យ ប្រតិបត្តិវិធីតាមលំដាប់លំដោយត្រឹមត្រូវ។ល។
ជាលទ្ធផល តក្កវិជ្ជាធុរកិច្ចនៃថ្នាក់នឹងត្រូវបានភ្ជាប់យ៉ាងតឹងរ៉ឹងទៅនឹងព័ត៌មានលម្អិតនៃការអនុវត្តនៃថ្នាក់ភាគីទីបី ដែលធ្វើឲ្យពួកគេពិបាកយល់ និងគ្រប់គ្រង។
ផ្លាក facade
គឺជាថ្នាក់ដែលផ្តល់នូវចំណុចប្រទាក់សាមញ្ញទៅប្រព័ន្ធរងដ៏ស្មុគស្មាញដែលមានផ្នែកផ្លាស់ទីជាច្រើន។ ក facade
អាចផ្តល់នូវមុខងារមានកម្រិតបើប្រៀបធៀបទៅនឹងការធ្វើការដោយផ្ទាល់ជាមួយប្រព័ន្ធរង។ ទោះយ៉ាងណាក៏ដោយ វារួមបញ្ចូលតែលក្ខណៈពិសេសដែលអតិថិជនពិតជាយកចិត្តទុកដាក់។
មានមួយ facade
វាមានប្រយោជន៍នៅពេលដែលយើងត្រូវការបញ្ចូលកម្មវិធីជាមួយបណ្ណាល័យទំនើបដែលមានមុខងាររាប់សិប ប៉ុន្តែយើងត្រូវការតែផ្នែកតូចមួយនៃមុខងាររបស់វាប៉ុណ្ណោះ។
ជាឧទាហរណ៍ កម្មវិធីដែលបង្ហោះវីដេអូកំប្លែងខ្លីៗជាមួយឆ្មាទៅកាន់ប្រព័ន្ធផ្សព្វផ្សាយសង្គមអាចប្រើបណ្ណាល័យបំលែងវីដេអូប្រកបដោយវិជ្ជាជីវៈ។ ទោះយ៉ាងណាក៏ដោយ អ្វីដែលយើងពិតជាត្រូវការគឺថ្នាក់ដែលមានវិធីសាស្ត្រតែមួយ encode(filename, format)
. បន្ទាប់ពីបង្កើតថ្នាក់បែបនេះ ហើយភ្ជាប់វាទៅបណ្ណាល័យបម្លែងវីដេអូ យើងនឹងមានថ្នាក់ដំបូងរបស់យើង facade
.
ឧទាហរណ៍ ប្រតិបត្តិករទូរស័ព្ទនៃមជ្ឈមណ្ឌលហៅទូរស័ព្ទគឺដូចជា ក 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" ដែលបង្កើតដោយសហភាពអឺរ៉ុប ដើម្បីបង្កើនប្រសិទ្ធភាពថាមពលនៃអគារ បានបញ្ចប់ដំណើរការនីតិប្បញ្ញត្តិរបស់ខ្លួនជាមួយនឹង…