JavaRush /جاوا بلاگ /Random-UR /کلاسز کا تعارف: اپنی کلاسز لکھنا، کنسٹرکٹرز

کلاسز کا تعارف: اپنی کلاسز لکھنا، کنسٹرکٹرز

گروپ میں شائع ہوا۔
ہیلو! آج ہم جاوا میں کلاسز کے بارے میں بات کریں گے۔ کلاسز کو جاوا پروگرامنگ کا مرکز کہا جا سکتا ہے۔ جب آپ ایک پروگرامر بن جاتے ہیں، تو آپ کا بنیادی کام مختلف فعالیت کے ساتھ اپنی کلاسیں لکھنا ہوگا۔ کلاسوں کا تعارف: اپنی کلاسیں لکھنا، کنسٹرکٹرز - 1آئیے معلوم کریں کہ یہ چیز کیا ہے اور یہ کیسے کام کرتی ہے :) جیسا کہ آپ پہلے ہی جانتے ہیں، جاوا ایک آبجیکٹ اورینٹڈ پروگرامنگ زبان ہے۔ تمام پروگرام ایسی اشیاء پر مشتمل ہوتے ہیں جو کسی نہ کسی طرح ایک دوسرے سے جڑے ہوتے ہیں۔ کلاس بنیادی طور پر کسی شے کے لیے ایک ٹیمپلیٹ ہوتی ہے۔ یہ طے کرتا ہے کہ کوئی چیز کیسی نظر آئے گی اور اس کے کیا افعال ہوں گے۔ ہر چیز کسی نہ کسی طبقے کی آبجیکٹ ہوتی ہے ۔ آئیے سب سے آسان مثال دیکھیں:
public class Cat {

    String name;
    int age;

}
ہم کہتے ہیں کہ ہم ایک پروگرام لکھ رہے ہیں، اور اس پروگرام میں ہمیں کسی چیز کے لیے بلیوں کی ضرورت ہے (مثال کے طور پر، ہمارے پاس ایک ویٹرنری کلینک ہے جس میں آن لائن ملاقات کرنے کی صلاحیت ہے)۔ ہم نے ایک کلاس بنائی Catاور اس کے لیے دو متغیرات بتائے - ایک سٹرنگ nameاور ایک نمبر age۔ ایسے طبقاتی متغیرات کو فیلڈز کہا جاتا ہے ۔ بنیادی طور پر، یہ ان تمام بلیوں کے لیے ایک ٹیمپلیٹ ہے جو ہم مستقبل میں بنائیں گے۔ ہر بلی (کلاس آبجیکٹ Cat) کے دو متغیر ہوں گے - نام اور عمر۔
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
اس طرح یہ کام کرتا ہے! ہم نے ایک بلی بنائی، اسے ایک نام اور عمر دی، اور یہ سب کنسول میں آؤٹ پٹ کیا۔ کچھ بھی پیچیدہ نہیں :) کلاسز اکثر آس پاس کی دنیا کی اشیاء اور مظاہر کو بیان کرتی ہیں۔ ایک بلی، ایک میز، ایک شخص، بجلی، ایک کتاب کا صفحہ، ایک وہیل - یہ سب آپ کے پروگرام میں الگ الگ کلاسوں کا استعمال کرتے ہوئے بنائے جائیں گے۔ اب ہم کلاس میں بنائے گئے متغیرات پر ایک نظر ڈالتے ہیں Cat۔ یہ فیلڈز، یا مثال کے متغیر کہلاتے ہیں ۔ نام، حقیقت میں، ان کے پورے جوہر کو ظاہر کرتا ہے. کلاس کی ہر مثال (آبجیکٹ) میں یہ متغیرات ہوں گے Cat۔ ہر بلی جو ہم تخلیق کرتے ہیں اس کا اپنا متغیر nameاور اس کا اپنا ہوگا age۔ یہ منطقی ہے، عام طور پر: اصلی بلیوں کے ساتھ سب کچھ ایک جیسا ہوتا ہے :) مثال کے متغیر کے علاوہ، اور بھی ہیں - کلاس متغیر ، یا جامد۔ آئیے اپنی مثال میں شامل کریں:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
کنسول آؤٹ پٹ:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
اب ہمارے پاس اپنی کلاس میں ایک نیا متغیر ہے - count(مقدار)۔ وہ تخلیق شدہ بلیوں کی گنتی کے لیے ذمہ دار ہے۔ ہر بار جب ہم مرکزی طریقہ میں ایک بلی بناتے ہیں، ہم اس متغیر کو 1 تک بڑھاتے ہیں۔ یہ متغیر جامد مطلوبہ لفظ کے ذریعہ نامزد کیا جاتا ہے ۔ اس کا مطلب ہے کہ اس کا تعلق کلاس سے ہے ، نہ کہ کلاس کی کسی مخصوص چیز سے۔ جو یقیناً منطقی ہے: اگر ہر بلی کا اپنا نام ہونا چاہیے، تو ہمیں سب کے لیے ایک بلی کاؤنٹر کی ضرورت ہے۔ یہ بالکل وہی ہے جو لفظ جامد آپ کو حاصل کرنے کی اجازت دیتا ہے - countتمام بلیوں کے لئے ایک ہی متغیر۔ براہ کرم نوٹ کریں: جب ہم اسے کنسول پر پرنٹ کرتے ہیں، تو ہم نہیں لکھتے ہیں barsik.countیا vasia.count. وہ بارسک یا واسیا سے تعلق نہیں رکھتی - وہ پوری کلاس سے تعلق رکھتی ہے Cat۔ لہذا، یہ آسان ہے count. آپ بھی لکھ سکتے ہیں Cat.count- یہ بھی درست ہوگا۔ nameیہ کنسول میں متغیر کو آؤٹ پٹ کرنے کے ساتھ کام نہیں کرے گا:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
غلطی! nameہر بلی کی اپنی ہوتی ہے۔ یہ وہ جگہ ہے جہاں مرتب کرنے والا الجھ جاتا ہے۔ "کنسول میں نام کو آؤٹ پٹ کریں؟ یہ کس کا نام ہے؟ :/"

