জাভা প্রোগ্রামিং – ১০ – OOP # ১

OOP বা অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কি জিনিস? খায় পড়ে নাকি মাথায় দেয়, এইটা কেন ইউস করে লোকে? আর করলে বেনেফিট কি? অনেক প্রশ্ন। এক পোস্টে উত্তর দিলে লোকে হারিয়ে যাবে। তাই এইটা ইন্ট্রো টু OOP।

আদিকথন

এককালে কম্পিউটার চালাতো সিজিপিএ ৪ পাওয়া লোকজন। এই অতিমাত্রিক আঁতেলদের লোকে এড়িয়ে চলতো। বেচারারা আর কি করবে? লোকে না ডাকে পাবে না ডাকে ঘাটে না ডাকে অন্য কোথাও। এরা জীবন কাটানো শুরু করলো ল্যাবে। ৬০ এর দশকে মিলিটারি এবং সায়েন্টিফিক রিসার্চের জন্য কম্পিউটার ব্যাপকভাবে ইউস করা শুরু হলো। তো এসব আঁতেলরা সায়েন্টিফিক রিসার্চের জন্য দূর্বোধ্য সব প্রসিডিউর(মানে প্রোগ্রাম) লিখে সেগুলা রান হতে দিয়ে নান্নার কাচ্চি খাইতে যাইত। কোড রান হলেই হইসে, কি দরকার সেইটাকে আবার ইউস করা, আবার কেউ পইড়া বুঝবে কিনা সেইটা ভাবতে যাওয়ার? আমি জানি, আই অ্যাম সিজিপিএ ৪! (হোয়াটেভার)।

১৯৮৪ তে অ্যাপল প্রথম ম্যাকিন্টোশ ছাড়ে। প্রথম পার্সোনাল কম্পিউটার যেটা চালাইতে সিজিপিএ ৪ কিংবা কম্পিউটার সায়েন্সে পিএইচডি ডিগ্রী লাগতো না। অ্যাপল এইটাকে বাজারজাত করে The Computer for the rest of us বলে। পার্সোনাল কম্পিউটার মার্কেটের সেই শুরু। এর কয়েকদিন পরে আইবিএম যখন আইবিএম ৩৬০ ছাড়ে তখন মানুষের ঘরে ঘরে কম্পিউটার যাওয়া শুরু করে দিয়েছে(আমেরিকাতে**)।

এখন সাধারণ মানুষ তো আর বসে বসে প্যারাবোলা প্রাস স্ট্রেট লাইন এসবে ইকুয়েশন ইমপ্লিমেন্ট করে গ্রাফ আঁকবে না বা ইকুয়েশন সল্ভ করবে না। তারা চালাবে সাধারণ কাজের জন্য যেমন ডকুমেন্ট লেখা গান শোনা মুভি দেখা এইসবের জন্য(যদিও ইনিশিয়ালি কম্পিউটারে মুভি দেখার বিষয়টা কারো মাথায় আসে নাই!), তাদের জন্য সফটওয়্যার বানাতে হবে। এবং সেইটা বানাতে গিয়ে লাগলো ঝামেলা। দেখা যাচ্ছে মোটামুটি মানের সফটওয়্যার বানাতে কয়েক হাজার লাখ লাইনের কোডবেইজ হয়ে যাচ্ছে এবং পরের বার সেম টাইপের সফটওয়্যার বানাতে গেলে আবার সব নতুন করে লেখা লাগছে। রিইউজ করার উপায় নেই। সে যুগে OOP ছিলো না, তাইলে এখনকার মতন সুন্দর ফ্রেমওয়ার্ক হাবিজাবি ছিলো না। সবচাইতে বড় ব্যাপার, সফটওয়্যার বানাতে গেলে তো আর শুধু ইকুয়েশন নিয়ে ভাবলে হবে না, রিয়াল লাইফ প্রবলেম মডেল করতে গেলে তেমন একটা স্ট্রাকচার ও লাগবে। ধরো আমাকে বাসার সব লোকজনের ফোন ডিরেক্টরি বানাতে হবে। অ্যারে দিয়ে কাজটা অনায়াসে করা যায়। কিন্তু আমাকে যদি বলে বাসার লোকজনের নাম, বয়স, ফোন নাম্বার এইসব ও রাখতে হবে আমি কয়টা অ্যারে নিবো আর কত কি ম্যানেজ করবো? C তে struct টাইপ দিয়ে FamilyMember নামের একটা টাইপ নাহয় বানিয়ে নিলাম কিন্তু আমার যদি কালকে হুট করে বলা হয় যে অমুকের বয়স আপডেট করো এবং ফোন নাম্বার ও চেঞ্জ করো, তখন পুরোটা ধরে করা লাগবে। ফাংশন লিখবা? ফাইন, ফাংশনে পুরা অ্যারে বা ভেরিয়েবল পাঠানো লাগবে, মেমরি অপচয়। (সে আমলে র‍্যাম থাকতো কিলোবাইট বেশি হইলে মেগাবাইট সাইজে, আর এখন গুগল ক্রোম চালু করলেই ৬০০ এমবি র‍্যাম খায়)।

