ধরা যাক, তোমাকে বলা হল নতুন করে Human নামের একটা ক্লাস তৈরি করো যে ক্লাসটি শুধু নাম এবং বয়স রাখতে পারে। ক্লাসটি লিখে ফেলি-
কিন্তু Human ক্লাস ডিজাইনে একটু সমস্যা আছে। যেহেতু ক্লাসের ডাটা বা ভেরিয়েবলগুলো অন্য ক্লাস থেকে অ্যাক্সেস করা যায় সেহেতু চাইলেই যেকোন ভেলু যেকোন ক্লাস থেকে অ্যাসাইন করা যায়। যেমন ধরো তুমি বা অন্য কোন ইউজার চাইলেই aHuman.name = "Dog" বসিয়ে দিতে পারো অথবা aHuman.age = -40 বসিয়ে দিতে পারো যেটা অপ্রত্যাশিত! কারন বয়স কখনো নেগেটিভ হতে পারেনা। অথ্যাৎ, ভেরিয়েবলগুলোর আমার নিয়ন্ত্রন থাকছেনা। সেক্ষেত্রে আমরা এই ফিল্ডগুলোকে প্রাইভেট করে দিলেই ঝামেলা শেষ। কিন্তু এতে আরেকটা ঝামেলা আছে। আমরা কোন ভেলিড ভেলুও বসাতে পারবোনা বাইরে থেকে। আর এই অ্যাসাইনমেন্টের কাজ টা মেথডের মাধ্যমে করবো। যেখানে কন্ডিশন দেওয়া থাকবে কোন কোন পরিস্থিতিতে আমরা ভেলু অ্যাসাইন বা সেট করবো।
আমরা Human ক্লাসের name এবং age সেট করার জন্য দুইটা পাবলিক মেথড লিখতে পারি। যদি ডাটাগুলো ঠিকঠাক দেওয়া হয় তাহলেই আমরা assign করতে দিবো নাহলে দিবোনা। আর name এবং age কে যেন বাইরে থেকে সরাসরি সেট করা না যায় তাই এই দুটোকে private করে দিবো। মানে হল ডাটা অ্যাসাইন করতে হলে মেথডের মধ্য দিয়েই করতে হবে সরাসরি করা যাবেনা। এতে ফিল্ড সেট করার ক্ষেত্রে আমাদের নিয়ন্ত্রন থাকে কারন মেথডের ভিতরে আমরা ইচ্ছেমত কন্ডিশন সেট করতে পারি।
তো, Human ক্লাসটা আপডেট করে ফেলি। বিষয়টা অনেকটা এরকম-
এটাই কোডে ইমপ্লিমেন্ট করে দেখি-
//File: Human.java
public class Human {
public String name;
public int age;
}
যেহেতু name এবং age পাবলিক, সেহেতু যেকোন ক্লাস থেকে এদেরকে Initilize করা যাবে। এখন আমরা মেইন ক্লাস থেকে একই সাথে Initilize এবং প্রিন্ট করে ফেলবো। //file: StartUp.java
public class StartUp {
public static void main(String[] args) {
Human aHuman = new Human(); //creating object
aHuman.name = "Rakib"; //Initialize name
aHuman.age = 25; //Initialize age
System.out.println(aHuman.name); //print name
System.out.println(aHuman.age); //print age
}
}
Output
Rakib 25
কিন্তু Human ক্লাস ডিজাইনে একটু সমস্যা আছে। যেহেতু ক্লাসের ডাটা বা ভেরিয়েবলগুলো অন্য ক্লাস থেকে অ্যাক্সেস করা যায় সেহেতু চাইলেই যেকোন ভেলু যেকোন ক্লাস থেকে অ্যাসাইন করা যায়। যেমন ধরো তুমি বা অন্য কোন ইউজার চাইলেই aHuman.name = "Dog" বসিয়ে দিতে পারো অথবা aHuman.age = -40 বসিয়ে দিতে পারো যেটা অপ্রত্যাশিত! কারন বয়স কখনো নেগেটিভ হতে পারেনা। অথ্যাৎ, ভেরিয়েবলগুলোর আমার নিয়ন্ত্রন থাকছেনা। সেক্ষেত্রে আমরা এই ফিল্ডগুলোকে প্রাইভেট করে দিলেই ঝামেলা শেষ। কিন্তু এতে আরেকটা ঝামেলা আছে। আমরা কোন ভেলিড ভেলুও বসাতে পারবোনা বাইরে থেকে। আর এই অ্যাসাইনমেন্টের কাজ টা মেথডের মাধ্যমে করবো। যেখানে কন্ডিশন দেওয়া থাকবে কোন কোন পরিস্থিতিতে আমরা ভেলু অ্যাসাইন বা সেট করবো।
আমরা Human ক্লাসের name এবং age সেট করার জন্য দুইটা পাবলিক মেথড লিখতে পারি। যদি ডাটাগুলো ঠিকঠাক দেওয়া হয় তাহলেই আমরা assign করতে দিবো নাহলে দিবোনা। আর name এবং age কে যেন বাইরে থেকে সরাসরি সেট করা না যায় তাই এই দুটোকে private করে দিবো। মানে হল ডাটা অ্যাসাইন করতে হলে মেথডের মধ্য দিয়েই করতে হবে সরাসরি করা যাবেনা। এতে ফিল্ড সেট করার ক্ষেত্রে আমাদের নিয়ন্ত্রন থাকে কারন মেথডের ভিতরে আমরা ইচ্ছেমত কন্ডিশন সেট করতে পারি।
তো, Human ক্লাসটা আপডেট করে ফেলি। বিষয়টা অনেকটা এরকম-
এটাই কোডে ইমপ্লিমেন্ট করে দেখি-
public class Human {
private String name;
private int age;
public void setName(String Name) {
name = Name;
}
public void setAge(int Age)
{
if(Age>0)
age = Age;
else
System.out.println("Please input valid age");
}
}
এখন চাইলেও আগের মত ইনভেলিড ডাটা রাখতে পারবেনা। এখানে private ইউজ করার ফলে অন্য ক্লাস থেকে এই ডাটাগুলো আর অ্যাক্সেস করা যাবেনা। শুধু যে ক্লাসে ডিক্লেয়ার করা হয় সেই ক্লাসেই ব্যবহার করা যাবে। এই পদ্ধতিকে বলা হয় ডাটা হাইডিং বা ইনক্যাপসুলেশন। তাই সবসময় ডাটা প্রাইভেট রাখা উচিৎ এবং সেট বা গেট করার জন্য আলাদা পাবলিক ফাংশন ইউজ করাটা বেস্ট প্র্যাক্টিস।
ডাটা অ্যাক্সেস নিয়ন্ত্রনের জন্য জাভাতে তিন ধরনের কিওয়ার্ড আছে। Public, Private এবং Protected. এদেরকে সাধারনত Access Modifier বলা হয়।
প্র্যাক্টিস প্রব্লেমঃ
ডাটা অ্যাক্সেস নিয়ন্ত্রনের জন্য জাভাতে তিন ধরনের কিওয়ার্ড আছে। Public, Private এবং Protected. এদেরকে সাধারনত Access Modifier বলা হয়।
প্র্যাক্টিস প্রব্লেমঃ
No comments:
Post a Comment