طریقے

متغیرات کے علاوہ، ہر کلاس میں طریقے ہوتے ہیں۔ ہم ان کے بارے میں ایک الگ لیکچر میں مزید تفصیل سے بات کریں گے، لیکن عمومی نکات بہت آسان ہیں۔ طریقے آپ کی کلاس کی فعالیت ہیں؛ اس کلاس کی چیزیں کیا کر سکتی ہیں۔ آپ پہلے ہی طریقوں میں سے ایک سے واقف ہیں - یہ ہے main()۔ لیکن طریقہ main، جیسا کہ آپ کو یاد ہے، static ہے - یعنی اس کا تعلق پوری کلاس سے ہے (منطق وہی ہے جو متغیر کے ساتھ ہے)۔ اور عام، غیر جامد طریقوں کو صرف مخصوص اشیاء پر ہی بلایا جا سکتا ہے جو ہم نے بنائی ہیں۔ مثال کے طور پر، اگر ہم ایک بلی کے لیے کلاس لکھنا چاہتے ہیں، تو ہمیں یہ سمجھنا ہوگا کہ بلی کو ہمارے پروگرام میں کیا کام کرنے چاہئیں۔ اس کی بنیاد پر، آئیے اس کے لیے چند طریقے لکھتے ہیں:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
ٹھیک ہے، اب ہماری کلاس ایک حقیقی بلی کی وضاحت کی طرح ہے! اب ہمارے پاس صرف نام اور عمر کے ساتھ بارسک نامی بلی نہیں ہے۔ وہ میاؤں اور چھلانگیں بھی لگا سکتا ہے! اس طرح کی "کارکردگی" کے بغیر یہ کیسی بلی ہے :) ہم ایک مخصوص چیز لیتے ہیں - barsik، اور اس کے طریقوں کو کال کرتے ہیں sayMeow()اور jump(). ہم کنسول کو دیکھتے ہیں:

Мяу!
Прыг-скок!
ایک حقیقی بلی! :)

اپنی کلاسیں بنانا۔ تجری