তার উপর কথা আছে। ধরো তোমার এইরকম সফটওয়্যার বানানোর বিজনেস আছে। এখন তোমাকে ক্লায়েন্টের চাহিদা অনুযায়ী সফটওয়্যার কোড চেঞ্জ করতে হবে। তুমি কি পুরো কোড বদলাবে এখন চেঞ্জ করতে গিয়ে? এরপর তোমার কোডবেজ যদি লাইব্রেরি আকারে থাকে এবং আরেকজন যদি ইউস করতে চায় তুমি কীভাবে নিশিচত করবে সে তোমার কোড মেরে দিবে না? (সে যুগে চুরি বাটপারি ভালোভাবেই হতো) এবং সাথে তোমাকে এইটাও নিশ্চিত করতে হবে যে তোমার প্রোগ্রামার নতুন কোড বেজ ঠিক করতে গিয়ে কুদ্দুসের নামে আবুলের নাম এবং আবুলের নামে কুদ্দুসের নাম দিয়ে দেয়নি (man is mortal, মানুষ মাত্রই ভুল করে, তাও এইসব করলে ব্যবসায় লাল বাতি জ্বলবে)

কোড রিইউজ করা যায় না, অ্যাকসেস কন্ট্রোল করা যায় না। এরপর বড়ো সমস্যা ছিলো রিয়াল লাইফ অবজেক্ট কে প্রোগ্রামে মডেল করার মতন কোন স্ট্রাকচার ছিলো না। এইসব সমস্যা দূর করতে OOP এসেছিলো।

OOP

অবজেক্ট

OOP তে মূল জিনিস হচ্ছে অবজেক্ট। অবজেক্ট কি জিনিস? সহজ বাংলায় বললে অবজেক্ট একটা ভেরিয়েবল। অবজেক্ট একটা রিয়াল লাইফ মডেলের প্রোগ্রামেটিক মডেল। এহ কঠিন কথা। উদাহরণ দেই।

ধরো তোমার ফ্যামিলি মেম্বার দের জন্য একটা টাইপ। এইটার অবজেক্ট কি কি হতে পারে? Father, Mother, Sister, .... ইত্যাদি।

এখন অবজেক্ট হওয়াতে বাড়তি কি কি সুবিধা পাবো আমি যেটা আগে পাইতাম না?

