আজকে আমরা , 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 নিয়ে তোমাদের ছোটোখাটো একটা বেসিক ধারণা ক্লিয়ার হয়ে গেছে ।।
মূলত প্রোগ্রামকে আরো বেশী 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