مستقبل میں آپ کو اپنی کلاسیں خود لکھنی ہوں گی۔ انہیں لکھتے وقت آپ کو کن باتوں پر توجہ دینی چاہیے؟ اگر ہم متغیر کے بارے میں بات کر رہے ہیں، تو آپ کو کچھ استعمال کرنے کی ضرورت ہے جسے abstraction کہتے ہیں ۔ خلاصہ آبجیکٹ اورینٹڈ پروگرامنگ کے چار بنیادی اصولوں میں سے ایک ہے۔ اس میں کسی چیز کی اہم، اہم ترین خصوصیات کو اجاگر کرنا ، اور اس کے برعکس - ثانوی، غیر اہم خصوصیات کو ترک کرنا شامل ہے۔ مثال کے طور پر، ہم کمپنی کے ملازمین کی فائل بنا رہے ہیں۔ ملازم کی اشیاء بنانے کے لیے، ہم نے ایک کلاس لکھا Employee۔ کمپنی کی فائل میں ملازم کو بیان کرنے کے لیے کون سی خصوصیات اہم ہیں؟ پورا نام، تاریخ پیدائش، سوشل سیکورٹی نمبر، ٹیکس شناختی نمبر۔ لیکن اس بات کا امکان نہیں ہے کہ ہمیں کمپنی کے ملازم کے کارڈ میں اس کی قد، آنکھ اور بالوں کا رنگ درکار ہو۔ کمپنی کو اس معلومات کی ضرورت نہیں ہے۔ لہذا، کلاس کے لیے Employeeہم متغیرات String name, int age, int socialInsuranceNumberاور int taxNumber, کو سیٹ کریں گے اور ہم ان معلومات کو ترک کر دیں گے جو ہمارے لیے غیر ضروری ہے (جیسے آنکھوں کا رنگ) اور اسے ختم کر دیں گے ۔ لیکن اگر ہم کسی ماڈلنگ ایجنسی کے لیے فوٹو ماڈلز کی فائل بناتے ہیں تو صورتحال ڈرامائی طور پر بدل جاتی ہے۔ فیشن ماڈل کو بیان کرنے کے لیے، قد، آنکھوں کا رنگ اور بالوں کا رنگ ہمارے لیے بہت اہم ہیں، لیکن TIN نمبر ہمارے لیے بالکل اہم نہیں ہے۔ لہذا، کلاس میں Modelہمیں متغیر بنانے کی ضرورت ہے int height, String hair. String eyesخلاصہ اس طرح کام کرتا ہے، یہ آسان ہے! :)

کنسٹرکٹرز

آئیے اپنی بلی کی مثال پر واپس جائیں۔
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
اس کوڈ کو دیکھیں اور اندازہ لگانے کی کوشش کریں کہ ہمارے پروگرام میں کیا غلط ہے۔ ہمارے پروگرام میں دو گھنٹے تک ایک بلی تھی جس کا نام یا عمر نہیں تھا! یقیناً یہ سراسر غلط ہے۔ ویٹرنری کلینک کے ڈیٹا بیس میں ان کے بارے میں معلومات کے بغیر کوئی بلیاں نہیں ہونی چاہئیں۔ اب ہم اسے پروگرامر پر چھوڑ دیتے ہیں۔ اگر وہ اپنا نام اور عمر بتانا نہ بھولے تو سب ٹھیک ہو جائے گا۔ اگر وہ بھول جاتا ہے تو، ڈیٹا بیس، نامعلوم بلیوں میں ایک خرابی ہو گی. ہم اس مسئلے کو کیسے حل کر سکتے ہیں؟ یہ کسی نہ کسی طرح نام اور عمر کے بغیر بلیوں کی تخلیق کو ممنوع قرار دینا ضروری ہے۔ یہ وہ جگہ ہے جہاں کنسٹرکٹر کے افعال ہماری مدد کے لیے آتے ہیں ۔ یہاں ایک مثال ہے:
public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
ایک کنسٹرکٹر بنیادی طور پر کلاس آبجیکٹ کے لیے ایک ٹیمپلیٹ ہوتا ہے۔ اس صورت میں، ہم یہ بتاتے ہیں کہ ہر چیز کے لیے catدو دلائل کی وضاحت ہونی چاہیے - ایک تار اور ایک عدد۔ اگر اب ہم بے نام بلی بنانے کی کوشش کریں گے تو ہم کامیاب نہیں ہوں گے۔
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
اب جب کہ ایک کلاس میں کنسٹرکٹر ہے، جاوا کمپائلر جانتا ہے کہ آبجیکٹ کو کس طرح کا ہونا چاہیے اور اس میں بیان کردہ دلائل کے بغیر آبجیکٹ بنانے کی اجازت نہیں دیتا۔ اب آئیے اس کی ورڈ کو دیکھتے ہیں thisجو آپ کنسٹرکٹر کے اندر دیکھتے ہیں۔ اس کے ساتھ بھی سب کچھ آسان ہے۔ انگریزی میں "this" کا مطلب ہے "یہ، یہ"۔ یعنی یہ لفظ کسی خاص چیز کی طرف اشارہ کرتا ہے۔ کنسٹرکٹر میں کوڈ
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
تقریباً لفظی ترجمہ کیا جا سکتا ہے: " اس بلی کا نام (جسے ہم بنا رہے ہیں) = نام کی دلیل جو کنسٹرکٹر میں بتائی گئی ہے۔ اس بلی کی عمر (جو ہم بنا رہے ہیں) = عمر کی دلیل جو کنسٹرکٹر میں بیان کی گئی ہے۔" کنسٹرکٹر کے فائر ہونے کے بعد، آپ چیک کر سکتے ہیں کہ ہماری بلی کو تمام ضروری اقدار تفویض کر دی گئی ہیں:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
کنسول آؤٹ پٹ:

Барсик
5
جب کنسٹرکٹر مکمل ہو گیا ہے:
Cat barsik = new Cat("Barsik", 5);
مندرجہ ذیل اصل میں اندر ہوا:
this.name = "Barsik";
this.age = 5;
اور آبجیکٹ barsik(یہ ہے this) کو کنسٹرکٹر آرگیومینٹس سے قدریں تفویض کی گئی تھیں۔ درحقیقت، اگر آپ کلاس میں کنسٹرکٹرز کی وضاحت نہیں کرتے ہیں، تب بھی یہ کنسٹرکٹر کو برطرف کر دے گا ! لیکن یہ کیسے ممکن ہے؟ O_O حقیقت یہ ہے کہ جاوا میں تمام کلاسوں میں ایک نام نہاد ڈیفالٹ کنسٹرکٹر ہوتا ہے ۔ اس کے پاس کوئی دلائل نہیں ہیں، لیکن جب بھی کسی بھی طبقے کی کوئی چیز بنائی جاتی ہے تو یہ فائر ہوجاتا ہے۔
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
پہلی نظر میں یہ قابل توجہ نہیں ہے۔ ٹھیک ہے، ہم نے ایک چیز بنائی اور اسے بنایا، ڈیزائنر کا کام کہاں ہے؟ اسے دیکھنے کے لیے، آئیے Catاپنے ہاتھوں سے کلاس کے لیے ایک خالی کنسٹرکٹر لکھیں، اور اس کے اندر ہم کنسول میں کچھ فقرہ آؤٹ پٹ کریں گے۔ اگر یہ ظاہر ہوتا ہے، تو کنسٹرکٹر نے کام کیا ہے۔
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
کنسول آؤٹ پٹ:

Создали кота!
یہاں تصدیق ہے. ڈیفالٹ کنسٹرکٹر ہمیشہ آپ کی کلاسوں میں پوشیدہ طور پر موجود ہوتا ہے۔ لیکن آپ کو اس کی ایک اور خصوصیت جاننے کی ضرورت ہے۔ جب آپ دلائل کے ساتھ کچھ کنسٹرکٹر بناتے ہیں تو ڈیفالٹ کنسٹرکٹر کلاس سے غائب ہوجاتا ہے۔ اس کا ثبوت، حقیقت میں، ہم پہلے ہی اوپر دیکھ چکے ہیں. یہاں اس کوڈ میں:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
ہم نام اور عمر کے بغیر بلی نہیں بنا سکتے تھے کیونکہ ہم نے کنسٹرکٹر کی وضاحت کی ہے Cat: string + number۔ پہلے سے طے شدہ کنسٹرکٹر اس کے فوراً بعد کلاس سے غائب ہو گیا۔ لہذا، یاد رکھنا یقینی بنائیں: اگر آپ کو اپنی کلاس میں متعدد کنسٹرکٹرز کی ضرورت ہے، بشمول ایک خالی، آپ کو اسے الگ سے بنانا ہوگا ۔ مثال کے طور پر، ہمارا ویٹرنری کلینک اچھے کام کرنا اور بے گھر بلیوں کی مدد کرنا چاہتا ہے، جن کے نام اور عمر ہم نہیں جانتے۔ پھر ہمارا کوڈ اس طرح نظر آنا چاہئے:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
اب جب کہ ہم نے واضح طور پر ایک ڈیفالٹ کنسٹرکٹر بتا دیا ہے، ہم دونوں قسم کی بلیاں بنا سکتے ہیں۔ کنسٹرکٹر میں، آپ اقدار کو واضح طور پر تفویض کر سکتے ہیں، اور انہیں صرف دلائل سے نہیں لے سکتے۔ مثال کے طور پر، ہم تمام گلی کی بلیوں کو ڈیٹا بیس میں "Street cat number..." کے نام سے ریکارڈ کر سکتے ہیں:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
ہمارے پاس ایک متغیر ہے countجو کہ گلی کیٹ کاؤنٹر ہے۔ جب بھی ہم ڈیفالٹ کنسٹرکٹر چلاتے ہیں، ہم اسے 1 سے بڑھاتے ہیں اور اس نمبر کو بلی کے نام کے طور پر تفویض کرتے ہیں۔ ایک تعمیر کنندہ کے لیے، دلائل کی ترتیب بہت اہم ہے۔ آئیے اپنے کنسٹرکٹر میں نام اور عمر کے دلائل کو تبدیل کریں۔
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
غلطی! کنسٹرکٹر واضح طور پر بیان کرتا ہے: کوئی شے بناتے وقت، Catاسے ایک نمبر اور ایک سٹرنگ پاس کرنا ضروری ہے ، اس ترتیب میں ۔ اس لیے ہمارا کوڈ کام نہیں کرتا۔ اس بات کو یقینی بنائیں اور اپنی کلاسز بناتے وقت اسے ذہن میں رکھیں:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
یہ دو بالکل مختلف ڈیزائنرز ہیں! اب مواد کو مضبوط کرنے کے لیے چند مسائل حل کریں :)
  • نوادرات کا میوزیم۔
آپ کا کام کلاس کو ڈیزائن کرنا ہے Artifact۔ میوزیم میں رکھے گئے فن پارے تین طرح کے ہوتے ہیں۔ پہلا وہ ہے جس کے بارے میں میوزیم کے ذریعہ تفویض کردہ سیریل نمبر کے علاوہ کچھ معلوم نہیں ہے (مثال کے طور پر: 212121)۔ دوسرا وہ ہے جس کے بارے میں سیریل نمبر اور ثقافت جس کے ذریعہ اسے بنایا گیا تھا معلوم ہے (مثال کے طور پر: 212121، "Aztecs")۔ تیسری قسم وہ ہے جس کے بارے میں سیریل نمبر معلوم ہے، وہ ثقافت جس کے ذریعے اسے بنایا گیا تھا، اور اس کی تخلیق کی صحیح عمر (مثال کے طور پر: 212121، "Aztecs"، 12)۔ ایک کلاس بنائیں Artifactجو میوزیم میں ذخیرہ شدہ نوادرات کو بیان کرے، اور اس کے لیے کنسٹرکٹرز کی مطلوبہ تعداد لکھیں۔ طریقہ میں main()، ہر قسم کا ایک نمونہ بنائیں۔
public class Artifact {

    public static void main(String[] args) {
    }
}
  • ملاقات کی ویب سائٹ
آپ ڈیٹنگ سائٹ کے لیے صارف کا ڈیٹا بیس بنا رہے ہیں۔ لیکن مسئلہ یہ ہے کہ آپ بھول گئے ہیں کہ انہیں کس ترتیب میں بیان کرنے کی ضرورت ہے، اور آپ کے پاس تکنیکی وضاحتیں نہیں ہیں۔ ایک کلاس ڈیزائن کریں Userجس میں فیلڈز ہوں گے - نام ( String) عمر ( short) اور اونچائی ( int)۔ اس کے لیے مطلوبہ تعداد میں کنسٹرکٹرز بنائیں تاکہ نام، عمر اور قد کسی بھی ترتیب سے بیان کیا جا سکے۔
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION