ডার্ট ১০১ - অবজেক্ট ধারণা

আজকের টপিক- অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং প্রবাসে দেশি নাস্তা। অবজেক্ট ওরিটিন্টেড প্রোগ্রামিং কারণ লজিক্যালি এটাই হয় উচিত আমাদের এই ধাপের আলোচ্য বিষয়, আর দেশি নাস্তা কারণ আজ রবিবার এবং সকাল সকাল আমার ছেলেকে নিয়ে এসেছি “ক্যাফে ডি তাজ” নামে এক রেস্তোরায়, আরসালান খুব পছন্দ করে এখানকার লুচি (অথবা, হয়ত খেলতে পছন্দ করে ওদের প্লেরুমে)। সে যা-ই হোক, আশা করছি আপনাদের সবার পেট ভরা অন্যথায় খিদা লাগতে পারে এই পোস্ট পড়ে।

থট এক্সপেরিমেন্ট - ১

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

এবার আমরা চেষ্টা করি এই খাদ্যগুলিকে বর্ণনা দেবার, মনে করুন, এক বিদেশী টুরিস্ট আপনাকে জিজ্ঞাসা করছে- আলুর দম কি জিনিস? কিভাবে এর উত্তর দিবেন? আবার, এক বিদেশী শেফ যে আপনার সাথে কাজ করছে সে জিজ্ঞাসা করল যে, আলুর দম কি? একই জিনিসের বর্ণনা কি আপনি একইভাবে দিবেন নাকি দুইভাবে? আপনি যদি খাবার নিয়ে পোস্ট দিন আপনার সাইটে , তাহলে নিজের তৈরী করা খাবার বনাম পছন্দনিয় রেস্তোরাতে খাবার, দ্রব্য একই হলেও পোস্ট এর ধরণ কি একই হবে?

যে কোন কিছুর বর্ণনা দেওয়ার অগণিত উপায় রয়েছে কিন্তু প্রেক্ষাপট সাপেক্ষে আমরা যে কোন বস্তুর অগণিত রূপের সাবসেট নিয়ে কাজ করে থাকি। যেমন একটা বাজেটিং অ্যাপ কেবল নাস্তার আইটেমের নাম, দাম ও সংখ্যা নিয়ে মাথা ঘামাবে কিন্তু রেসিপি অ্যাপ আলোচনা করবে আরো অনেক কিছু নিয়ে। প্রোগ্রামিং ল্যাঙ্গুয়েজ যখন কোনো বস্তুকে রূপায়িত করে, তখন ক্ষেত্র সাপেক্ষে সে বস্তুর বিভিন্ন মাত্রার বৈশিষ্ট্যের একটা সাবসেট থাকে, যা সমাধানকৃত সমস্যাকে সবচেয়ে ভালভাবে রিপ্রেসেন্ট করে, তো ডাটার যে টাইপ তা হল বাস্তব জগতের একটি আবস্ট্রাকশন, যাকে বলা হয় অ্যাবস্ট্রাক্ট ডাটা টাইপ

থট এক্সপেরিমেন্ট - ২

গত টপিকের ব্যাকরণিক উদাহরণকে মনে রাখলে দেখবেন, আমরা কথা বলেছিলাম ক্রিয়াপদ নিয়ে, এবং তার কর্ম নিয়ে, যা হতে পারে বিশেষ্য অথবা বিশেষণ- বাক্যের বিধেয় অংশে। যদি আমরা, উদ্দেশ্য নিয়ে কথা বলতে যাই তাহলে?

“মাফিনার ক্যাফে দি তাজে গিয়ে ১-টি ব্রেকফাস্ট থালি অর্ডার করেছে” বাক্যটিতে, “অর্ডার করেছে”, “১টি” ও “ব্রেকফাস্ট থালি” হতে পারে ক্রিয়া ও তার কর্ম। ডার্ট (অথবা যে কোন প্রোগ্রামিং পরিভাষায়)- অর্ডার("ব্রেকফাস্ট থালি", ১)। কিন্তু, “মাফিনার” ও “ক্যাফে দি তাজ”? মাফিনার বাক্যিটির উদ্দেশ্য (এবং নামবাচক বিশেষ্য), এবং “ক্যাফে দি তাজ”, আরেকটি নামবাচক বিশেষ্য ও “মাফিনার” বিশেষ্যের অবস্থান এর উপর নির্ভর করছে। আমাদের প্রথমে বর্ণনা করা ক্রিয়া (অথবা ফাংশন) কিন্তু “মাফিনার” বস্তুর একটি অ্যাকশন যা “মাফিনার” ও “ক্যাফে দি তাজ” এর সাথে সংযুক্ত। ফাংশনটি যা-ই রিটার্ন করবে তার প্রতিক্রিয়া “মাফিনার” ও “ক্যাফে দি তাজ” এর উপর বুঝা যাবে।