অবজেক্টের ২ টা অংশ থাকে। একটা হচ্ছে প্রোপার্টি, আর ফাংশনালিটি। এইটাকে বাংলায় বললে দাঁড়ায়, একটা রিয়াল লাইফ অবজেক্টের যেমন কিছু বৈশিষ্ট্য (প্রোপার্টি) থাকে তেমনি সে কিছু কাজ ও করতে পারে(ফাংশনালিটি)। অর্থাৎ আগের প্রসিডিউরাল স্টাইলে আমরা শুধু বৈশিষ্ট্য ই দিতে পারতাম। কি কাজ করে সেটা আলাদা করে দিতে গেলে আলাদা ফাংশন লেখা লাগতো যেটা আর অবজেক্টের নিজের ফাংশনালিটি হতো না। একটা জেনারালাইজড হয়ে যেত। সবাই তো বাস্তব জীবনে এক রকম কাজ করে না তাই না!

তাইলে ক্লাস কি?

ওয়েল লোকে যখন দালান বানায়, জমি কিনে সাথে সাথে পাইলিং করা শুরু করে না। তারা প্ল্যান করে এরপর সেই প্ল্যান অনুযায়ী দালান বানায়। এখন অবজেক্ট বানাবা, তাকে কি কি প্রোপার্টি দিবা কি কি ফাংশনালিটি দিবা এইটার ব্লু প্রিন্ট বা প্ল্যান কি হবে? এই প্ল্যানটাই হচ্ছে ক্লাস।

ক্লাস প্ল্যান দেয়। অ্যাবস্ট্র্যাক্ট জিনিস। অবজেক্ট হচ্ছে তার ইমপ্লিমেন্টেশন। জাভাতে এতদিন ধরে ক্লাস দেখে আসছো এইবার আন্দাজ করার চেষ্টা করো কেন কি হয়!

এনক্যাপ্সুলেশন, ইনহেরিটেন্স, পলিমর্ফিজম

অবজেক্ট ওরিয়েন্টড প্রোগ্রামিং এর ভিত্তি ৩ টা। OOP কে ডিফাইন করতে গেলে এই ৩ টা দিয়ে অনায়াসে করা যায়। নাহলে OOP মানে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এইটা মুখস্থ করে দিনাতিপাত করা লাগবে।

  • এনক্যাপ্সুলেশন
  • ইনঘেরিটেন্স
  • পলিমর্ফিজম

এই পোস্টের জন্য আমরা শুধু এনক্যাপ্সুলেশন নিয়ে কথা বলবো।

১ – এনক্যাপ্সুলেশন

সহজ বাংলা ভাষায় এনক্যাপ্সুলেশন মানে হচ্ছে ঢেকে রাখা। এইটাকে প্র্যাকটিকালি এইভাবে দেখানো যায়, তোমার কোম্পানির ইঞ্জিনিয়ার কে বললে যে ভাই আমরা তো পিওরিস্ট মানুষ, আমরা সব হাতে লেখি, তাই তোমাকে সব ফাংশন লিখেই করা লাগবে, তুমি একটা ফাংশন লিখবা যাতে ফোন নাম্বার বদলানো যায়। প্রসিডিউরাল স্টাইল। সে বলল আচ্ছা। এখন অলরেডি FamilyMember টাইপের ভেরিয়েবলে সবার নাম ধাম দেয়া আছে। তোমার ইঞ্জনিয়ার ফাংশন লেখতে গিয়ে এমন ভজঘট পাকাইলো যে ফোন নাম্বার তো বদলাইলই নাম ও গায়েব হয়ে গেলো। তার আসলে কাজ করার দরকার ছিলো কি নিয়ে ? জাস্ট ফোন নাম্বার রাইট? বাকি জিনিস কি ধরার দরকার ছিলো? না। তুমি কি চাইলে অ্যাকসেস কন্ট্রোল করতে পারতে যে সে শুধু ফোন নাম্বার তাই এডিট করতে পারবে? …….

এই অ্যাক্সেস কন্ট্রোলের বিষয়টাকে বলা হয় এনক্যাপ্সুলেশন। মানে কিছু জিনিসের অ্যাকসেস রেস্ট্রিক্ট করে দিবা। সব দিবা না।

