Saturday, October 28, 2017

C# For Beginners,Part-36( Why Enums ? Its Importance )

আজকে আমরা , enum নিয়ে আলোচনা করবো ।। এটা কেনো ইউজ করবো ?? কি ভাবে - ইমপ্লিমেন্ট করবো ???
মূলত প্রোগ্রামকে আরো বেশী  readable & maintainable করার জন্যই  enum এর ব্যবহার করা হয় ।।

তার আগে আমরা নরমাল একটি প্রোগ্রাম দেখে নেই ।। চলো ,

using System;
using System.IO;

public class Joy
{
   
    public static void Main()
    {
        Customer[] customers = new Customer[3];
        customers[0] = new Customer
        {
            name = "Mark",
           gender= 1
        };
        customers[1] = new Customer
        {
            name = "Mary",
            gender = 2
        };
        customers[2] = new Customer
        {
            name="Sam",
            gender=3
        };
        for(int i=0;i<3;i++)
        {
            Console.WriteLine("Name ={0} && Gender={1}",customers[i].name,Getgender(customers[i].gender));
        }
        Console.ReadKey();
      
    }
    public static string Getgender(int gender)
    {
        switch(gender)
        {
            case 1:
                return "Male";
                    case 2:
                return "FeMale";
                    case 3:
                return "Unknown";
            default:
                return "Invalid";
        }
    }


    }

public class Customer
{
    public string name { set; get; }
    public int gender { set; get; }
}

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

যাই হোক এখন , একতা জিনিস এখানে একটু সতর্কতার সাথে লক্ষ করলে দেখা যাবে যে --- আমরা যদি সুইস কেইস এর দিকে না তাকাই , তাহলে কিন্তু - তুমি বুঝতেই পারবে না যে - gender 1 /2 /3
হলে - কি হবে ?? মেইল হবে , নাকি ফিমেইল হবে ? নাকি অন্যকিছু ?? এটা বোঝার জন্য তোমায় কিন্তু - সুইস স্টেইট্মেন্ট এর ভেতরের শর্ত গুলো দেখতে হবে ।। এখন আমি যদি চাই , আমি প্রোগ্রামটাকে আরো
readable & maintainable করতে চাই , যেনো খুব সহজেই আমরা দেখলেই বুঝতে পারি কোনটা কি হবে ?? সেই জন্য ওপরের কোডটাকেই একটু অন্যরকমভাবে লিখবো ,আর সেটা enum ব্যবহার করে । চলো তো , দেখে আসি ...............

using System;
using System.IO;


public class Joy
{
   
    public static void Main()
    {
        Customer[] customers = new Customer[3];
        customers[0] = new Customer
        {
            name = "Mark",
           gender= Gender.Male
        };
        customers[1] = new Customer
        {
            name = "Mary",
            gender = Gender.Female
        };
        customers[2] = new Customer
        {
            name="Sam",
            gender=Gender.Unknown
        };
        for(int i=0;i<3;i++)
        {
            Console.WriteLine("Name ={0} && Gender={1}",customers[i].name,Getgender(customers[i].gender));
        }
        Console.ReadKey();
      
    }
    public static string Getgender(Gender gender)
    {
        switch(gender)
        {
            case Gender.Male:
                return "Male";
                    case Gender.Female:
                return "FeMale";
                    case Gender.Unknown :
                return "Unknown";
            default:
                return "Invalid";
        }
    }


    }

public enum Gender
{
    Male,
    Female,
    Unknown
}

public class Customer
{
    public string name { set; get; }
    public Gender gender { set; get; }
}
  

তাহলে আমরা , উপরের প্রোগ্রামটি রান করে দেখি ।। আশা করি , ভয় কিছুটা কেটে গেছে - এটা নিয়ে ভয় পাবার কিছু নেই ।  যেহেতু  enum বিষয়টি আমাদের কাছে একদমই নতুন , তাই ভয় পাবার কিছু নেই ।।
আমরা , এই  enum কিওয়ারড দিয়ে Gender নামে একটা   enum ক্রিয়েট করলাম যার ভেতরে আমরা তিনটি মেম্বার   Male ,Female আর  Unknown ইনক্লুড করেছি ।। enum  এক ধরনের টাইপ , তাই প্রত্যেক যায়গায় আমরা gender প্রোপারটিকে ইউস করার সময় তার আগে Gender ইউজ করে gender  কে enum  টাইপ করে নিয়েছি ।। এ ছাড়া , আহামরি কোনো চেইঞ্জ আমরা করে নি ।  আর বাকি যেসব ইউজ করেছি , আশা করি দুই-একটা কোড লিখলে এরকম সিনট্যাক্স অটোমেটিক রপ্ত হয়ে যাবে ।।

এখন খেয়াল করো , আগে আমরা যেখানে  1 /2 /3   কে   মেইল/ফিমেইল / আননোন    বানাতাম ,তার চেয়ে এখন আমাদের খুব সহজেই প্রোগ্রামটিকে বুঝতে সুবিধা হচ্ছে , তাই না ।।  অর্থাৎ প্রোগ্রামটি আগের চেয়ে আরো বেশি , readable ও maintainable  হয়েছে ,তাই না ?? এটাই আমাদের মূলত enum  ব্যবহারের উদ্দ্যেশ্য ।।

এবার একটু রেস্ট নিয়ে - এর পরের অংশটুকু শুরু করো ।।

আমরা যখন একটা enum ক্রিয়েট করি নরমাল ভাবে ।।  তখন , ডিফল্টভাবে কি হয় ??

public enum Gender
{
    Male,
    Female,
    Unknown
}

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

  public static void Main()
    {
       int[] values= (int[])Enum.GetValues(typeof(Gender));
       for (int i = 0; i < 3;i++ )
       {
           Console.WriteLine(values[i]);
       }
           Console.ReadKey();
      
    }

