Modern C++ Design
ماڈرن سی + + ڈیزائن: جنیرک پروگرامنگ اینڈ ڈیزائن پیٹرنز اپلائیڈ آندرے الیگزینڈرسیکو کی لکھی ہوئی ایک کتاب ہے، جسے 2001 میں ایڈیسن ویسلے نے شائع کیا تھا۔ اسے سکاٹ میئرز نے "سب سے اہم سی + + کتابوں میں سے ایک" قرار دیا ہے۔ یہ کتاب ٹیمپلیٹ میٹاپروگرامنگ نامی سی + + پروگرامنگ تکنیک کا استعمال کرتی ہے اور اس کی کھوج کرتی ہے۔ اگرچہ الیگزینڈر اسکو نے یہ تکنیک ایجاد نہیں کی تھی، لیکن اس نے اسے پروگرامرز میں مقبول کیا ہے۔ ان کی کتاب میں عملی مسائل کے حل شامل ہیں جن کا سامنا سی + + پروگرامرز کو کرنا پڑ سکتا ہے۔ کتاب کے کئی جملے اب سی + + کمیونٹی کے اندر عام اصطلاحات کے طور پر استعمال کیے جاتے ہیں: جدید سی + + (سی/سی + + سٹائل کے برخلاف)، پالیسی پر مبنی ڈیزائن اور ٹائپ لسٹ۔ کتاب میں بیان کردہ تمام کوڈ ان کی لائبریری لوکی میں مفت دستیاب ہیں۔ یہ کتاب 2001 سے کئی زبانوں میں دوبارہ شائع اور ترجمہ کی گئی ہے۔ پالیسی پر مبنی ڈیزائن پالیسی پر مبنی ڈیزائن، جسے پالیسی پر مبنی کلاس ڈیزائن یا پالیسی پر مبنی پروگرامنگ بھی کہا جاتا ہے، وہ اصطلاح ہے جو جدید سی + + ڈیزائن میں سی + + کے لیے ایک فقرے پر مبنی ڈیزائن کے نقطہ نظر کے لیے استعمال ہوتی ہے جسے پالیسیاں کہا جاتا ہے۔ اسے حکمت عملی کے نمونے کے مرتب وقت کے متغیر کے طور پر بیان کیا گیا ہے، اور اس کا تعلق سی + + ٹیمپلیٹ میٹاپروگرامنگ سے ہے۔ اسے سب سے پہلے C + + میں آندرے الیگزینڈرسیکو نے ماڈرن C + + ڈیزائن کے ساتھ اور C/C + + یوزرز جرنل میں اپنے کالم جنیرک <پروگرامنگ> کے ساتھ مقبول کیا تھا، اور یہ فی الحال C + + اور D کے ساتھ قریب سے وابستہ ہے کیونکہ اس کے لیے ٹیمپلیٹس کے لیے انتہائی مضبوط سپورٹ کے ساتھ ایک مرتب کی ضرورت ہوتی ہے، جو کہ 2003 سے پہلے عام نہیں تھا۔ پیرامیٹرائزڈ عام کوڈ پر مبنی اس ڈیزائن اپروچ کی پچھلی مثالوں میں ایم ایل زبانوں کے پیرامیٹرک ماڈیول (فنکٹر)، اور میموری مینجمنٹ پالیسی کے لیے سی + + الاکیٹر شامل ہیں۔ پالیسی پر مبنی ڈیزائن میں مرکزی فقرہ ایک کلاس ٹیمپلیٹ ہے (جسے میزبان کلاس کہا جاتا ہے)، جس میں کئی قسم کے پیرامیٹرز کو ان پٹ کے طور پر لیا جاتا ہے، جو صارف کے منتخب کردہ اقسام (جسے پالیسی کلاسز کہا جاتا ہے) کے ساتھ فوری ہوتے ہیں، ہر ایک ایک خاص مضمر انٹرفیس کو نافذ کرتا ہے (جسے پالیسی کہا جاتا ہے)، اور فوری میزبان کلاس کے رویے کے کچھ آرتھوگنل (یا زیادہ تر آرتھوگنل) پہلو کو شامل کرتا ہے۔ ہر پالیسی کے لیے مختلف، ڈبے میں بند نفاذ کے سیٹ کے ساتھ مل کر ایک میزبان کلاس کی فراہمی کے ذریعے، ایک لائبریری یا ماڈیول مختلف طرز عمل کے امتزاج کی ایک متغیر تعداد کی حمایت کر سکتا ہے، جسے مرتب کرنے کے وقت حل کیا جاتا ہے، اور میزبان کلاس ٹیمپلیٹ کے فوری طور پر فراہم کردہ مختلف پالیسی کلاسوں کو ملا کر اور ملا کر منتخب کیا جاتا ہے۔ مزید برآں، کسی دی گئی پالیسی کے حسب ضرورت نفاذ کو لکھ کر، پالیسی پر مبنی لائبریری کو ایسے حالات میں استعمال کیا جا سکتا ہے جن میں لائبریری کے نفاذ کار کے غیر متوقع طرز عمل کی ضرورت ہوتی ہے۔ یہاں تک کہ ایسے معاملات میں بھی جہاں ہر پالیسی کا ایک سے زیادہ نفاذ کبھی استعمال نہیں کیا جائے گا، کسی کلاس کو پالیسیوں میں تحلیل کرنے سے ڈیزائن کے عمل میں مدد مل سکتی ہے، ماڈیولرٹی میں اضافہ کرکے اور بالکل واضح طور پر جہاں آرتھوگنل ڈیزائن کے فیصلے کیے گئے ہیں۔ اگرچہ سافٹ ویئر کے اجزاء کو متغیر ماڈیولز سے باہر جمع کرنا ایک نئے تصور سے بہت دور ہے، لیکن پالیسی پر مبنی ڈیزائن ایک اختراع کی نمائندگی کرتا ہے جس طرح سے یہ انفرادی طبقے کے رویے کی وضاحت کی (نسبتا کم) سطح پر اس تصور کو لاگو کرتا ہے۔ پالیسی کلاسوں میں کال بیکس سے کچھ مماثلت ہوتی ہے، لیکن اس میں فرق ہوتا ہے، کسی ایک فنکشن پر مشتمل ہونے کے بجائے، ایک پالیسی کلاس میں عام طور پر کئی متعلقہ افعال (طریقے) ہوتے ہیں، جو اکثر ریاستی متغیرات یا دیگر سہولیات جیسے کہ نیسٹڈ اقسام کے ساتھ مل جاتے ہیں۔ ایک پالیسی پر مبنی میزبان طبقے کو ایک قسم کے میٹا فنکشن کے طور پر سوچا جا سکتا ہے، جس میں ان پٹ کے طور پر اقسام کی نمائندگی کرنے والے طرز عمل کا ایک مجموعہ لیا جاتا ہے، اور آؤٹ پٹ کے طور پر ایک قسم کی واپسی ہوتی ہے جو ان طرز عمل کو ایک فعال مجموعی میں جوڑنے کے نتیجے کی نمائندگی کرتی ہے۔ (ایم پی ایل میٹا فنکشنز کے برعکس، تاہم، آؤٹ پٹ کی نمائندگی عام طور پر نیسٹڈ آؤٹ پٹ ٹائپ کے بجائے فوری میزبان کلاس خود کرتی ہے۔) پالیسی کے فقرے کی ایک اہم خصوصیت یہ ہے کہ، عام طور پر (اگرچہ یہ سختی سے ضروری نہیں ہے)، میزبان طبقہ (عوامی) متعدد وراثت کا استعمال کرتے ہوئے اپنی ہر پالیسی کلاس سے (خود کو چائلڈ کلاس بنائے گا) اخذ کرے گا۔ (متبادل میزبان طبقے کے لیے یہ ہے کہ وہ محض ہر پالیسی کلاس کی قسم کے ممبر متغیر کو شامل کرے، یا پھر نجی طور پر پالیسی کلاسوں کو وراثت میں حاصل کرے ؛ تاہم پالیسی کلاسوں کو عوامی طور پر وراثت میں حاصل کرنے کا بڑا فائدہ یہ ہے کہ پالیسی کلاس نئے طریقے شامل کر سکتی ہے، جو فوری میزبان طبقے کے ذریعے وراثت میں ملے ہیں اور اپنے صارفین کے لیے قابل رسائی ہیں، جن کے بارے میں میزبان طبقے کو خود جاننے کی بھی ضرورت نہیں ہے۔) پالیسی کے اس پہلو کی ایک قابل ذکر خصوصیت یہ ہے کہ، آبجیکٹ پر مبنی پروگرامنگ سے متعلق، پالیسیاں بیس کلاس اور مشتق کلاس کے درمیان تعلقات کو الٹ دیتی ہیں-جبکہ او او پی انٹرفیس میں روایتی طور پر (تجریدی) بیس کلاسز اور مشتق کلاسوں کے ذریعے انٹرفیس کے نفاذ کی نمائندگی کی جاتی ہے، پالیسی پر مبنی ڈیزائن میں مشتق (میزبان) کلاس انٹرفیس کی نمائندگی کرتی ہے اور بیس (پالیسی) کلاس انہیں نافذ کرتی ہے۔ پالیسیوں کے معاملے میں، عوامی وراثت میزبان اور پالیسی طبقے کے درمیان تعلقات کی نمائندگی نہیں کرتی ہے۔ اگرچہ اسے روایتی طور پر او او پی سیاق و سباق میں ڈیزائن کی خرابی کا ثبوت سمجھا جائے گا، لیکن یہ پالیسی کے فقرے کے تناظر میں لاگو نہیں ہوتا ہے۔ ان کے موجودہ اوتار میں پالیسیوں کا ایک نقصان یہ ہے کہ پالیسی انٹرفیس میں کوڈ میں براہ راست، واضح نمائندگی نہیں ہے، بلکہ ڈک ٹائپنگ کے ذریعے اس کی واضح طور پر وضاحت کی گئی ہے، اور تبصرے میں اسے الگ سے اور دستی طور پر دستاویز کیا جانا چاہیے۔ بنیادی خیال یہ ہے کہ قسم کو مقررہ نفاذ اور انٹرفیس، پالیسی پر مبنی طبقے، اور مختلف پالیسیوں میں تقسیم کرنے کے لیے مشترک تغیر کے تجزیے کا استعمال کیا جائے۔ چال یہ جاننا ہے کہ مرکزی طبقے میں کیا جاتا ہے، اور کسی کو کون سی پالیسیاں بنانی چاہئیں۔ مذکورہ مضمون مندرجہ ذیل جواب دیتا ہے: جہاں کہیں بھی ہمیں ممکنہ محدود ڈیزائن کا فیصلہ کرنے کی ضرورت ہوگی، ہمیں اس فیصلے کو ملتوی کرنا چاہیے، ہمیں اسے مناسب نام والی پالیسی کے حوالے کرنا چاہیے۔ پالیسی کلاسز میں نفاذ، قسم کی تعریفیں وغیرہ شامل ہو سکتی ہیں۔ بنیادی طور پر، مرکزی ٹیمپلیٹ کلاس کا ڈیزائنر اس بات کی وضاحت کرے گا کہ پالیسی کلاسوں کو کیا فراہم کرنا چاہیے، انہیں کس حسب ضرورت نکات کو نافذ کرنے کی ضرورت ہے۔ پالیسیوں کا ایک اچھا مجموعہ بنانا ایک نازک کام ہو سکتا ہے، صرف صحیح تعداد (مثال کے طور پر، کم از کم ضروری)۔ مختلف حسب ضرورت نکات، جو ایک ساتھ تعلق رکھتے ہیں، کو ایک پالیسی دلیل میں جانا چاہیے، جیسے کہ اسٹوریج پالیسی، توثیق کی پالیسی وغیرہ۔ گرافک ڈیزائنرز اپنی پالیسیوں کو ایک نام دینے کے قابل ہوتے ہیں، جو تصورات کی نمائندگی کرتے ہیں، نہ کہ وہ جو کارروائیوں یا معمولی نفاذ کی تفصیلات کی نمائندگی کرتے ہیں۔ پالیسی پر مبنی ڈیزائن میں دیگر مفید تکنیکیں شامل ہو سکتی ہیں۔ مثال کے طور پر، ٹیمپلیٹ کے طریقہ کار کے نمونے کو مرتب کرنے کے وقت کے لیے دوبارہ تشریح کی جا سکتی ہے، تاکہ ایک مرکزی کلاس میں ایک کنکال الگورتھم ہو، جو حسب ضرورت کچھ پالیسیوں کے مناسب افعال کی نشاندہی کرتا ہے۔ یہ سی + + کے مستقبل کے ورژن میں تصورات کے ذریعے متحرک طور پر حاصل کیا جائے گا۔ ذیل میں پیش کی گئی سادہ مثال سی + + ہیلو ورلڈ پروگرام کی ایک سادہ (من گھڑت) مثال ہے، جہاں پرنٹ کیا جانے والا متن اور اسے پرنٹ کرنے کا طریقہ پالیسیوں کا استعمال کرتے ہوئے منقطع کیا جاتا ہے۔ اس مثال میں، ہیلو ورلڈ ایک میزبان کلاس ہے جہاں یہ دو پالیسیاں لیتا ہے، ایک یہ بتانے کے لیے کہ پیغام کو کیسے دکھایا جانا چاہیے اور دوسرا اصل پیغام کو چھاپنے کے لیے۔ نوٹ کریں کہ عام نفاذ رن میں ہے اور اس لیے کوڈ کو مرتب کرنے سے قاصر ہے جب تک کہ دونوں پالیسیاں (پرنٹ اور میسج) فراہم نہ کی جائیں۔ #include <iostोटریم> #include <سٹرنگ> ٹیمپلیٹ <ٹائپ نام آؤٹ پٹ پالیسی، ٹائپ نام لینگویج پالیسی> کلاس ہیلو ورلڈ: پرائیویٹ آؤٹ پٹ پالیسی، پرائیویٹ لینگویج پالیسی {پبلک:// بیہویئر میتھڈ۔ کالعدم رن () کانسٹ {// دو پالیسی طریقے۔ پرنٹ (میسج ()) ؛} پرائیویٹ: لینگویج پالیسی کا استعمال کرتے ہوئے:: میسج ؛ آؤٹ پٹ پالیسی کا استعمال کرتے ہوئے:: پرنٹ ؛} کلاس آؤٹ پٹ پالیسی رائٹ ٹوکاؤٹ {محفوظ: ٹیمپلیٹ <ٹائپ نام میسج ٹائپ> وایڈ پرنٹ (میسج ٹائپ & & میسج) کانسٹ {ایس ٹی ڈی:: کاؤٹ <<میسج <<ایس ٹی ڈی:: اینڈل;}} ؛ کلاس لینگویج پالیسی انگلش {محفوظ: ایس ٹی ڈی:: سٹرنگ میسج () کانسٹ {واپسی "ہیلو، ورلڈ! ";}} ؛ کلاس لینگویج پولیسی جرمن {محفوظ: اسٹینڈ:: سٹرنگ میسج () کانسٹ {ریٹرن" ہیلو ویلٹ! "؛}} ؛ انٹی مین () {// مثال 1 ہیلو ورلڈ انگلش کا استعمال کرتے ہوئے = ہیلو ورلڈ <آؤٹ پٹ پالیسی رائٹ ٹوکاؤٹ، لینگویج پالیسی انگلش> ؛ ہیلو ورلڈ انگلش ہیلو _ ورلڈ ؛ hello_world.Run () ؛// پرنٹس" ہیلو، ورلڈ! " //مثال 2// وہی کرتا ہے، لیکن زبان کی ایک اور پالیسی استعمال کرتا ہے۔ ہیلو ورلڈ جرمن = ہیلو ورلڈ <آؤٹ پٹ پالیسی رائٹ ٹوکاؤٹ، لینگویج پالیسی جرمن> ؛ ہیلو ورلڈ جرمن ہیلو _ ورلڈ 2 ؛ hello_world2.Run () ؛// پرنٹس "ہیلو ویلٹ!" کا استعمال کرتے ہوئے۔ ڈیزائنر ممبر فنکشن پرنٹ کے ساتھ نئی کلاسیں شامل کر کے آسانی سے مزید آؤٹ پٹ پالیسیاں لکھ سکتے ہیں اور انہیں نئی آؤٹ پٹ پالیسیوں کے طور پر لے سکتے ہیں۔ لوکی لائبریری ایک سی + + سافٹ ویئر لائبریری کا نام ہے جسے آندرے الیگزینڈرسیکو نے اپنی کتاب ماڈرن سی + + ڈیزائن کے حصے کے طور پر لکھا ہے۔ لائبریری سی + + ٹیمپلیٹ میٹاپروگرامنگ کا وسیع استعمال کرتی ہے اور عام طور پر استعمال ہونے والے کئی ٹولز کو لاگو کرتی ہے: ٹائپ لسٹ، فنکٹر، سنگلٹن، سمارٹ پوائنٹر، آبجیکٹ فیکٹری، وزیٹر اور ملٹی میتھڈز۔ اصل میں لائبریری صرف دو انتہائی معیاری مطابقت پذیر سی + + مرتب (کوڈ واریر اور کومو سی/سی + +) کے ساتھ مطابقت رکھتی تھی: بعد کی کوششوں نے اسے مرتب کرنے والوں کی ایک وسیع صف کے ساتھ قابل استعمال بنا دیا ہے (بشمول پرانے بصری سی + + 6, بورلینڈ سی + + بلڈر 6, کلانگ اور جی سی سی)۔ مرتب کرنے والے دکانداروں نے لوکی کو مطابقت کے معیار کے طور پر استعمال کیا، جس سے تعمیل کرنے والے مرتب کرنے والوں کی تعداد میں مزید اضافہ ہوا۔ لوکی کی دیکھ بھال اور مزید ترقی ایک اوپن سورس کمیونٹی کے ذریعے جاری رکھی گئی ہے جس کی قیادت پیٹر کمل اور رچرڈ اسپوساٹو نے بطور سورس فورج پروجیکٹ کی ہے۔ بہت سے لوگوں کے جاری تعاون سے لائبریری کی مجموعی مضبوطی اور فعالیت میں بہتری آئی ہے۔ لوکی اب کتاب سے منسلک نہیں ہے کیونکہ اس میں پہلے سے ہی بہت سارے نئے اجزاء موجود ہیں (جیسے۔ اسٹرانگ پی ٹی آر، پرنٹ ایف، اور اسکوپ گارڈ)۔ لوکی نے اسی طرح کے ٹولز اور فعالیت کو متاثر کیا جو اب بوسٹ لائبریری کلیکشن میں بھی موجود ہیں۔ بوسٹ (C + + لائبریریاں) مکسین حوالہ جات بیرونی لنکس الیگزینڈرسیکو کی ویب سائٹ (کتاب کی غلطی کے ساتھ) اسمارٹ پوائنٹرز (کتاب کا نمونہ باب) کتاب کے ناشر کا اصل سورس کوڈ 2001 غیر افسانوی کتابیں C + + کے بارے میں کتابیں