Imgur

জাভাতে ক্যামনে করে?

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

জাভার অ্যাকসেস মডিফায়ার ৩ টা
– public
– private
– protected

নাম শুনে আন্দাজ করতে পারার কথা কোনটার কাজ কি। protected নিয়ে বলতে গেলে প্যাকেজ নিয়ে কিছু গ্যাঁজানো লাগবে সেটা পরে করছি।

তার আগে একটা ক্লাস লেখি।

public class FamilyMember {
    public String name;
    public int age;
    public String phoneNumber;
}

এইখানে সব পাবলিক । মানে চাইলেই সব অ্যাকসেস করা যাবে। ক্যামনে?

public static void main(String[] args) {
    FamilyMember x = new FamilyMember();

    x.name = "কুদ্দুস";
}

মানে একটা . অপারেটর দিলেই কাজ শেষ। এখন সব ওপেন কইরা দিলে তো বিপদ। চিলে আইসা সব নিয়া যাবে। তাইলে এইটার অ্যাকসেস কন্ট্রোল করবো ক্যামনে? public থেকে private করে দাও। . অপারেটর দিয়ে আর কাজ হবে না। কিন্তু এখন একটা ছোট্ট সমস্যা দেখা দিলো। তুমি নাম , বয়স ইত্যাদি বের করবা ক্যামনে?

ওয়েল গেটার ফাংশন, সেটার ফাংশন লেখবা। এই আরকি। সেটার মডিফাই করে, গেটার ভ্যালু কি আছে সেইটা রিটার্ন করে।

name প্রোপার্টি এর জন্য গেটার সেটার হবে –

public void setName(String newName) {
    name = newName;
}

public String getName() {
    return name;
}

আচ্ছা সেটার গেটার প্রাইভেট করে দিলে কি হবে? করে দেখো কি হয় 😉

এখন কথা হচ্ছে, তোমরা বাকি ২ টা প্রোপার্টির সেটার গেটার লেখো। এইবার প্রশ্ন হচ্ছে – যদি পাবলিক প্রাইভেট কিছুই না থাকে তাহলে কি হবে?

Imgur

জাভাতে ডিফল্ট অ্যাকসেস মডিফায়ার হচ্ছে পাবলিক। কিছু দাও নাই মানে পাবলিক কইরা দিসো। এখন কথা হচ্ছে গেটার সেটার দিলে তো অ্যাকসেস দিয়েই দিলাম। তাহলে লাভ হইল কি? ওয়েল সব প্রোপার্টির জন্যই যে দিতে হবে এমন তো কথা নেই 😉 কিছু প্রপার্টি যদি রিড অনলি রাখতে চাও তাদের সেটার না দিলেই কেল্লাফতে।

this কীওয়ার্ডের কাজ কি?

ধরো সেটার ফাংশন টা এমন হইলো –

public void setName(String name) {
    // কোড 
}

এখন তুমি কিভাবে name প্রোপার্টি আর আর্গুমেন্ট name কে আলাদা করবা? name প্রোপার্টিটা ক্লাসে আছে তাই না? তার মানে সে ক্লাসে ভিতরে আছে, এবং অবজেক্ট এও যাবে। তাহলে এইটাকে আলাদা করতে পারার কথা। এই আলাদা করার জন্য this । this যেটা করে যে সে ক্লাসকে নিজের ঢোল নিজে পিটাইতে দেয়, অর্থাৎ সে ক্লাসের রেফারেন্স হোল্ড করে। সেটার টা নতুন করে লেখি।

public void setName(String name) {
    this.name = name;
}

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

Imgur

তুমি কি দেখেছো কভু, কীভাবে অবজেক্ট হয়?