“ক্যাফে দি তাজ” কী? এটি একটি রেস্তোরা, বাংলাদেশী রেস্তোরা, যা টরন্টোতে অবস্থিত। তো একটা রেস্তোরার অবস্থান রয়েছে, নাম রয়েছে (আপাতত এতটুকুই থাক)। এতে মানুষ যেতে পারে, এর মেনু রয়েছে, মেনুতে খাবার রয়েছে, যার দাম রয়েছে। আরও দুটি বিশেষ্য পদ পেলাম! মেনু ও খাবার। একটা মেনুতে অনেকগুলি খাবার রয়েছে, আর একটা খাবারের নাম ও দাম রয়েছে।

“মাফিনার” কে? একজন মানুষ, যে এই প্রেক্ষাপটে একজন কাস্টমার, যার আপাতত একটি নাম রয়েছে, এবং যে রেস্তোরাটিতে একটি অর্ডার দিতে সক্ষম। অর্থাৎ “মাফিনার” “অর্ডার” নামক একটি কার্যসম্পাদনে সক্ষম।

অর্ডার প্রদান করলে কি হয়? অর্ডার পাওয়ার পর রেস্তোরা কিছু “ক্রিয়া” সম্পাদন করে থাকে, যেমন, বাবুর্চি (আরেকটি বিশেষ্য) কে রাধতে বলা, ক্যাশিয়ারকে বিল তৈরী করতে বলা এবং ইনভেন্টরি থেকে আইটেম বাড়ান কমানোর ব্যবস্থা করা। সমস্ত ক্রিয়া সম্পন্ন হওয়ার সাথে সাথে বিশেষ্যগুলির অবস্থার পরিবর্তন ঘটে, এবং এহেন ক্রিয়ার সমাপনী এবং পারস্পরিক অবস্থার পরিবর্তন সাপেক্ষে সফটওয়্যার সিস্টেম চালিত হয়।

ক্লাস ও অব্জেক্ট

  • আমরা দেখলাম বিশেষ্য পদগুলিকে আমরা এর গুণাবলী (যেমন নাম, দাম ইত্যাদি) এবং আচরণ (যেমন অর্ডার করা, টাকা গ্রহণ করা ইত্যাদি) দুয়ের সমন্বয়ে ব্যক্ত করতে পারি।

  • বিশেষ্য পদেরও কিন্তু প্রকারভেদ রয়েছে। যেমন- নামবাচক, বস্তুবাচক, জাতিবাচক ইত্যাদি। লক্ষ্য করুন, “ক্যাফে দি তাজ” বলুন, “ঘরোয়া” বলুন আর “স্বাদ” বলুন, এরা প্রত্যেকেই কিন্তু এক একটা দেশীয় রেস্তোরার নাম। অর্থাৎ, রেস্তোরা (জাতিবাচক বিশেষ্য) এর যা যা গুণাবলী রয়েছে, তার ভিন্ন ভিন্ন মান অনুযায়ী আমরা ওই জাতিবাচক বিশেষ্যের এক একটা মেম্বার পাব।

  • জাতিবাচক বিশেষ্য টাইপের বস্তু প্রোগ্রামিং ল্যাঙ্গুয়েজে বর্ণনা সর্বস্ব, হোটেল বলতে এর গুণাবলী ও আচরণ বুঝি, আর একটি হোটেলের গুণাবলীগুলোকে মান দিলে আমরা পাই সে জাতির একটা নাম অথবা ইনস্ট্যান্স। প্রথমটি হল ক্লাস, আরেকটি হল অবজেক্ট

  • একই ক্লাসের (জাতিবাচক বিশেষ্যের) ইনস্ট্যান্স (অথবা অবজেক্ট) প্রত্যেকেই আলাদা। “ক্যাফে দি তাজের” মেনুতে আপনি “ইলিশ পোলাও” পাবেন না, তবে “ঘরোয়া”-তে পাবেন। আবার এক রেস্তোরায় অর্ডার দিলে আরেক রেস্তোরার ইনভেন্টরি কিন্তু কমে না, আয়ও বাড়ে না। অর্থাৎ, প্রতিটি অবজেক্টের নিজস্ব গুণাবলী (এট্রিবিউট) ও আচরণ (মেথড) রয়েছে এবং মেমোরিতে তারা নিজস্ব স্থান দখল করে থাকে।

