দুটি সবচেয়ে গুরুত্বপূর্ণ অবজেক্ট-অরিয়েন্টেড প্রিন্সিপল হলো cohesion এবং coupling।
Cohesion হলো একটি ক্লাসের সব মেথডের মধ্যে সম্পর্ক। কি তারা একই সেটের ইনস্ট্যান্স ভেরিয়েবল এবং প্যারামিটার ব্যবহার করছে, সকল একসাথে একই লক্ষ্যে কাজ করছে? নাকি প্রতিটি মেথড একে অপর থেকে আলাদা লাগছে?
Coupling হলো একটি ক্লাস অন্য ক্লাসগুলোর ওপর কতটা ডিপেন্ডেন্ট, সেটি সিস্টেমের বাকি অংশের সাথে কতটা "বাঁধা হয়েছে", এবং এই ক্লাসটি কতটা আলাদা ব্যবহার করা যায়।

এই দুটি কনসেপ্ট আপনাকে আপনার কোডবেসের প্রতিটি ক্লাসকে একটি নির্দিষ্ট লেন্সের মাধ্যমে দেখতে সাহায্য করে। এই লেন্সগুলো আপনাকে বুঝতে সাহায্য করে আপনার ক্লাস ডিজাইন কতটুকু সলিড এবং কোথায় আপনি কিছু পরিবর্তন করতে পারেন।
সর্বোত্তম ফলাফলের জন্য আপনি লক্ষ্য করবেন উচ্চ cohesion এবং নিম্ন coupling।
Cohesion-এর একটি উদাহরণ
নিম্ন cohesion হলো আপনার পিজায় একটি অস্বাভাবিক টপিং থাকার মতো, উচ্চ cohesion হলো সব কিছু ঠিক থাকার মতো।
আপনি এটি অনুভব করতে পারেন, কিন্তু এটি মাপা কঠিন, আপনি শুধু একটি নম্বর পেতে পারবেন না যা আপনাকে বলে দেবে আপনার ক্লাস কতটুকু cohesive। তাই এটিকে সহজে বুঝানোর জন্য আমি আপনাকে একটি কোড উদাহরণ দেখাতে চাই যেখানে এটি খুব স্পষ্ট।
এখানে:
class Library def lend_book end def return_book end def make_coffee end end
এই উদাহরণে make_coffee খুব স্পষ্টভাবে আলাদা দাঁড়িয়েছে, এমনকি যদি এই লাইব্রেরিতে একটি ক্যাফেটেরি아가 থাকে তবে Library ক্লাসের কফি বানানো কোনো অর্থ বাহন করে না 🙂
ক্যাফেটেরিয়াকে বইগুলোর তথ্য, কীভাবে বই ধার দিতে হয় ইত্যাদি জানার দরকার নেই।
এবং লাইব্রেরিকে কত কফি আছে বা কীভাবে বানাতে হয় সেটি জানার দরকার নেই।
এটিই আমরা LOW cohesion বলতে বুঝি।
অবশ্যই:
এটি সবসময় এতটুকু স্পষ্ট নয়, কখনো কখনো আপনাকে নিখুঁত মনোযোগ দিতে হয় এবং মেথড নামের বাইরে তাকাতে হয়।
- এই মেথডগুলো আসলে কী করছে?
- কী ডেটা নিয়ে কাজ করছে?
- কী অবজেক্টের সাথে কলাবোরেট করছে?
এই প্রশ্নগুলো আপনাকে আপনার ক্লাসের cohesion লেভেল সম্পর্কে একটি ধারণা দেবে।
নিম্ন cohesion কীভাবে ঠিক করবেন?
আপনাকে সেই মেথডগুলো যারা এই ক্লাসে থাকা উচিত নয় সেগুলো বের করে অন্য একটি ক্লাসে রাখতে হবে, প্রায়শই একটি নতুন ক্লাসে।
Coupling-এর একটি উদাহরণ
এখন আসি coupling-কে দেখি।
এখানে উদাহরণ:
class ShoppingCart
attr_accessor :items
def initialize
@items = []
end
end
class Order
def process_order(cart)
cart.items.map(&:price).inject(:+)
end
end
এই উদাহরণে Order ShoppingCart-এর সাথে অত্যন্ত কাপল্ড কারণ এটি এর সম্পর্কে খুব বেশি জানে, এটি জানে items ভেরিয়েবল আছে এবং সেটির সাথে কিছু ক্যালকুলেশন করছে।
এখন যদি আপনি ShoppingCart-এর items ইমপ্লিমেন্টেশন পরিবর্তন করেন, তবে আপনাকে Order-ও পরিবর্তন করতে হবে।
ভালো নয়!
আমরা এটিকে এভাবে ঠিক করতে পারি:
class ShoppingCart
attr_accessor :items
def initialize
@items = []
end
def calculate_total
items.map(&:price).inject(:+)
end
end
class Order
def process_order(cart)
cart.calculate_total
end
end
আমরা coupling কমানো আপনি ক্যালকুলেশনের ডিটেইলগুলো সেখানে সরিয়ে দিয়েছি যেখানে সেগুলোর জায়গা।
একটি রূপকথা চাইলে সেলফোনগুলো চিন্তা করুন যারা ফিক্সড ব্যাটারি সহ আসে, এটিই উচ্চ coupling।
যদি আপনি ব্যাটারি পরিবর্তন করতে পারেন তবে সেটি নিম্ন coupling।
লক্ষ্য করুন যে আপনাকে এখনও কিছু লেভেলের coupling দরকার, ফোন ব্যাটারি ছাড়া কাজ করবে না এবং Order ক্লাস কাস্টমারকে কত চার্জ করতে হবে সেটি না জেনে কাজ করবে না।
সারসংক্ষেপ
আপনি দুটি খুব গুরুত্বপূর্ণ OOP প্রিন্সিপল, cohesion এবং coupling সম্পর্কে শিখতে পেরেছেন। এই দুটি কনসেপ্ট আপনাকে বুঝতে সাহায্য করে একটি ক্লাসের মেথডগুলো কতটুকু একসাথে কাজ করে এবং আপনার ক্লাস সিস্টেমের বাকি অংশ থেকে কতটুকু স্বাধীন।
আপনি এখনই আপনার একটি প্রজেক্টে এটি প্রয়োগ করতে পারেন, সেটি খুলুন এবং আপনার কিছু ক্লাস দেখুন। আপনি সেগুলো কীভাবে উন্নত করতে পারেন আপনি যা শিখলেন সেটি ব্যবহার করে?
পড়ার জন্য ধন্যবাদ! শেয়ার করা এবং নিউজলেটার সাবস্ক্রাইব করা ভুলবেন না যদি এখনো না করে থাকেন 🙂