আমার মনে হয় এইটা দিয়ে এই পোস্ট টা শেষ করা উচিত। কী হয় যখন একটা অবজেক্ট বানাও?

  • প্রথমে জেভিএম তোমার অবজেক্টের ক্লাস কি দেখে।
  • ক্লাস থেকে Constructor কল করে।
  • মেমরিতে জায়গা অ্যালোকেট করে।
  • কোন মেমরিতে? হিপ এ। কেন হিপ? হোল্ড অন।
  • অবজেক্ট কাজ করার জন্য রেডি।

এখন পয়লা প্রশ্ন Constructor কী, দ্বিতীয় প্রশ্ন, হিপ মেমরি কি?

Constructor একটা মেথড। যার কাজ হচ্ছে কোন ক্লাসের অবজেক্ট কে ইন্সটেনশিয়েট করা। ইন্সটেনশিয়েট করা কি জিনিস সেটা অ্যারে দেখানোর সময় বলেছি। Constructor কল হয়েছে মানে অবজেক্ট তৈরি হয়েছে এবং সে অনুযায়ী মেমরি অ্যালোকেট হয়েছে।

এখন হিপ কি? ডেটা স্ট্রাকচার এর জ্ঞান ছাড়া হিপ কি বুঝানো মুশকিল। হিপ একটা বিশেষ স্ট্রাকচার, জাভাতে হিপের কাজ হচ্ছে অবজেক্ট ভেরিয়েবলের রেফারেন্স রাখা।

একটা ডায়াগ্রাম দেখলে বুঝবা।

img
যেটা হয় যে, তোমার ক্লাসের যে প্রোপার্টি গুলো থাকে, অবজেক্ট ক্রিয়েশনের সময় তাদের একটা করে কপি তৈরি হয়। এবং সে কপিগুলো জমা হয় স্ট্যাক নামের একটা স্ট্রাকচারে। কিন্তু কার কপি কোনটা এইটা প্রোগ্রাম বুঝবে ক্যামনে? কোনটা কার সে রেফারেন্স রাখা হয় হিপে। যখন অবজেক্টের কোন মেথড বা প্রোপার্টি থেকে কিছু নিতে যাবা, প্রোগ্রাম প্রথমে যাবে হিপের কাছে, হিপ পাঠাবে স্ট্যাকের কাছে।

Constructor এর জাভা সিনট্যাক্স কি?

আমরা FamilyMember ক্লাসটা ভালো করে লেখি

public class FamilyMember {
    private String name;
    private int age;
    private String phoneNumber;


    // constructor
    public FamilyMember() {

    }

    //  setter getter


}

যদি Constructor না দেই তাহলে কি হবে? জাভা ডিফল্ট কন্সট্রাক্টর কল করবে যেটার ডেফিনিশন খালি। ফকফকা। তলে তলে টেম্পু চালিয়ে কাজ সে ঠিকই করে নিবে যদিও। আর হ্যাঁ Constructor মেথড হলেও তার রিটার্ন টাইপ থাকে না। কন্সট্ররাক্টরের নাম ক্যামনে দেয়? নিয়ম একটাই। ক্লাসের নাম দিয়ে দিবা। আর যদি Constructor প্রাইভেট করে দেই তাহলে কি হবে? ভাবো কি হবে 😉

Imgur

Constructor এ কি প্যারামিটার দেয়া যায়?

হ্যাঁ যায়। তুমি চাইলে ধরে ধরে সেটার কল না করে অবজেক্ট ইন্সটেনশিয়েট করার সময় সব দিয়ে দিতে পারো। ধরো Constructor এমন –

public FamilyMember(String name, int age, String phoneNumber) {
    // চাইলে this দিয়ে ভ্যালু সেট করতে পারো 
    // অথবা সেটা গেটার কল করতে পারো 
}

একটা ক্লাসের কি একাধিক Constructor থাকতে পারে?

পারে। কীভাবে? এজন্য মেথড ওভারলোডিং নামে একটা জিনিস আছে সেইটা লাগে।

শেষ!

Imgur

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s