এট্রিবিউট ও মেথড

  • এট্রিবিউট দেখতে ভ্যারিয়েবলের মতো আর মেথড দেখতে ফাংশনের মতো, তবে এদের “মালিক” হল একটা অবজেক্ট, অর্থাৎ, “মাফিনার” ও “মারুফ” দুটিই দুজন মানুষের নাম হলেও “নাম” এট্রিবিউট দু'বেলায় দুজনের অধীনস্থ।

  • মেথড এর সিনট্যাক্স ফাংশনের মতো হলেও যেহেতু এটি একটা অবজেক্টের অধীনস্থ এবং এর অন্যতম কাজ হলো এর অবজেক্টের গুণাবলী পরিবর্তন অথবা অন্যান্য আচরণকে ট্রিগার করা, তাই ব্যবস্থা রয়েছে যে কোন মেথডের, এর অধিকারী অবজেক্টকে রেফার করার। যেমন- স্বাদ রেস্তোরা >> পরিবেশন ( অর্ডার নাম্বার ১০, টেবিল নাম্বার ৩) এর মানে যদি হয় স্বাদ রেস্তোরা অবজেক্ট পরিবেশন আচরণ করছে “১০ নাম্বার অর্ডার” কে, ৩ নাম্বার টেবিলের উপর, তখন হয়ত স্বাদ রেস্তোরার পেন্ডিং অর্ডার সংখ্যা থেকে কমবে ১ টি অর্ডার। অর্থাৎ পরিবেশন মেথডটিকে ব্যবস্থা করে দিয়ে হবে “এই অবজেক্ট” এর এট্রিবিউট “পেন্ডিং অর্ডার” থেকে ১ টিকে বের করে দেওয়া! এই সেই this (জাভা, ডার্ট, ক্ষেত্রবিশেষে জাভাস্ক্রিপ্ট) অথবা self (পাইথন, রুবি) অথবা me (ভিজুয়াল বেসিক?)।

স্ট্যাটিক (ক্লাস) মেম্বার

  • কোন কোন ক্ষেত্রে এট্রিবিউট ও মেথড এর মালিক কিন্তু অবজেক্ট না, বরং ক্লাস। যেমন- কয়টি হোটেল রয়েছে? এটি কিন্তু “রেস্তোরার সংখ্যা”, যা “নতুন রেস্তোরা সৃষ্টি হওয়ার পর বৃদ্ধি পায়। কাজেই এই এট্রিবিউট হল ক্লাস এট্রিবিউট যাকে (স্ট্যাটিক এট্রিবিউটও বলে)। আবার কিছু মেথডও রয়েছে এরূপ, যেমন, আমরা যদি একগুচ্ছ নাম থেকে প্রতিটা নামের জন্য একটা করে রেস্তোরা তৈরী করতে চাই, তাহলে কিন্তু, “নাম থেকে রেস্তোরা” নামের একটি স্ট্যাটিক মেথড বানাতে পারি, যার মালিক কোন একটু রেস্তোরা না, বরং রেস্তোরা ক্লাস হবে, কারণ “এই নামের প্রত্যেকের জন্য একটা করে রেস্তোরা বানাও” বাক্যটি কোনো এক নির্দিষ্ট রেস্তোরা না, বোরন সমস্ত রেস্তোরার ডোমেইনের অন্তর্ভুক্ত।

  • এক স্ট্যাটিক মেথড কেবল আরেকটি স্ট্যাটিক মেথড কল করতে পারবে অথবা স্ট্যাটিক এট্রিবিউট এর ভ্যালু পরিবর্তন করতে পারবে। কারণ, এর ক্ষমতা নেই কোন অবজেক্টের ভেতরে যাওয়ার, ঠিক একই কারণে, স্ট্যাটিক মেথড “this” কে চেনে না

কন্সট্রাক্টর

  • ক্লাস হল একটা টেমপ্লেট, বলতে পারেন একটা খালি ফর্ম, যার শূন্যস্থান পূরণ করে আমরা পাব একেকটা অবজেক্ট। অর্থাৎ, অবজেক্ট এর কিছু মেমোরি দখল করতে হবে। কাজেই এর সৃষ্ট হওয়ার জন্য প্রয়োজন বিশেষ ধরণের এক “স্ট্যাটিক মেথড” যাকে বলা হয় কন্সট্রাক্টর, একটা রেস্তোরা (ধরি যার শুধুমাত্র নাম রয়েছে) তৈরী করতে চান? তাহলে এর কন্সট্রাক্টর ডাকুন। কন্সট্রাক্টর হতে পারে প্যারামিটারবিহীন একটা মেথড যা শুধু মেমোরিতে ইনিশিয়ালাইজ করবে এবং এরপর আপনি নিজ হাতে এর মান দিবেন। অথবা আপনি নাম দিয়েই করতে পারেন অবজেক্ট সৃষ্টি। মানে- “আমি একটি রেস্তোরা বানাতে চাই। রেস্তোরাঁটির নাম হবে “আরসালান রেস্তোরা”” হতে পারে একটা উপায়, “আমি আরসালান রেস্তোরা নাম একটা রেস্তোরা বানাতে চাই” হতে পারে আরেকটা। সবই প্যারামিটারের উপর নির্ভর করে কন্সট্রাক্টরের।

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

অব্জেক্ট সম্পর্ক

