Saturday, October 14, 2017

C# For Beginners , Part -25 ( Getter & Setter Method )

আজকে আমরা , নতুন দুইটা মেথোড নিয়ে কথা বলবো , তার আগে চলো , আমরা সিম্পল একটা কোড দেখে আসি ।।

using System;

public class student
{
    public int id;
    public string name;
    public int passmark;
}
 public  class Program
    {
        public static void Main()

        {
            student c1 = new student();
            c1.id = -101;
            c1.name = null;
            c1.passmark = 30;
            Console.WriteLine("ID Name ={0} \n Student name ={1} \n Student Passmark = {2}\n", c1.id, c1.name, c1.passmark);
           Console.ReadKey();
        }
          }


আচ্ছা , আমরা একটা student ক্লাসের ক্লাস ফিল্ড গুলোকে পাবলিক করে দিয়েছি , যার ফলে অন্য একটা ক্লাস থেকে , তার ফিল্ডগুলোকে চেইঞ্জ করে দিচ্ছি , যেমন - আইডি নাম্বার মাইনাস করে দিচ্ছি , নাম এর জায়গা নাল করে দিয়েছি , পাসমারক চেইঞ্জ করে দিয়েছি , ইচ্ছামতো কাজ করে যাচ্ছি ।।


আরেকটা কথা , আমরা কিন্তু জানি , যে - স্ট্রিং একটা নালএবল টাইপ তাই , তার সাথে নাল অ্যাসাইন করতে পারলাম , না হলে কিন্তু , করতে পারতাম না , তুমি আইডি কে নাল অ্যাসাইন করতে পারবে না , কারণ এটা নননালেবল টাইপ , তবে তুমি যদি , public ? int id; এইভাবে ডিক্লেয়ার করতে তাহলে কিন্তু এটাও নালেবল টাইপ হয়ে যেতো , যাই হোক এখন আসল কথায় আসি ।।

এখন আমি কখনোই চাইবো না , এই জিনিসগুলোকে পাবলিক করে দিতে , তাই আমি প্রাইভেট করতে চাই , যেনো অন্য কোনো ক্লাস থেকে চেইঞ্জ না করতে পারে ।। কিন্তু , আমি যদি এমন ব্যবস্থা করতে পারতাম যে --- অন্য ক্লাস থেকে চেইঞ্জ করতে পারবে , বাট সেটা এই  student ক্লাসের অনুমুতি নিয়ে , তাহলে বিষয়টা অনেক মজার হতো , তাহলে অন্য কোনো ক্লাস তাদের ইচ্ছেমতো চেইঞ্জ করতে পারতো না - তো চলো , একটু দেখে আসি ।।

using System;

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

    public void setId(int ID )
    {
        if( ID<=0)
        {
            throw new Exception("student ID Should Be Greater Than 0" );
        }
        this.id=ID;
    }
    public int getId()
    {
        return id;
    }
}
 public  class Program
    {
        public static void Main()

        {
            student c1 = new student();
            c1.setId(0) ;
           
            Console.WriteLine("ID Name = {0}  ", c1.getId());
           Console.ReadKey();
        }
          }



এখন কোড রান করে দেখো , কি দেখতে পাবে ?????????? হুম , এরর দেখাবে নীচের মতো করে


"An unhandled exception of type 'System.Exception' occurred in ConsoleNewNewApplication1.exe
Additional information: student ID Should Be Greater Than 0 "

তাই না ??? হুম , কিন্তু , আগে  তো তুমি ইচ্ছামতো চেইঞ্জ করতে পারতে - যখন ক্লাস ফিল্ডগুলো পাবলিক করা ছিলো । কিন্তু , এখন কেনো এরকম হচ্ছে ??? কারণ , তুমি একটা মেথোড ইউজ করেছো সেটা হলো ,  setId মেথোড , যার কারণে - তুমি মেইন মেথোড-এ যাই সেট করো না কেনো যদি সেটা শূন্য এর সমান / ছোট হয় , তাহলে throw new Exception("student ID Should Be Greater Than 0" ); এর মাধ্যমে তোমায় এরর দেখাবে ,আর না হলে । this.id=ID; এর দ্বারা , ID প্যারামিটার এর মান  id এর অব্জেক্ট ক্রিয়েট এর মাধ্যমে  id তে অ্যাসাইন করে দিলাম ।।

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

