ہائے! ہم آج کے سبق کو جاوا میں Encapsulation کے لیے وقف کریں گے اور گیٹ کے بالکل باہر مثالوں کے ساتھ شروع کریں گے:) یہاں آپ کے پاس ایک عام سوڈا ڈسپنسنگ مشین ہے ۔ میرے پاس آپ کے لیے ایک سوال ہے: یہ کیسے کام کرتا ہے؟ ایک تفصیلی جواب دینے کی کوشش کریں: سوڈا کہاں سے آتا ہے؟ اندرونی درجہ حرارت کو کیسے برقرار رکھا جاتا ہے؟ برف کہاں ذخیرہ ہے؟ مشین کو کیسے پتہ چلے گا کہ کون سا شربت ڈالنا ہے؟ شاید آپ کے پاس ان سوالات کے جوابات نہیں ہیں۔ ٹھیک ہے، شاید ہر کوئی یہ مشینیں استعمال نہیں کرتا۔ وہ فی الحال اتنے مقبول نہیں ہیں۔ آئیے ایک اور مثال آزماتے ہیں۔ ایسی چیز جسے آپ یقینی طور پر روزانہ کئی بار استعمال کرتے ہیں۔ اوہ، میرے پاس ایک خیال ہے! مجھے بتائیں کہ گوگل سرچ انجن کیسے کام کرتا ہے۔ یہ آپ کے درج کردہ الفاظ کے بارے میں معلومات کو کس طرح تلاش کرتا ہے؟ یہ نتائج سب سے اوپر کیوں ہیں اور دوسرے نہیں؟ اگرچہ آپ روزانہ گوگل استعمال کرتے ہیں، شاید آپ کو معلوم نہیں ہوگا۔ لیکن اس سے کوئی فرق نہیں پڑتا۔ سب کے بعد، یہ آپ کو جاننے کی ضرورت نہیں ہے. آپ یہ سوچے بغیر سرچ انجن استعمال کر سکتے ہیں کہ یہ کیسے کام کرتا ہے۔ آپ مشین سے سوڈا خرید سکتے ہیں یہ جانے بغیر کہ یہ کیسے بنایا گیا ہے۔ آپ اندرونی دہن کے انجن کے کام کرنے کے طریقے اور ہائی اسکول فزکس کو جانے بغیر بھی گاڑی چلا سکتے ہیں۔ یہ سب ممکن ہے آبجیکٹ اورینٹڈ پروگرامنگ کے ایک بنیادی اصول کی بدولت: encapsulation۔ موضوع پر مختلف مضامین کو پڑھنے میں، آپ کو پروگرامنگ کے دو وسیع تصورات کا سامنا کرنا پڑا ہوگا: encapsulation اور معلومات کو چھپانا۔ جیسا کہ ایسا ہوتا ہے، مختلف لوگ لفظ 'انکیپسولیشن' کو مختلف چیزوں کا مطلب سمجھتے ہیں۔ ہم دونوں اصطلاحات کو سمجھیں گے تاکہ آپ کو مکمل سمجھ آجائے۔ پروگرامنگ میں، encapsulation کا اصل معنی ڈیٹا اور اس ڈیٹا کے ساتھ کام کرنے کے طریقوں کو ایک پیکج ("کیپسول") میں ملانا تھا۔ جاوا میں، encapsulating پیکیج کلاس ہے ۔ کلاس میں ڈیٹا (فیلڈز) اور اس ڈیٹا کے ساتھ کام کرنے کے طریقے دونوں شامل ہیں۔ یہ آپ کو واضح معلوم ہو سکتا ہے، لیکن پروگرامنگ کے دوسرے پیراڈائمز میں ہر چیز کو مختلف طریقے سے ترتیب دیا گیا ہے۔ مثال کے طور پر، فنکشنل پروگرامنگ میں، ڈیٹا کو ڈیٹا آپریشنز سے سختی سے الگ کیا جاتا ہے۔ آبجیکٹ اورینٹڈ پروگرامنگ (OOP) میں، پروگرام کیپسول (کلاسز) پر مشتمل ہوتے ہیں جن میں ڈیٹا اور ڈیٹا کے ساتھ کام کرنے کے افعال دونوں ہوتے ہیں۔
اب آئیے معلومات چھپانے کی بات کرتے ہیں۔
ہم ہر قسم کے پیچیدہ میکانزم کو یہ سمجھے بغیر کیسے استعمال کرتے ہیں کہ وہ کیسے بنتے ہیں یا وہ کیسے کام کرتے ہیں؟ یہ آسان ہے: ان کے تخلیق کاروں نے آسان اور آسان انٹرفیس فراہم کیے ہیں۔ سوڈا مشین پر، انٹرفیس سامنے والے پینل پر بٹن ہوتا ہے۔ ایک بٹن آپ کو کپ کا سائز منتخب کرنے دیتا ہے۔ آپ دوسرے بٹن کے ساتھ شربت کا انتخاب کرتے ہیں۔ ایک تہائی برف شامل کرنے کا ذمہ دار ہے۔ اور آپ کو بس اتنا ہی کرنا ہے۔ اس سے کوئی فرق نہیں پڑتا کہ مشین اندر سے کیسی دکھتی ہے۔ اہم بات یہ ہے کہ اسے اس طرح ڈیزائن کیا گیا ہے کہ صارف کو تین بٹن دبانے سے سوڈا مل جائے۔ یہی چیز کار پر بھی لاگو ہوتی ہے۔ اس سے کوئی فرق نہیں پڑتا کہ اندر کیا ہو رہا ہے۔ اہم بات یہ ہے کہ جب آپ دائیں پیڈل کو دباتے ہیں تو گاڑی آگے بڑھ جاتی ہے اور جب آپ بائیں پیڈل کو دباتے ہیں تو گاڑی کی رفتار کم ہوجاتی ہے۔ یہ معلومات چھپانے کا نچوڑ ہے۔ پروگرام کے تمام 'انارڈز' صارف سے پوشیدہ ہیں۔ ایسی معلومات صارف کے لیے ضرورت سے زیادہ یا غیر ضروری ہے۔ صارف کو حتمی نتیجہ کی ضرورت ہے، اندرونی عمل کی نہیں۔ مثال کے طور پر، گاڑی کی کلاس پر ایک نظر ڈالیں :public class Vehicle {
public void gas() {
/* Some complicated things happen inside a car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside a car.
As a result, it slows down */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// How everything looks to the user
// Press one pedal, the car moves
vehicle.gas();
// Press the other pedal, the car brakes
vehicle.brake();
}
}
جاوا پروگرام میں عمل درآمد اس طرح چھپا ہوا ہے۔ بالکل حقیقی زندگی کی طرح: صارف کو ایک انٹرفیس (طریقے) فراہم کیا جاتا ہے۔ ایک پروگرام میں، اگر آپ کو ایک کارروائی کرنے کے لیے کار کی ضرورت ہو، تو آپ صرف مطلوبہ طریقہ کو کال کرتے ہیں۔ ان طریقوں کے اندر جو کچھ ہوتا ہے وہ ضرورت سے زیادہ ہے۔ اہم بات یہ ہے کہ سب کچھ کام کرتا ہے جیسا کہ اسے ہونا چاہئے۔ یہاں ہم نفاذ کو چھپانے کے بارے میں بات کر رہے ہیں۔ جاوا میں ڈیٹا چھپانے کی بھی سہولت ہے۔ ہم نے اس کے بارے میں سبق میں حاصل کرنے والوں اور سیٹرز کے بارے میں لکھا ہے،
لیکن یاد دہانی کو نقصان نہیں پہنچے گا۔ مثال کے طور پر، ہمارے پاس کیٹ کلاس ہے:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
ہوسکتا ہے کہ آپ کو ماضی کے سبق سے یاد ہو کہ اس کلاس کے ساتھ کیا مسئلہ ہے؟ اگر نہیں تو آئیے یاد کرتے ہیں۔ مسئلہ یہ ہے کہ اس کا ڈیٹا (فیلڈز) سب کے لیے کھلا ہے۔ ایک اور پروگرامر آسانی سے ایک بے نام بلی بنا سکتا ہے جس کا وزن 0 اور عمر -1000 سال ہے۔
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
اس صورت حال میں، آپ احتیاط سے ٹریک کر سکتے ہیں کہ آیا آپ کا کوئی ساتھی غلط حالت کے ساتھ اشیاء بنا رہا ہے، لیکن یہ زیادہ بہتر ہو گا کہ ان غلط اشیاء کو بنانے کے امکان کو بھی ختم کر دیا جائے۔ ہم اس کی مدد سے ڈیٹا چھپانے کو حاصل کرتے ہیں:
- ترمیم کرنے والوں تک رسائی ( نجی، محفوظ، پیکیج ڈیفالٹ )؛
- حاصل کرنے والے اور سیٹرز.
Encapsulation ہمیں کئی اہم فوائد دیتا ہے:
- آبجیکٹ کی درست حالت کی نگرانی کرنا۔ ہم نے اوپر اس کی مثالیں دی ہیں: سیٹٹر اور پرائیویٹ موڈیفائر کی بدولت، ہم نے اپنا پروگرام بلیوں کے خلاف 0 کے وزن کے ساتھ محفوظ کر لیا ہے۔
- صارف دوست انٹرفیس۔ ہم صارف کے سامنے صرف طریقے چھوڑتے ہیں۔ صارف کو صرف نتیجہ حاصل کرنے کے لیے انہیں کال کرنے کی ضرورت ہے۔ اور ان کے کام کرنے کے طریقہ کار کی تفصیلات جاننے کی ضرورت نہیں ہے۔
- کوڈ کی تبدیلیاں صارفین کو متاثر نہیں کرتی ہیں۔ ہم طریقوں کے اندر تمام تبدیلیاں کرتے ہیں۔ اس سے صارفین متاثر نہیں ہوتے: انہوں نے گیس لگانے کے لیے vehicle.gas() لکھا ، اور یہی وہ کرتے رہیں گے۔ حقیقت یہ ہے کہ ہم نے gas() طریقہ کے اندر کچھ تبدیل کیا ہے پوشیدہ رہتا ہے: پہلے کی طرح، وہ صرف مطلوبہ نتیجہ حاصل کرتے ہیں۔
GO TO FULL VERSION