ইনহেরিটেন্স

  • এবার একটু দেশে আসি। “প্রিমিয়াম সুইট” এবং “পিজা হাট” দুটোই কিন্তু খাবার পরিবেশন করে, তবে এক নিঃশ্বাসে এ দুয়ের নাম কতবার নিয়েছেন? “প্রিমিয়াম সুইট” এর নাম হয়ত নিবেন “বিক্রমপুর মিষ্টান্ন ভান্ডার” এর সাথে, “পিজা হাটের”-র নাম “ডোমিনউস” (“উ” ইচ্ছা করে দেওয়া) এর সাথে, কারণ একটা মিষ্টির রেস্তোরা, অপরটি পিজার। যদিও দুটিই খাবার পরিবেশন করে, এদের খাবার পরিবেশনের স্টাইল এবং কিছু ব্যবস্থা (যেমন- বুকিং দেওয়া, বিলিং টাইম ইত্যাদি) ভিন্ন। একই কথা বলা যেতে পারে, পিজা ও গার্লিক ব্রেডের ক্ষেত্রে, দুটোই খাওয়া যায়, একটা মেইন আইটেম, আরেকটা স্টার্টার। মেনুতে এদের অবস্থান ভিন্ন ক্যাটেগরিতে। তো এদের যেমন ভিন্ন স্বত্ব রয়েছে, তেমনি আবার কিছু কমন এট্রিবিউট ও বিহেভিয়ারও রয়েছে, তাহলে কি “মেইন আইটেম” আর “স্টার্টার” (উভয়েই মেনু আইটেম), অথবা “মিষ্টান্ন ভান্ডার” অথবা “পিজেরিয়া” (উভহয়েই রেস্তোরা) বর্ণনা করার সময়ে আপনি কমন বিষয়গুলি বার বার বলবেন? না। বাংলাতে যেমন আমরা বলবো, “পিজেরিয়া এক ধরণের রেস্তোরাঁ”, ক্লাস বানানোর সময়েও আমরা বলব একই কথা। শুধুমাত্র সে ক্ষেত্রে রেস্তোরার সৃষ্টি আগে হতে হবে এবং "ক এক ধরণের খ" বলতে আমরা বুঝব "ক খ-কে বর্ধিত করে", অর্থাৎ, "ক", "খ" এর যা আছে, তা, এবং আরো বেশি কিছু। ওয়েলকাম তো ইনহেরিটেন্স!

  • অনেক রেস্তোরাতে সার্ভিস চার্জ অটো-অ্যাড হয়, অনেক জায়গাতে হয় না এবং আপনি টিপস আকারে দিন। ধরি রেস্তোরার “বিল” হল মূল ক্লাস, “সার্ভিস চার্জযুক্ত” বিল হল একে বর্ধিত করা আরেকটি ক্লাস। ধরি, বিল ক্লাসের “টোটাল” নাম একটি মেথড আছে যা সমস্ত আইটেমের দাম ও কোয়ান্টিটির গুণফলের সমষ্টির সাথে ভ্যাট যুক্ত করে। ইনহেরিটেন্স অনুযায়ী, “সার্ভিস চার্জযুক্ত বিল” হল বিলের একটি এক্সটেনশন, অর্থাৎ বিলের সমস্ত গুন্/ব্যবহার এর মধ্যে রয়েছে এবং রয়েছে আরো কিছু। তবে, “টোটাল” মেথড কি এ দুয়ের মাঝে একই আচরণ করে? দ্বিতীয়টিতে কিন্তু “সার্ভিস সার্চ ক্যালকুটলেশন” নামক আরেকটি মেথড (হয়ত স্ট্যাটিক মেথড?) রয়েছে যা যুক্ত হবে “টোটাল” মেথড কম্পিউটেশনে। তবে কি আমরা আরেকটা নাম দিবো এবং তা ব্যবহার করবো? না। নতুন একটা কন্সেপ্টে আসি, “ওভাররাইড”, অর্থাৎ, আপনি যদি, “সার্ভিস চার্জযুক্ত” বিলে “টোটাল” মেথডকে পুনরায় বর্ণিত করেন, তাহলে কিন্তু নাম ও কনট্র্যাক্ট দুটোই ঠিক রইল।

  • this এর কথা মনে আছে? this দিয়ে যেমন আমরা “এই অবজেক্ট” কে বুঝাই, তেমনিভাবে super এর মাধ্যমে, এই অবজেক্টের পূর্বসূরি কে বোঝানো হয়। উপরের টোটাল-টিকেই দেখি, চিন্তা করলে দেখবেন, সার্ভিস চার্জযুক্ত বিল এর টোটাল কিন্তু এর প্যারেন্ট অর্থাৎ বিল এর টোটাল এর সাথে অতিরিক্ত কিছু যোগ করা, সুপার এর সাহায্যে বলতে গেলে- টোটাল = সুপারের টোটাল + সার্ভিস চার্জ

  • “মা আমাকে নাস্তা দাও” বলার পর মা যা-ই দিন না কেন, আমরা কিন্তু খেয়ে নেই, তবে, হোটেলে গিয়ে বার্গার চাইলে যদি আপনাকে সিঙ্গারা দেয়া হয় তাহলে কি চলবে? ধরলাম খাবার একটা ক্লাস, রুটি, পরোটা, বাটার, পিজা, সিঙ্গারা সবই খাবারকে বর্ধিত করে, নাস্তা বলতে “খাবার” বুঝাই, কাজেই, খাবার (প্যারেন্ট) চাইলে যদি আমরা চাইল্ড পাই, তাহলে চলবে, আমি চেয়েছি খাবার, পরোটা একটা খাবার, কাজেই আমার কথা শোনা হয়েছে, তবে, সিঙ্গারা বিশেষ একটা খাবার, পিজা একটি খাবার (যা সিঙ্গারা নয়), সমস্ত পিজা খাবার, তবে সমস্ত খাবার পিজা নয়। কাজেই, “খাবার ক হল পিজা, খাবার খ হল সিঙ্গারা” সঠিক হলেও “পিজা ক একটি সিঙ্গারা” ভুল হবে। অর্থাৎ আমরা প্যারেন্টে চাইল্ড এসাইন করতে পারি, চাইল্ডে পারেন্টকে নয়। অর্থাৎ এসাইনমেন্ট এ টাইপকে টাইট করা যায়, শিথিল না

  • এক টাইপ থেকে অন্য টাইপে পরিবর্তন অর্থাৎ কাস্টিং সম্ভব হয় শুধু প্যারেন্ট/চাইল্ড হিসেবে তৈরী করা ক্লাসদের মাঝে, চাইল্ডকে প্যারেন্টে (সরাসরি, আপকাস্টিং যেমন- স্যুপকে খাবার হিসেবে ব্যবহার করা) অথবা প্যারেন্টকে চাইল্ডে (ডাউনকাস্টিং যদি ও কেবলযদি, প্যারেন্ট ইনিশিয়ালাইজ হয়েছিল চাইল্ড হিসেবে যেমন- খাবার খ = স্যুপ হলে খ কে খাবার থেকে স্যুপে নেওয়া যাবে)।

  • কোন কোন খাবার খাওয়া যায় হাত দিয়ে, কোন কোনটি চপস্টিক দিয়ে, কোনটি চামচ ছাড়া খাওয়া যায় না, আমরা জানি, প্যারেন্ট টাইপে চাইল্ড টাইপ এসাইন করতে পারি, এবং আরো জানি একই নামের মেথডকে চাইল্ডে পুনঃবর্ণিত করা যায়, তাহলে যদি আমি ওভাররাইডকৃত মেথডকে কল করি প্যারেন্ট টাইপের ভেরিয়েবল যা চাইল্ডটাইপকে পয়েন্ট করে? অর্থাৎ যদি খাবার = সুশি, সুপ্ ও ভাত হয় এবং এদের প্রত্যেকের খাও মেথড কল করা হয় তাহলে, কি এদের যার যার খাও কল করা হবে নাকি, খাবার এরটি হবে? উত্তর হল- ওভাররাইডকৃত মেথোড কল হবে, যদিও আমরা টাইপ পরিবর্তন না করি। এহেন টপিকের নাম হল- পলোমর্ফিজম