আর , সেটয়াপ হবার পর , সেটা কনসল স্ক্রিনে দেখাবার জন্য তো আমাদের id এর ভ্যালু রিড করতে হবে , কিন্তু ওইটা তো প্রাইভেট করা , তাই getId মেথোডের মাধ্যমে ঐ id এর ভ্যালু রিড করে কনসল
স্ক্রিনে শো করাচ্ছি ।।

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

using System;

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

    public void joy(int ID)
    {
        if(ID<=0)
        {
            throw new Exception("ID no. Should Be Greater Than zero");
        }
        this.id = ID;
    }
    public int jony()
    {
        return id;
    }
  
}
 public  class Program
    {
        public static void Main()

        {
            student c1 = new student();
            c1.joy(101) ;
           
            Console.WriteLine("ID Name = {0}  ", c1.jony());
           Console.ReadKey();
        }
          }

আমরা , এইবার  joy ও jony নামে মেথোড দুইটি ক্রিয়েট করেছি ।।আচ্ছা , এইবার আমরা নামের ক্ষেত্রেও এই কাজগুলো অ্যাপ্লাই করতে পারি , চলো দেখে আসি -------------

using System;

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

    public void Name(string NAME)
    {
        if(string.IsNullOrEmpty(NAME) )
        {
            throw new Exception(" Name Should Not Be Null ");
        }
        this.name = NAME;
    }

    public string getName()
    {
     
            return name;
    }
    public void joy(int ID)
    {
        if(ID<=0)
        {
            throw new Exception("ID no. Should Be Greater Than zero");
        }
        this.id = ID;
    }
    public int jony()
    {
        return id;
    }
  
}
 public  class Program
    {
        public static void Main()

        {
            student c1 = new student();
            c1.joy(101) ;
            c1.Name(null);
           
            Console.WriteLine("ID Name = {0}  ", c1.jony());
            Console.WriteLine("Student Name = {0}", c1.getName());
           Console.ReadKey();
        }
          }

আচ্ছা , ধরো , আমি যদি নাম নাল করেই ফেলি , তারপরো তুমি চাচ্ছো সেটা এরর না দেখিয়ে আউটপুটে দেখাবে "No Name" তাহলে কি করা যায় ??? চলো , দেখে আসি ------

using System;

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

    public void Name(string NAME)
    {

        this.name = NAME;
    }

    public string getName()
    {
        if (string.IsNullOrEmpty(name))
        {
            return "No Name";
        }
        else
            return name;
    }
    public void joy(int ID)
    {

        this.id = ID;
    }
    public int jony()
    {
        return id;
    }

}
public class Program
{
    public static void Main()
    {
        student c1 = new student();
        c1.joy(101);
        c1.Name(null);

        Console.WriteLine("ID Name = {0}  ", c1.jony());
        Console.WriteLine("Student Name = {0}", c1.getName());
        Console.ReadKey();
    }
}

যাই হোক , আশা করি গেটিং ও সেটিং মেথোড কেনো ইউজ করছি ???? এর প্রয়োজনীয়তা কি ??? এসব ব্যপারে ?? তোমরা বুঝতে পারছো।। তাহলে , এই যে একটা ক্লাসের ক্লাস ফিল্ড গুলোকে Encapsulate  করার জন্য যে মেথোড দুইটি ইউজ করছো ।। এই ঘটনাকেই , প্রোগ্রামের ভাষায় Encapsulation  বলে ।। এটা , অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর জন্য খুবই গুরুত্বপূর্ণ।।তবে , এর পর্বের যাবার পর থেকে , এটা আর ইউজ করবো না ।। বাট , তোমায় এটা জানতেই হবে - এর প্রয়োজনীয়তা কি ??








No comments:

Post a Comment