Болжолдуу окуу убактысы: 6 мүнөт
Дизайн үлгүсү стандарттуу функциялар же китепканалар менен жасай тургандай, биз көчүрүп алып, программабызга киргизе турган код эмес. Дизайн үлгүсү белгилүү бир маселени чечүүгө жөндөмдүү жалпы түшүнүк. Негизинен биз анын деталдарын ээрчип, программабыздын реалдуулугуна туура келген чечимди ишке ашыра турган модель.
Моделдерди көбүнчө алгоритмдер менен чаташтырышат, анткени эки түшүнүк тең кээ бир белгилүү маселелердин типтүү чечимдерин сүрөттөйт. Алгоритм болуп жатканда defiБелгилүү бир максатка жетүү мүмкүн болгон иш-аракеттердин так комплекси ар дайым бар болсо, модель чечимдин жогорку деңгээлдеги сүрөттөлүшү болуп саналат. Эки башка программага колдонулган бир эле моделдин коду ар кандай болушу мүмкүн.
Аналогия жасагыбыз келсе, биз тамак даярдоонун рецепти жөнүндө ойлонсок болот: экөө тең максатка жетүү үчүн ачык кадамдарга ээ. Бирок, модель көбүрөөк долбоорго окшош, анын жыйынтыгы жана анын мүнөздөмөлөрү кандай экенин көрө аласыз, бирок ишке ашыруунун так тартиби кодду жазган бизден көз каранды.
Көпчүлүк үлгүлөр абдан формалдуу сүрөттөлгөн, ошондуктан адамдар аларды көптөгөн контексттерде кайра чыгара алышат. Төмөндө моделдин сүрөттөлүшүндө бар элементтерди карап көрөлү:
Программист программалык камсыздоону дизайн үлгүлөрүнүн бар экенин билбей туруп иштеп чыга алат. Көпчүлүгү жасайт, ошол себептүү кээ бир схемаларды билбей туруп ишке ашырышат. Бирок эмне үчүн биз аларды үйрөнүүгө убакыт коротушубуз керек?
Дизайн үлгүлөрү татаалдыгы, деталдык деңгээли жана долбоорлонгон тутумда колдонулуу масштабы боюнча айырмаланат.
Аналогия боюнча, биз бир нече светофорлорду орнотуу же жөө жүргүнчүлөр үчүн жер астындагы өтмөктөр менен бүтүндөй көп баскычтуу өтмөк куруу менен кесилишти коопсуз кыла алабыз.
Эң негизги, төмөнкү деңгээлдеги моделдер көбүнчө деп аталат идиомалар . Алар, адатта, бир гана программалоо тилине колдонулат.
Эң универсалдуу жана жогорку деңгээлдеги моделдер архитектуралык моделдер . Иштеп чыгуучулар бул үлгүлөрдү дээрлик каалаган тилде ишке ашыра алышат. Башка үлгүлөрдөн айырмаланып, алар бүтүндөй колдонмонун архитектурасын долбоорлоо үчүн колдонулушу мүмкүн.
Мындан тышкары, бардык моделдер алардын жараша классификацияланышы мүмкүн аракет кылды же максат. үч негизги класстар болуп төмөнкүлөр саналат:
жакшыдай китепканага, алкактарга же класстардын башка татаал топтомуна жөнөкөйлөштүрүлгөн интерфейсти камсыз кылган структуралык дизайн үлгүсү.
Татаал китепканага же рамкага таандык объекттердин чоң топтомуна негизделген программалык камсыздоону иштешибиз керек деп ойлойлу. Адатта, биз бул объекттердин баарын инициализациялашыбыз керек, көз карандылыктарды көзөмөлдөшүбүз, методдорду туура тартипте аткаруубуз керек жана башкалар.
Натыйжада, класстардын бизнес логикасы үчүнчү жактын класстарынын ишке ашыруу деталдары менен тыгыз байланышта болуп, аларды түшүнүүнү жана башкарууну кыйындатат.
Una facade
көптөгөн кыймылдуу бөлүктөрдү камтыган татаал подсистемага жөнөкөй интерфейсти камсыз кылган класс. А facade
подсистема менен түздөн-түз иштөөгө салыштырмалуу чектелген функцияларды камсыздай алат. Бирок, ал кардарларга чындап көңүл бурган функцияларды гана камтыйт.
Бирөө бар facade
бул колдонмону ондогон өзгөчөлүктөргө ээ татаал китепкана менен интеграциялоо керек болгондо пайдалуу, бирок бизге анын функционалдуулугунун бир аз гана бөлүгү керек.
Мисалы, мышыктар тартылган кыска күлкүлүү видеолорду социалдык медиага жүктөгөн колдонмо профессионалдуу видео конвертациялоо китепканасын колдонушу мүмкүн. Бирок, бизге чындап эле керек болгон жалгыз методу бар класс encode(filename, format)
. Мындай классты түзүп, аны видеоконвертациялоо китепканасына туташтыргандан кийин, биз биринчи класска ээ болобуз facade
.
Мисалы, колл-борбордун телефон оператору А facade
. Негизи дүкөндүн телефон кызматына телефон аркылуу заказ берсек, оператор биздики facade
дүкөндүн бардык кызматтарына жана бөлүмдөрүнө. Оператор заказ берүү системасына, төлөм шлюздарына жана ар кандай жеткирүү кызматтарына жөнөкөй үн интерфейсин берет.
ойлон жакшыдай кээ бир татаал подсистемалар үчүн жөнөкөй адаптер катары. 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
Veeam тарабынан Coveware кибер опузалап инциденттерге жооп берүү кызматтарын көрсөтүүнү улантат. Coveware криминалистика жана ремедиация мүмкүнчүлүктөрүн сунуштайт ...
Болжолдуу тейлөө заводду башкарууга инновациялык жана жигердүү мамиле кылуу менен мунай жана газ секторун революция кылып жатат.…
Улуу Британиянын CMA жасалма интеллект рыногунда Big Tech жүрүм-туруму жөнүндө эскертүү берди. Ал жерде…
Имараттардын энергетикалык натыйжалуулугун жогорулатуу үчүн Европа Биримдиги тарабынан иштелип чыккан "Case Green" Декрети өзүнүн мыйзам чыгаруу процессин аяктады ...