پڑھنے کا تخمینہ وقت: 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
Veeam کی طرف سے Coveware سائبر بھتہ خوری کے واقعات کے ردعمل کی خدمات فراہم کرتا رہے گا۔ Coveware فرانزک اور تدارک کی صلاحیتیں پیش کرے گا…
پیشن گوئی کی دیکھ بھال تیل اور گیس کے شعبے میں انقلاب برپا کر رہی ہے، پلانٹ کے انتظام کے لیے ایک جدید اور فعال نقطہ نظر کے ساتھ۔
UK CMA نے مصنوعی ذہانت کے بازار میں بگ ٹیک کے رویے کے بارے میں ایک انتباہ جاری کیا ہے۔ وہاں…
عمارتوں کی توانائی کی کارکردگی کو بڑھانے کے لیے یورپی یونین کی طرف سے تیار کردہ "گرین ہاؤسز" فرمان نے اپنے قانون سازی کے عمل کو اس کے ساتھ ختم کیا ہے…