ইন্টারফেস

  • উপরের বুলেট পয়েন্ট অনুসারে, আমরা এবং কোন মেথডের বর্ণনা করতে পারি, যেমন- টোটাল ট্যাক্স হল ট্যাক্স আছে এমন সব বিলের সমষ্টি, অর্থাৎ আমার যে সমস্ত বিলে ট্যাক্স ক্যালকুলেশন মেথড রয়েছে এদের সমষ্টি, তা হতে পারে রেস্তোরার বিল, গ্যাসের বিল, পানির বিল, টেলিফোন বিল, আবার, আমার ইনকাম ট্যাক্সের চালান। এরা কিন্তু প্রত্যেকে ভিন্ন, এবং আমার মেথড কিন্তু পাত্তা দিবে না কোনটা কে, শুধু ট্যাক্স রয়েছে এমন অবজেক্টদের ট্যাক্স ক্যালকুলেশন মেথড কল করবে, সে যে-ই হোক। আমরা যদি শুধু এই ট্যাক্স ক্যালকুলেশন সমস্ত একটা ক্লাস-কে চিন্তা করি যার শুধু একটাই মেথড রয়েছে, তাহলেই কিন্তু আমাদের মেথড স্যাটিস্ফাইড হয়। এর জন্যে ট্যাক্স ক্যালকুলেশন মেথডের ইমপ্লিমেন্টেশন এরও প্রয়োজন নেই, যতক্ষণ পর্যন্ত আমাদের ক্লাসগুলির “ট্যাক্স ক্যালকুলেশন” নামের মেথড থাকবে (ঠিক একই প্যারামিটারে ও রিটার্ন টাইপে) ততক্ষন চলবে। বলতে পারেন, এটি একটি চুক্তি, যে যাদের যাদের অমুক নামের মেথড রয়েছে শুধু তারাই অংশগ্রহণ করতে পারবে। কিন্তু, ১) যে ল্যাঙ্গুয়েজে একাধিক ইনহেরিটেন্স নেই তাদের কি হবে? আর ২) আমরা কি নতুন নতুন চুক্তির জন্য প্যারেন্ট ক্লাসকে পরিবর্তন করবো? এতে করে ক্লাসের আবস্ট্রাকশনগত গোজামিল হবে না? এর উত্তর দিয়ে অনেক ল্যাঙ্গুয়েজ নিয়ে আসে দুটো কনসেপ্ট- এবস্ট্রাক্ট ক্লাস ও ইন্টারফেস। এদের শুধুমাত্র মেথড এর নাম, প্যারামিটার ও রিটার্র্ন টাইপ রয়েছে তবে ইমপ্লিমেন্টেশন না। ধরতে পারেন, এগুলো একেকটা কনট্র্যাক্ট যা বলে যে "তুমি এই এই এই মেথড ইমপ্লিমেন্ট করবা, কিভাবে করব তা তোমার ব্যাপার তবে সিগনেচার যেন একই থাকে।" যেহেতু এরা কেউ নিজেরা মেথড ইমপ্লিমেন্ট করে না তাই যদি আমরা একাধিক ইন্টারফেস ইম্প্লিমেন্ট করি তাতেও কোন কনফিউশন আসবে না, যদি ট্যাক্সেবলসেলেবল দুইটা ইন্টারফেইসি ট্যাক্স নামের একটা মেথড দাবি করে এবং প্রপার্টি যদি ট্যাক্সেবলসেলেবল দুইটাই হয় তাহলে এর ইমপ্লিমেন্টেশন দুটোকেই স্যাটিসফাই করবে, তবে ওদুটো যদি ক্লাস হতো তাহলে, প্রপার্টি কার ট্যাক্স মেথডকে নিত যদি ওভাররাইড না করে অথবা “সুপার” থেকে কল করে? এই কনফিউশনের কারণেই অনেক ল্যাংগুয়েজ মাল্টিপল ইনহেরিটেন্স সাপোর্ট না করে ইন্টারফেস সাপোর্ট করে থাকে।

  • অনেক ল্যাঙ্গুয়েজ শুধু এবস্ট্রাক্ট ক্লাস (যেমন ডার্ট), আবার অনেকে এবস্ট্রাক্ট ক্লাস ও ইন্টারফেস (যেমন জাভা) দুটোই ব্যবহার করে থাকে।

  • কোন কোন ল্যাঙ্গুয়েজে একটি ক্লাস কেবল একটি ক্লাস থেকে ইনহেরিট করতে পারে (যেমন জাভা, ডার্ট) আবার কেউ কেউ পারে একাধিক ইনহেরিট করতে। উপরেই দেখতে পাচ্ছি একাধিক ইনহেরিটেন্সের একটি সমস্যা এবং যেহেতু ডার্ট (এবং জাভা, পিএইচপি ইত্যাদি) মুলত সিঙ্গেল ইনহেরিটেন্স ফলো করে তাই আমরা সেদিকে আজকের আলোকনায় যাব না।

