Saturday, October 14, 2017

C# For Beginners , Part -26 ( Properties In C# )

আমরা আজকে , শি শার্প র প্রোপার্টিস নিয়ে কথা বলবো ।। তার আগে বলবো , আমরা আগের পর্বে যে - সেটার ও গেটার মেথড নিয়ে কথা বলেছি ।। আমরা , ঐ পর্বে এটা নিয়ে শধু আলোচনা করেছি এই জন্য যেনো , আমরা বুঝতে পারি , এনক্যাপসিউলেশন কতটা গুরুত্বপূর্ণ।। আমরা এখন থেকে আর ওই মেথোড ইউজ করবো না , আমরা এখন থেকে প্রোপারটিস ইউজ করবো , চলো আগে কোড দেখে আসি -----------------------------

using System;

public class student
{
    private int id;
    private string name;
    private int passmark;

 
    public int ID
    {
        set{
            if(value <=0)
            {
                throw new Exception("ID Name Should Not Be Nonpositive");
            }
            this.id=value;

        }
        get{
            return id;
        }
    }
}
public class Program
{
    public static void Main()
    {
        student c1 = new student();
        c1.ID = -101;
        Console.ReadKey();
    }
}

আচ্ছা , এখন আমরা লাইন বাই লাইন একটু বোঝার ট্রাই করি , কি কি করলাম ।।   ID নামে একটা প্রোপার্টি ডিক্লেয়ার করলাম ।। যে প্রোপারটি'র ভেতরে দুইটা অ্যাকসেসার আছে , একটা  set অ্যাকসেসার আর একটা  get অ্যাকসেসার | তারপরে , value নামে একটা কিওয়ারড ইউজ করেছি ।।
এখন ঘটনা  হলো , মেইন মেথোড -এ এসে যখন - আমি কিভাবে কল করবো এই প্রোপারটি'কে ??

এটাও খুবই সোজা , student c1 = new student(); এর মাধ্যমে student নামক ক্লাস এর অবজেক্ট ক্রিয়েট করলাম ।। এখন , এই রেফারেন্স ভ্যারিয়েবল c1 এর সাথে যদি - ডট অপারেটর দিয়ে প্রোপারটি'র নাম লিখি ( c1.ID ) ।।  তাহলেই প্রোপারটি কল হবে , কিছুটা ক্লাস ফিল্ড এর মতোই ।।

আচ্ছা আমরা যখন , c1.ID = -101 ; লিখলাম তখন - আমাদের ID প্রোপারটিস -101 ভ্যালুটিকে নিয়ে
নেয় , তারপর set নামক অ্যাকসেসারকে কল করে , তারপর এর ভেতরে value কিওয়ারড -টা সেই ভ্যালু টেইক করে , কিছুটা মেথোড এর প্যারামিটার এর মতো , মেথোডে যাই পাস করাই না কেনো , সেগুলো প্যারামিটারে অ্যাসাইন করে নেয় ।।

এখানেও , value কিওয়ারড সেই কাজ করে , তারপর তো কি হয় ??? বুঝতেই পারছো ।। value কিওয়ারড -টা যে শুধু ইন্টিজার ভ্যালূ টেইক করে তা কিন্তু নয় , তুমি যে ধরনের প্রোপার্টি ডিক্লেয়ার করবা সেই ধরনের  ভ্যালু নিতে পারবে , আমরা এখানে
public int ID মানে , value কিওয়ারড -টা শুধু এই প্রোপারটির জন্য ইন্টিজ্রার ভ্যালু নিতে পারবে ।।

 এখন ঘটনা হলো ।। এটা না হয় , হলো --- কিন্তু , আমি যখন কনসল স্ক্রিনে শো করাতে যাবো , এই ভ্যালু - তখন কি করে রিড হবে ?? কি করবো ?? চলো দেখে আসি ।।

using System;

public class student
{
    private int id;
    private string name;
    private int passmark;

    public int ID
    {
        set{
            if(value <=0)
            {
                throw new Exception("ID Name Should Not Be Nonpositive");
            }
            this.id=value;

        }
        get{
            return id;
        }

    }

}
public class Program
{
    public static void Main()
    {
        student c1 = new student();
        c1.ID = 101;
        Console.WriteLine("Student ID no. {0}", c1.ID);
        Console.ReadKey();
    }
}

আচ্ছা , এখন কোড'টা রান করে দেখো ।। হুম , ঠিকঠাক আওউটপুট পাচ্ছি ।। আচ্ছা , দেখো একটা জিনিস লক্ষ করো যে -- কন্সল স্ক্রিনে শো করানোর জন্যও কিন্তু , আমরা c1.ID একই কাজ করেছি , যে কাজটি করেছিলাম , সেট করার সময় ।।

