Inversion of control
سافٹ ویئر انجینئرنگ میں، انورژن آف کنٹرول (آئی او سی) ایک ڈیزائن پیٹرن ہے جس میں کمپیوٹر پروگرام کے اپنی مرضی کے مطابق لکھے ہوئے حصے عام فریم ورک سے کنٹرول کا بہاؤ حاصل کرتے ہیں۔ "الٹا" کی اصطلاح تاریخی ہے: اس ڈیزائن کے ساتھ ایک سافٹ ویئر فن تعمیر طرز عمل کے پروگرامنگ کے مقابلے میں "الٹا" کنٹرول کرتا ہے۔ پروسیجرل پروگرامنگ میں، ایک پروگرام کا کسٹم کوڈ عام کاموں کو سنبھالنے کے لیے دوبارہ استعمال کے قابل لائبریریوں کو کال کرتا ہے، لیکن کنٹرول کے الٹ کے ساتھ، یہ وہ فریم ورک ہے جو کسٹم کوڈ کو کال کرتا ہے۔ GUI ماحول کے عروج کے بعد سے ایپلی کیشن ڈویلپمنٹ فریم ورک کے ذریعہ کنٹرول کا الٹا استعمال بڑے پیمانے پر کیا گیا ہے اور GUI ماحول اور ویب سرور ایپلی کیشن فریم ورک دونوں میں استعمال ہوتا رہتا ہے۔ کنٹرول کا الٹنا ایپلیکیشن پروگرامر کے بیان کردہ طریقوں سے فریم ورک کو قابل توسیع بناتا ہے۔ ایونٹ پر مبنی پروگرامنگ کو اکثر آئی او سی کا استعمال کرتے ہوئے نافذ کیا جاتا ہے تاکہ کسٹم کوڈ کو صرف واقعات کو سنبھالنے سے متعلق ہونے کی ضرورت ہو، جبکہ ایونٹ لوپ اور واقعات/پیغامات کی ترسیل کو فریم ورک یا رن ٹائم ماحول کے ذریعے سنبھالا جاتا ہے۔ ویب سرور ایپلیکیشن فریم ورک میں، ڈسپیچ کو عام طور پر روٹنگ کہا جاتا ہے، اور ہینڈلرز کو اینڈ پوائنٹ کہا جا سکتا ہے۔ جاوا پروگرامرز کی کمیونٹی میں "انورژن آف کنٹرول" کا جملہ بھی الگ سے استعمال ہونے لگا ہے تاکہ خاص طور پر جاوا فریم ورک جیسے اسپرنگ فریم ورک میں "آئی او سی کنٹینرز" کے ساتھ پائے جانے والے اشیاء کے انحصار کو انجیکشن لگانے کے نمونوں کا حوالہ دیا جا سکے۔ اس مختلف معنوں میں، "کنٹرول کا الٹنا" سے مراد فریم ورک کو انحصار کے نفاذ پر کنٹرول دینا ہے جو فریم ورک کنٹرول فلو (ایپلیکیشن کوڈ کے نفاذ کے وقت پر کنٹرول) دینے کے اصل معنی کے بجائے ایپلیکیشن آبجیکٹ کے ذریعہ استعمال ہوتے ہیں۔ کال بیک)۔ جائزہ ایک مثال کے طور پر، روایتی پروگرامنگ کے ساتھ، کسی ایپلیکیشن کا بنیادی فنکشن مینو لائبریری میں فنکشن کال کر سکتا ہے تاکہ دستیاب کمانڈوں کی فہرست ظاہر کی جا سکے اور صارف سے ایک کو منتخب کرنے کے لیے استفسار کیا جا سکے۔ اس طرح لائبریری منتخب کردہ آپشن کو فنکشن کال کی ویلیو کے طور پر واپس کرے گی، اور مرکزی فنکشن اس ویلیو کو متعلقہ کمانڈ کو انجام دینے کے لیے استعمال کرتا ہے۔ یہ انداز متن پر مبنی انٹرفیس میں عام تھا۔ مثال کے طور پر، ایک ای میل کلائنٹ نئی میل لوڈ کرنے، موجودہ میل کا جواب دینے، نئی میل بنانے وغیرہ کے لیے کمانڈ کے ساتھ اسکرین دکھا سکتا ہے، اور پروگرام پر عمل درآمد اس وقت تک بلاک رہے گا جب تک کہ صارف کمانڈ منتخب کرنے کے لیے کلید نہیں دباتا۔ دوسری طرف، کنٹرول کے الٹ کے ساتھ، پروگرام کو ایک سافٹ ویئر فریم ورک کا استعمال کرتے ہوئے لکھا جائے گا جو عام طرز عمل اور گرافیکل عناصر کو جانتا ہے، جیسے ونڈو سسٹم، مینو، ماؤس کو کنٹرول کرنا وغیرہ۔ کسٹم کوڈ فریم ورک کے لیے "خالی جگہوں کو بھرتا ہے"، جیسے کہ مینو آئٹمز کی میز کی فراہمی اور ہر آئٹم کے لیے کوڈ سبروٹین رجسٹر کرنا، لیکن یہ وہ فریم ورک ہے جو صارف کے اعمال کی نگرانی کرتا ہے اور جب مینو آئٹم کا انتخاب ہوتا ہے تو سبروٹین کو طلب کرتا ہے۔ میل کلائنٹ کی مثال میں، فریم ورک کی بورڈ اور ماؤس ان پٹ دونوں کی پیروی کر سکتا ہے اور صارف کے ذریعے طلب کردہ کمانڈ کو کال کر سکتا ہے، اور اسی وقت نیٹ ورک انٹرفیس کی نگرانی کر سکتا ہے تاکہ یہ معلوم کیا جا سکے کہ آیا نئے پیغامات آتے ہیں یا نہیں اور جب کچھ نیٹ ورک سرگرمی کا پتہ چل جائے تو اسکرین کو ریفریش کر سکتا ہے۔ اسی فریم ورک کو اسپریڈشیٹ پروگرام یا ٹیکسٹ ایڈیٹر کے لیے کنکال کے طور پر استعمال کیا جا سکتا ہے۔ اس کے برعکس، فریم ورک ویب براؤزرز، اسپریڈشیٹس یا ٹیکسٹ ایڈیٹرز کے بارے میں کچھ نہیں جانتا ؛ ان کی فعالیت کو نافذ کرنے کے لیے کسٹم کوڈ درکار ہوتا ہے۔ کنٹرول کا الٹ یہ مضبوط معنی رکھتا ہے کہ دوبارہ استعمال کے قابل کوڈ اور مسئلہ سے متعلق کوڈ آزادانہ طور پر تیار کیے جاتے ہیں حالانکہ وہ کسی ایپلی کیشن میں ایک ساتھ کام کرتے ہیں۔ کال بیکس، شیڈولرز، ایونٹ لوپس، اور ٹیمپلیٹ کا طریقہ ڈیزائن کے نمونوں کی مثالیں ہیں جو کنٹرول اصول کے الٹ کی پیروی کرتے ہیں، حالانکہ یہ اصطلاح عام طور پر آبجیکٹ پر مبنی پروگرامنگ کے تناظر میں استعمال ہوتی ہے۔ (انحصار انجکشن جاوا فریم ورک کے ذریعہ مقبول کردہ "انحصار کے نفاذ پر الٹا کنٹرول" کے علیحدہ، مخصوص خیال کی ایک مثال ہے۔) کنٹرول کے الٹ کو بعض اوقات "ہالی ووڈ کا اصول: ہمیں کال نہ کریں، ہم آپ کو کال کریں گے" کہا جاتا ہے۔ کنٹرول کا پس منظر الٹنا کمپیوٹر سائنس میں کوئی نئی اصطلاح نہیں ہے۔ مارٹن فاؤلر نے اس جملے کی صفت کا سراغ 1988 میں لگایا ہے، لیکن اس کا مائیکل جیکسن نے 1970 کی دہائی میں اپنے جیکسن اسٹرکچرڈ پروگرامنگ طریقہ کار میں بیان کردہ پروگرام الٹ کے تصور سے گہرا تعلق ہے۔ باٹم اپ پارسر کو ٹاپ ڈاؤن پارسر کے الٹ کے طور پر دیکھا جا سکتا ہے: ایک صورت میں، کنٹرول پارسر کے پاس ہوتا ہے، جبکہ دوسری صورت میں، یہ وصول کرنے والی ایپلی کیشن کے پاس ہوتا ہے۔ اس اصطلاح کو مائیکل میٹسن نے ایک مقالے میں استعمال کیا تھا (اس کے اصل معنی کے ساتھ ایک فریم ورک کالنگ ایپلی کیشن کوڈ کے بجائے اس کے برعکس)، اور پھر اسے وہاں سے اسٹیفانو مازوچی نے لیا اور 1999 میں اس نے ایک غیر فعال اپاچی سافٹ ویئر فاؤنڈیشن پروجیکٹ، ایولون میں مقبول کیا، جس میں اس نے پھانسی کے بہاؤ کو کنٹرول کرنے کے علاوہ بچے کے آبجیکٹ کے انحصار میں گزرنے والے پیرنٹ آبجیکٹ کا حوالہ دیا۔ اس جملے کو 2004 میں رابرٹ سی مارٹن اور مارٹن فاؤلر نے مزید مقبول کیا، جن میں سے مؤخر الذکر اس اصطلاح کی ابتدا 1980 کی دہائی سے کرتا ہے۔ تفصیل روایتی پروگرامنگ میں، کاروباری منطق کے بہاؤ کا تعین ان اشیاء سے ہوتا ہے جو مستحکم طور پر ایک دوسرے سے جڑے ہوتے ہیں۔ کنٹرول کے الٹ کے ساتھ، بہاؤ کا انحصار آبجیکٹ گراف پر ہوتا ہے جو پروگرام کے نفاذ کے دوران بنایا جاتا ہے۔ اس طرح کے متحرک بہاؤ کو آبجیکٹ انٹرایکشنز کے ذریعے ممکن بنایا جاتا ہے جن کی وضاحت تجریدوں کے ذریعے کی جاتی ہے۔ یہ رن ٹائم بائنڈنگ انحصار انجکشن یا سروس لوکیٹر جیسے میکانزم کے ذریعے حاصل کی جاتی ہے۔ آئی او سی میں، کوڈ کو تالیف کے دوران مستحکم طور پر بھی منسلک کیا جا سکتا ہے، لیکن کوڈ میں براہ راست حوالہ کے بجائے بیرونی ترتیب سے اس کی تفصیل کو پڑھ کر عمل درآمد کرنے کے لیے کوڈ تلاش کرنا۔ انحصار انجکشن میں، ایک منحصر آبجیکٹ یا ماڈیول کو رن ٹائم پر اس آبجیکٹ سے جوڑا جاتا ہے جس کی اسے ضرورت ہوتی ہے۔ پروگرام پر عمل درآمد کے دوران کون سا خاص مقصد انحصار کو پورا کرے گا عام طور پر جامد تجزیہ کا استعمال کرتے ہوئے مرتب کرنے کے وقت معلوم نہیں کیا جا سکتا۔ اگرچہ یہاں آبجیکٹ انٹرایکشن کے لحاظ سے بیان کیا گیا ہے، یہ اصول آبجیکٹ پر مبنی پروگرامنگ کے علاوہ دیگر پروگرامنگ کے طریقوں پر بھی لاگو ہو سکتا ہے۔ چل رہے پروگرام کے لیے اشیاء کو ایک دوسرے سے جوڑنے کے لیے، اشیاء کے پاس مطابقت پذیر انٹرفیس ہونا ضروری ہے۔ مثال کے طور پر، کلاس A انٹرفیس I کے لیے رویے کو تفویض کر سکتا ہے جسے کلاس B کے ذریعے نافذ کیا جاتا ہے ؛ پروگرام A اور B کو فوری طور پر پیش کرتا ہے، اور پھر B کو A میں داخل کرتا ہے۔ ایکس ڈی ای، 1985 بصری بنیادی (کلاسک)، 1991 کے لیے میسا پروگرامنگ ماحول استعمال کریں۔ ایچ ٹی ایم ایل ڈی او ایم ایونٹ اسپرنگ فریم ورک ASP.NET کور ٹیمپلیٹ میتھڈ پیٹرن مثال کوڈ ایچ ٹی ایم ایل ڈی او ایم ایونٹس ویب براؤزر ایچ ٹی ایم ایل میں ڈی او ایم ایونٹس کے لیے انورژن آف کنٹرول کو نافذ کرتے ہیں۔ ایپلیکیشن ڈویلپر کال بیک رجسٹر کرنے کے لیے استعمال کرتا ہے۔ ڈاکٹر ٹائپ ایچ ٹی ایم ایل> <ایچ ٹی ایم ایل لینگ = "این"> <ہیڈ> <میٹا چارسیٹ = "یو ٹی ایف-8"> <ٹائٹل> ڈی او ایم لیول 2 </ٹائٹل> </ہیڈ> <باڈی> <ایچ 1> ڈی او ایم لیول 2 ایونٹ ہینڈلر </ایچ 1> <پی> <اسپان آئی ڈی = "آؤٹ پٹ"> </اسپان> </لارج> </پی> <اسکرپٹ> ور رجسٹرڈ لسٹنر = فنکشن () {document.getElementById ("آؤٹ پٹ"). innerHTML = "<لارج> رجسٹرڈ سننے والے کو بلایا گیا۔ اگر آپ صفحہ پر کلک کرتے ہیں، تو آپ کا ویب براؤزر ایونٹ ہینڈلر کو کال کرے گا۔ "" ویب ایپلی کیشن فریم ورک "یہ مثال کوڈ ایک Asp.NetCore ویب ایپلی کیشن کے لیے ایک ویب ایپلی کیشن ہوسٹ بناتا ہے، ایک اختتامی نقطہ رجسٹر کرتا ہے، اور پھر اس فریم ورک کو کنٹرول منتقل کرتا ہے: وار بلڈر = WebApplication.CreateBuilder (ارگس) ؛ وار ایپ = builder.Build () ؛ app.MapGet ("، ") =" ہیلو ورلڈ! ") ؛ app.Run () ؛ تجریدی پرت آرکی ٹائپ پیٹرن اسنکرونس I/O پہلو پر مبنی پروگرامنگ کال بیک (کمپیوٹر سائنس) بندش (کمپیوٹر سائنس) تسلسل نمائندہ (CLI) انحصار الٹا اصول بہاؤ پر مبنی پروگرامنگ امپلیکیٹ انوکیشن انٹرپٹ ہینڈلر میسج پاسنگ موناڈ (فنکشنل پروگرامنگ) آبزرور پیٹرن شائع/سبسکرائب سروس لوکیٹر پیٹرن سگنل (کمپیوٹنگ) سافٹ ویئر فریم ورک اسٹریٹجی پیٹرن صارف ایگزٹ وزیٹر پیٹرن XSLT حوالہ جات بیرونی لنکس کنٹرول وضاحت اور عمل درآمد کے الٹ مثال کنٹرول سافٹ ویئر فن تعمیر آرکیٹیکچرل پیٹرن (کمپیوٹر سائنس) جاوا (پروگرامنگ زبان) پروگرامنگ اصول اجزاء پر مبنی سافٹ ویئر انجینئرنگ سافٹ ویئر ڈیزائن پیٹرن