এসোসিয়েশন - এগ্রিগেশন ও কম্পোসিশন

  • এক ক্লাসের এট্রিবিউট কিন্তু হতে পারে আরেকটা ক্লাসের অবজেক্ট অথবা তার লিস্ট, ম্যাপ ইত্যাদি। একটা মেনুতে কিন্তু রয়েছে মেনু আইটেমের লিস্ট। একটা রেস্তোরার কিন্তু রয়েছে মেনু। এদের বলা হয় এসোসিয়েশন। অর্থাৎ, মেনু ও মেনু আইটেম একে অন্যের অ্যাসোসিয়েট।

  • সিনট্যাক্সগত ভাবে ভিন্ন না হলেও, এসোসিয়েশন আবার দু ধরণের হতে পারে- এগ্রিগেশনকম্পোসিশন। ধরুন আমি বললাম, “সিঙ্গারা, ২ টাকা পিস্” এর মানে কি? একটা সিঙ্গারা যার প্রতি পিস এর দাম ২ টাকা। কিন্তু এ থেকে আপনি কি লাভবান হবেন? হাজার হাজার রেস্তোরার মধ্যে আমি কার কথা বলছি? মেনু আইটেমের অস্তিত্ত্ব নেই মেনু ছাড়া। এ ধরণের এসোসিয়েশনকে বলা হয় কম্পোসিশন। অন্যদিকে, একজন কাস্টমারের প্রিয় রেস্টুরেন্টের লিস্ট রয়েছে, এর মধ্যে থেকে একটি রেসুরেন্ট বের করলে কিন্তু আমরা ঠিকই তা থেকে বুঝতে পারব কি হচ্ছে, অর্থাৎ কাস্টমার রেস্টুরেন্ট “প্রিয় রেস্তোরার” মাধ্যমে কানেক্টেড এবং এরা প্রত্যেকেই একজন আরেকজনকে ছাড়াও ফাংশন করতে পারে। এ ধরণের এসোসিয়েশন হল এগ্রিগেশন।

  • আপনি যদি খুঁজতে চান মেনু আইটেম তাহলে আপনি যাবেন- রেস্তোরা থেকে মেনু, মেনু থেকে মেনু আইটেম। উল্টো দিকে না (যদি মেনু কম্পোসিশন থাকে রেস্তোরার)। কাজেই ন্যাভিগেশন এর দিক বুঝতে পারছেন। অন্যদিকে, রেস্তোরা থেকে কাস্টমার যাওয়া যাবে কাস্টমার তালিকা থেকে, আবার কাস্টমার থেকে রেস্তোরা যাওয়া যাবে, প্রিয় রেস্তোরা থেকে, অর্থাৎ ন্যাভিগেশন দ্বিমুখী।

  • একটা কাস্টমারের একাধিক প্রিয় রেস্তোরা থাকতে পারে, একটি রেস্তোরার একাধিক কাস্টমার থাকতে পারে। কাজেই ১ থেকে n হতে পারে এদের এসোসিয়েশন সংখ্যা। অন্যদিকে, একটি রেস্তোরার মেনু একটাই হতে পারে, এবং একটি মেনু একটামাত্র রেস্তোরার অধীনে থাকতে পারে, কাজেই, এদের ম্যাপিং ১-১

  • উপরের বিষয়গুলি জানতে পারলে UML আমাদের জন্য সহজতর হয়ে উঠবে, সহজ হয়ে উঠবে আমাদের অবজেক্ট ডিজাইনকে প্রেসেন্ট করা টিম মেম্বার অথবা ম্যানেজারদের কাছে।