তাহলে বলো তো ?? আমরা , দুইটা কাজের জন্য একই জিনিস ইউজ করলাম , তারপরো কমপাইলার কিভাবে বুঝলো ?? আমরা কখন কোন'টা করতে চাচ্ছি ??

আসলে , শি শার্প তার প্রোপার্টি এর ক্ষেত্রে অটোমেটিক বুঝে নেয় যে , তুমি কি করতে চাচ্ছো ?? তুমি যদি সেট করার জন্য c1.ID = 101 লেখো , তাহলে বুঝে নিবে তুমি set অ্যাকসেসার চাচ্ছো ।। আর , যখন তুমি কন্সল স্ক্রিনে দেখানোর জন্য ভ্যালু রিড করতে চাও , তখন c1.ID ইউজ করলে , বুঝে  নিবে তুমি  get অ্যাকসেসার চাচ্ছো  | খুবই সিম্পল ।। তোমায় , আলাদা করে আবার অন্য একটা গেট মেথোড খুলতে হলো না ।।  তাহলে আমাদের এই  ID নামক প্রোপারটি'টা একটা Read & write প্রোপারটি । এর দুই ধরনের অ্যাকসেসারই আছে ।।

এখন মনে করো যে , আমি এমন একটা প্রোপারটি ক্রিয়েট করতে চাই যেখানে শধু get অ্যাকসেসার থাকবে , এর মানে - আমি ক্লাস ফিল্ড এর ভ্যালু শুধু রিড করে কন্সল স্ক্রিনে শো করাতে পারবো ।। তাহলে কি করা যায় ??? চলো দেখে আসি ------------

using System;

public class student
{
    private int id;
    private string name;
    private int passmark=40;

    public int Passmark
    {
        get
        {
            return this.passmark;
        }
    }
 
    public int ID
    {
        set{
            if(value <=0)
            {
                throw new Exception("ID Name Should Not Be Nonpositive");
            }
            this.id=value;

        }
        get{
            return id;
        }

    }

}
public class Program
{
    public static void Main()
    {
        student c1 = new student();
        c1.ID = 101;
        Console.WriteLine("Student ID no. {0}", c1.ID);
        Console.WriteLine("Student Passmark {0}", c1.Passmark);
        Console.ReadKey();
    }
}

সুতরাং , আমরা Passmark নামে শুধু রিড অনলি প্রোপারটি ক্রিয়েট করেছি ।

আচ্ছা , এখন আসো আরো সহজ একটি হিসাবে ।। সেটা হলো , আমাদের এই পোপারটি'র আরো কিছু বিশেষ গুণ আছে , যার জন্য আমরা গেটিং ও সেটিং মেথোড থেকে এই প্রোপারটি ব্যবহার করবো । ধরো , তুমি কিছুক্ষণের জন্য মেনে নাও স্টুডেন্ট আইডি নেগেটিভ হলে প্রোবলেম নাই ।।
আমাদের সেট অ্যাকসেসার এর মধ্যে কোনো ইফ- এলস লজিক এর দরকার নেই , আর Passmark কে রিড অনলি  ও রাইট অনলি উভয় প্রোপারটি বানিয়ে দিলাম ।।   আচ্ছা এখন নিচের কোড দেখো ।।

using System;

public class student
{
    public int Passmark
    {
        set;
        get;
    }
    public int ID
    {
        set;
        get;
    }
}
public class Program
{
    public static void Main()
    {
        student c1 = new student();
        c1.ID = 101;
        c1.Passmark = 40;
        Console.WriteLine("Student ID no. {0}", c1.ID);
        Console.WriteLine("Student Passmark {0}", c1.Passmark);
        Console.ReadKey();
    }
}

আচ্ছা , কোড'টি রান করে দেখো , কি হয় ??? আশা করি , অলরেডি বুঝতে পেরেছো , তারপরো বলছি ।। আমাদের এই প্রোপারটির বড়ো একটা সুবিধা হলো , আমাদের যদি কোনো লজিক সেট করা না লাগে , তাহলে -- আমাদের ওইসব ক্লাস ফিল্ডকে ইনিশিয়ালাইজ করার কোনো দরকারই নেই , শুধু
প্রোপারটি ক্রিয়েট করলেই ,কম্পাইলার অটোমেটিক প্রোপারটি গুলোর ক্লাস ফিল্ড ক্রিয়েট করে দিবে ।। যা্রা একটু অলস , তাদের জন্য অবশ্য খুবই সহজ হলো , কষ্ট করে ক্লাসফিল্ড ইমপ্লিমেন্টন করতে হবে না ।।

তো যাই হোক , আমরা কখনোই ট্র্যাডিশনাল গেটার / সেটার মেথোড ইউজ না করে আমাদের প্রোপারটি ইউজ করবো ।। প্রোপারটি'র ব্যাপারগুলো আশা করি , ভালো করে বুঝতে পেরেছো ।।
আজ এইটুকুই তাহলে --------------------











No comments:

Post a Comment