Тооцоолсон унших хугацаа: 6 минути
Дизайн загвар нь стандарт функцууд эсвэл номын сантай адил хуулж аваад програмдаа оруулах код биш юм. Загварын загвар нь тодорхой асуудлыг шийдвэрлэх чадвартай ерөнхий ойлголт юм. Үндсэндээ бид нарийвчилсан мэдээллийг дагаж мөрдөж, хөтөлбөрийнхөө бодит байдалд тохирсон шийдлийг хэрэгжүүлэх боломжтой загвар юм.
Загваруудыг ихэвчлэн алгоритмтай андуурдаг, учир нь эдгээр ойлголтууд нь зарим мэдэгдэж буй асуудлын ердийн шийдлүүдийг тодорхойлдог. Алгоритм байхад defiХэрэв тодорхой зорилгод хүрч чадах тодорхой үйлдлүүд үргэлж байдаг бол загвар нь шийдлийн дээд түвшний тайлбар юм. Хоёр өөр программд хэрэглэгдэх нэг загварын код өөр байж болно.
Аналогийг хийхийг хүсвэл бид хоол хийх жорыг бодож болно: хоёуланд нь зорилгодоо хүрэх тодорхой алхамууд байдаг. Гэсэн хэдий ч загвар нь төсөлтэй илүү төстэй бөгөөд үүний үр дүн, түүний шинж чанарууд юу болохыг харж болно, гэхдээ хэрэгжүүлэх яг дараалал нь кодыг бичдэг хүнээс хамаарна.
Ихэнх хэв маягийг маш албан ёсоор дүрсэлсэн байдаг тул хүмүүс тэдгээрийг олон нөхцөл байдалд хуулбарлах боломжтой. Загварын тайлбарт байгаа элементүүдийг доороос харцгаая.
Програмист хүн дизайны хэв маяг байгааг мэдэхгүй байж программ хангамжийг хөгжүүлж чадна. Олонх нь үүнийг хийдэг бөгөөд энэ шалтгааны улмаас тэд зарим схемийг мэдэлгүйгээр хэрэгжүүлдэг. Гэхдээ бид яагаад тэдэнд суралцах цаг гаргах ёстой гэж?
Дизайн загварууд нь нарийн төвөгтэй байдал, нарийвчлалын түвшин, зохион бүтээгдсэн системд хэрэглэх цар хүрээ зэргээрээ ялгаатай байдаг.
Үүнтэй адилаар бид хэд хэдэн гэрлэн дохио тавих эсвэл явган зорчигчдод зориулсан газар доорхи гарц бүхий олон түвшний уулзвар барих замаар уулзварыг аюулгүй болгож чадна.
Хамгийн энгийн, доод түвшний загваруудыг ихэвчлэн дууддаг хэлц үгс . Тэдгээр нь ихэвчлэн зөвхөн нэг програмчлалын хэлэнд хамаарна.
Хамгийн түгээмэл, өндөр түвшний загварууд архитектурын загварууд . Хөгжүүлэгчид эдгээр хэв маягийг бараг ямар ч хэл дээр хэрэгжүүлэх боломжтой. Бусад загвараас ялгаатай нь тэдгээрийг бүхэл бүтэн хэрэглээний архитектурыг зохион бүтээхэд ашиглаж болно.
Цаашилбал, бүх загварыг тэдгээрийн дагуу ангилж болно оролдсон эсвэл зорилго. Гурван үндсэн анги нь:
Гадна фасад нь номын сан, фреймворк эсвэл бусад цогц ангиудын хялбаршуулсан интерфейсээр хангадаг бүтцийн дизайны загвар юм.
Нарийвчилсан номын сан эсвэл фреймворкт хамаарах олон тооны объект дээр тулгуурлан програм хангамжийг ажиллуулах шаардлагатай байна гэж бодъё. Ер нь бид эдгээр бүх объектыг эхлүүлэх, хамаарлыг хянах, аргуудыг зөв дарааллаар гүйцэтгэх гэх мэт шаардлагатай байдаг.
Үүний үр дүнд ангиудын бизнесийн логик нь гуравдагч талын ангиудын хэрэгжилтийн нарийвчилсан мэдээлэлтэй нягт уялдаж, ойлгох, удирдахад хэцүү болно.
Una 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 by Veeam нь кибер хулгайн гэмт хэргийн хариу арга хэмжээг үргэлжлүүлэн үзүүлэх болно. Coveware нь шүүх эмнэлэг, нөхөн сэргээх чадварыг санал болгоно ...
Урьдчилан таамагласан засвар үйлчилгээ нь газрын тос, байгалийн хийн салбарт хувьсгал хийж, үйлдвэрийн менежментэд шинэлэг, санаачлагатай ханддаг.…
Их Британийн CMA хиймэл оюун ухааны зах зээл дэх Big Tech-ийн зан байдлын талаар анхааруулга гаргажээ. Тэнд…
Барилгын эрчим хүчний үр ашгийг дээшлүүлэх зорилгоор Европын холбооноос гаргасан "Case Green" тогтоол нь хууль тогтоох үйл явцаа дуусгасан ...