ইনফরমেশন হাইডিং

  • ক্লাস সৃষ্টি এবং এর বিভিন্ন মেথডের বর্ণনার জন্য আমরা অনেক সময়ে বেশ কিছু এট্রিবিউট বানিয়ে থাকি যার প্রয়োজন সীমিত, শুধুমাত্র ক্লাসের অভ্যন্তরীণ ব্যবহারের জন্য, মাঝে মাঝে শুধুমাত্র ক্লাস এবং এর চিলড্রেনের ব্যবহারের জন্য। এক অবজেক্ট আরেক অবজেক্টকে মেথডের মাধ্যমে মেসেজ পাস্ করে থাকে, অথবা এসোসিয়েশনের মাধ্যমে সম্পৃক্ত হয়ে থাকে, এবং নিজ ক্লাস বহির্ভুত অবজেক্টদের মাথা ঘামানোর প্রয়োজন নেই সেইসব কলকব্জা জেনে, এবং আপনার তৈরী করা অবজেক্ট নিয়ে যে প্রোগ্রামার কাজ করবে তাকেও বেশি জানিয়ে লাভ নেই। একটা বিলের কাজ টোটাল দেওয়া, সে টোটাল বের করতে কি কি সাময়িক ভ্যারিয়েবল ব্যবহৃত হয়েছে তা জেনে লাভ নেই যদি আপনি বিলিং এর কোন লাইব্রেরি ব্যবহার করেন। কাজেই, “ইনফরমেশন হাইডিং” অনেক গুরুত্বপূর্ণ ভূমিকা পালন করে আপনার অবজেক্ট ডিজাইনে। অনেক ল্যাঙ্গুয়েজে প্রাইভেট, পাবলিক ও প্রটেক্টেড মোডিফায়ার রয়েছে যা আপনার এট্রিবিউটকে যথাক্রমে, নিজেদের জন্যে, সবার জন্যে এবং শুধুমাত্র নিজেদের এবং ছেলেপুলের জন্য উম্মুক্ত করে।

  • মাঝে মাঝে এট্রিবিউটের আসল মান এবং এর পাবলিক মান এক না-ও হতে পারে। আমরা হয়ত খাবারের দাম স্টোর করে রাখব টাকা-তে, কিন্তু দেশভেদে তাকে দেখাব ডলার অথবা ইউরোতে। আবার দাম স্টোর করার সময়ে হয়ত আমরা সেভ করব ডলারে কিন্তু সেভ হবে টাকায় (হয়ত সিস্টেমের লোকালিটি অনুযায়ী?)। তাই, ভাল প্রাকটিস হিসেবে, এট্রিবিউটকে প্রাইভেট রেখে এর সেটারগেটার হিসেবে আলাদা মেথড রাখা হয় অনেক ল্যাঙ্গুয়েজে। এদের বলা হয় একসেসর