Enum নামে একটা  ক্লাস আছে আমাদের .Net ফ্রেমওয়ারকে ।। যার অনেকগুলো মেথোড আছে , যার ভেতরে একটি স্ট্যাটিক  GetValues মেথোড আছে   , যেটা Gender নামক এনামের মেম্বারগুলো'র ভ্যালু
রিটার্ন করে । কিন্তু , আমরা  typeof নামে আরো একটি মেথোড ব্যবহার করেছি ।। যেটা ,মূলত   Gender কোন টাইপের ? সেটা GetValues  মেথোডকে জানিয়ে দেয় ( এখানে enum টাইপ) ।।
এখন ঘটনা হলো , এই   GetValues মেথোড এর রিটার্ন টাইপ হলো স্ট্রিং টাইপ , তাই আমরা int[] দিয়ে সেটাকে টাইপ কাস্টিং করে নিলাম ।।  এবার চলো , এই দুই কোডকে একসাথে করে নিচে রান করে দেখি , কি হয় ???

using System;
using System.IO;


public class Joy
{
   
    public static void Main()
    {
       int[] values= (int[])Enum.GetValues(typeof(Gender));
       for (int i = 0; i < 3;i++ )
       {
           Console.WriteLine(values[i]);
       }
           Console.ReadKey();
      
    }

    }

public enum Gender
{
    Male,
    Female,
    Unknown
}

এবার রান করে দেখো , Male,Female,Unknown এই তিন মেম্বার এর ভ্যালু কি শো করায় ?? তুমি কোনো কিছু অ্যাসাইন  না করালেও , প্রথমটা শূণ্য আর পরের গুলো এক এক করে বাড়তে থাকে ।।
তুমি যদি নিচের মতো করে অ্যাসাইন করো ---

public enum Gender
{
    Male=2,
    Female,
    Unknown
}

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

 public static void Main()
    {
       string[] values= Enum.GetNames(typeof(Gender));
       for (int i = 0; i < 3;i++ )
       {
           Console.WriteLine(values[i]);
       }
           Console.ReadKey();
      
    }

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

using System;
using System.IO;


public class Joy
{
   
    public static void Main()
    {
       short[] values=(short[]) Enum.GetValues(typeof(Gender));
       for (int i = 0; i < 3;i++ )
       {
           Console.WriteLine(values[i]);
       }
           Console.ReadKey();
      
    }

    }

public enum Gender:short
{
    Male=2,
    Female,
    Unknown
}

আচ্ছা তুমি কিন্তু   Male,Female,Unknown এর প্রত্যেক এর মানই অ্যাসাইন করে দিতে পারবে , কোনো সমস্যা নাই ।। চলো দেখে আসি ---

using System;
using System.IO;


public class Joy
{
   
    public static void Main()
    {
       short[] values=(short[]) Enum.GetValues(typeof(Gender));
       for (int i = 0; i < 3;i++ )
       {
           Console.WriteLine(values[i]);
       }
           Console.ReadKey();
      
    }



    }

public enum Gender:short
{
    Male=2,
    Female=8,
    Unknown=34
}


তাহলে একটা জিনিস কিন্তু , আমরা শিউর যে - আমরা enum এর ডেটা টাইপ ছাড়াও এর মেম্বারগুলোর ভ্যালুও কাস্টোমাইজ করতে পারি ।। এর মানে আবার এটা মনে করো না যে , তুমি enum কে স্ট্রিং-এ কনভার্ট করতে পারবে ।। এটার ডিফল্ট ডেটা-টাইপ যেহেতু ইন্টিজার ,তাই একে short,long,ushort,ulong,uint ইত্যাদিতে কাস্টোমাইজ করতে পারবে ।।

এখন আমরা যেনো একটা বিষয় কনফিউজ করে না ফেলি , সেটা হলো -- Enum & enum । Enum  হলো একটা ক্লাস যার অনেকগুলো স্ট্যাটিক মেথোড আছে যেগুলোর সাহয্যে আমরা  enum  নামক ডেটা টাইপের মেম্বার গুলোর ভ্যালু ও নাম ইত্যাদি জানতে পারি ।। এই দুইটি জিনিস যেনো ,এক করে না ফেলি ।।

আচ্ছা , আরেকটা ইম্পরট্যান্ট বিষয় |  আমি যদি আরো একটা এনাম ক্রিয়েট করে একটার ভ্যালু আরেকটার সাথে অ্যাসাইন করতে চাই , তাহলে দেখি হয় কি না ??

public enum Gender
{
    Male,
    Female,
    Unknown
}

public enum Gonder
{
    Cricket,
    Football,
    Tennis
}

এখন আমি যদি একটা এলিমেন্ট এর সাথে আরেকটা অ্যাসাইন করাতে চাই , তাহলে কিভাবে করতে হয় ?? Gonder toy = (Gonder)Gender.Male;এইভাবে করতে হবে ।। না হলে , এরর খাবা ।।

তাহলে কম্পাইলার জানেই দুইটাই এনাম টাইপ, তারপরো আমরা অ্যাসাইন করাতে গেলে -- নাম উল্লেখ করে টাইপ কাস্টিং করতে হচ্ছে , তাই না ??? তাহলে বুঝতেই পারছো , এরা কতোটা টাইপ সেন্সিটিভ ?? এই কারণেই এদের   strongly typed constant  বলে ।।

যাই হোক আশা করি , enum  নিয়ে তোমাদের ছোটোখাটো একটা বেসিক ধারণা ক্লিয়ার হয়ে গেছে ।।
























  






No comments:

Post a Comment