ডিজাইন ও বেস্ট প্র্যাক্টিস

  • ক্লাস আর অবজেক্ট নিয়ে সিস্টেম ডিজাইন করা নিয়ে আমরা জানলাম। মূলত একাধিক বাস্তব বস্তুর ডাটাভিত্তিক রূপায়ণ এবং তাদের একে ওপরের ইন্টারঅ্যাকশন দিয়ে একটা অবজেক্ট ওরিয়েন্টেড সিস্টেমের সৃষ্টি হয়। কিন্তু আমরা যদি আমাদের প্রব্লেম স্টেটমেন্টকে ছোট ছোট সাব-প্রব্লেমে বিভক্ত করি, তাহলে দেখব যে ওই ছোট ছোট কাজের জন্য একগুচ্ছ ক্লাস ব্যবহৃত হয়। অর্থাৎ, হয়ত রেস্তোরা (এবং এর সুপারক্লাস/সাবক্লাস) পরিচিতি/সেটাপ এ, ওয়েটার, বাবুর্চি ইত্যাদি হিউম্যান রিসোর্সে, কাস্টমার, মেনু, মেনু আইটেম ইত্যাদি সেলস অংশে বসবে ভাল। কতগুলি ক্লাসকে যদি আমরা এভাবে বিভক্ত করতে পারে, তাহলে কিন্তু আমাদের সিস্টেমকে ১) সুন্দরভাবে বর্ণনা ও ডকুমেন্ট করতে পারব এবং ২) একই নামের ভিন্ন ক্লাস থাকলে ওই বিভাজনের মাধ্যমে আলাদা করতে পারব। এই বৃহত্তর বিভাজনকে কেউ কেউ মডিউল, কেউ কেউ নেইমস্পেস, কেউ কেউ লাইব্রেরি বলে থাকে।

  • কোন অব্জেক্টে কি কি থাকবে তা আমরা বুঝব কিভাবে? ওই যে একদম প্রথমে বলেছিলাম যে, অ্যাবস্ট্রাক্ট ডাটা টাইপ? তার মাধ্যমে, এবং অ্যাবস্ট্রাক্ট ডাটা টাইপ আমরা নির্ধারণ করব ক্লায়েন্টের সাথে বার বার ডিসকাশন করে। ভাল ডিজাইন আরেকদিনের (এবং আরেক ইউনিটের) টপিক।

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

দেখা হবে সামনের পর্বে

আমরা এই পর্বের শেষ এখানেই করছি। আশা করব, কনসেপ্টগুলি, বিশেষ করে টার্মগুলি ভালোভাবে বুঝে নিবেন, কারণ আগামী পোস্ট থাকবে এই একই জিনিসের পুনঃআলোচনা, তবে ডার্ট সিন্ট্যাক্সের আলোকে। অধৈর্য হয়ে পড়লে আপনি ঘুরে আসতে পারেন ডার্ট টুর থেকে, খুব সহজেই বুঝে নিতে পারবেন আমি আগামী পোস্টে যা লিখব সে বিষয়ে। আপনি যদি ডার্ট নাও শিখতে চান তাহলেও উক্ত টপিকগুলি থেকে নিজের ল্যাঙ্গুয়েজের সিনট্যাক্স ম্যাপিং করে নিতে পারেন। মনে রাখবেন, যে কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ এর সিনট্যাক্স শিখতে হলে একগুচ্ছ প্রশ্ন করতে হয় নিজেকে এবং উত্তর খুঁজতে হয় গুগলে, কী প্রশ্ন করতে হবে সেটাই চ্যালেঞ্জ, আজকে যা যা আলোচনা করলাম তা আপনাকে সাহায্য করবে- ডার্ট, জাভা, পিএইচপি, অথবা পাইথন এর সিনট্যাক্স শিখতে কি কি প্রশ্ন করতে হবে তা নিয়ে। (যেমন- জাভাতে নেইমস্পেস কিভাবে বানাব? পিএইচপিতে স্ট্যাটিক মেথড কিভাবে হয়? পাইথন কিভাবে ইনহেরিটেন্স ম্যানেজ করে)। কিন্তু এই পোস্ট তেমন খাটবে না হাস্কেল, এলিক্সির, কোন কোন ক্ষেত্রে জাভাস্ক্রিপ্টকে বুঝতে। আশা করবো আজকের পোস্ট কাজে দিয়েছে এবং এর ডার্ট রূপ দেখতে অপেক্ষা করুন আগামী পোস্ট এর।

comments powered by Disqus