সফটওয়্যার ডেভেলপমেন্টে তুমি যখন বড় কোনো প্রজেক্ট নিয়ে কাজ করো, তখন সবচেয়ে বড় চ্যালেঞ্জগুলোর একটি হলো কোডবেসকে ক্লিন, মেইনটেইনেবল এবং স্কেলেবল রাখা। প্রজেক্ট যত বড় হতে থাকে, কোডের পরিমাণ তত বাড়ে। এই সময়ে যদি একই লজিক বা কোড বারবার বিভিন্ন জায়গায় কপি-পেস্ট করে লেখা হয়, তবে তা শুধু দেখতেই এলোমেলো হয় না, বরং ভবিষ্যতে বাগ ফিক্স করা বা নতুন ফিচার যুক্ত করা প্রায় অসম্ভব করে তোলে।
এই পুনরাবৃত্তির সমস্যা থেকে সফটওয়্যারকে বাঁচাতেই জন্ম হয়েছে DRY Principle-এর।
DRY Principle কী?
DRY-এর পূর্ণরূপ হলো Don't Repeat Yourself। অ্যান্ডি হান্ট এবং ডেভ থমাস তাদের বিখ্যাত বই "The Pragmatic Programmer"-এ প্রথম এই নীতির কথা বলেন। এর মূল কথা হলো: "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."
অর্থাৎ, একটি সিস্টেমে যেকোনো নির্দিষ্ট লজিক বা তথ্যের কেবল একটিমাত্র উৎস (Single Source of Truth) থাকবে। একই লজিক একাধিক জায়গায় ডুপ্লিকেট করা যাবে না।
সহজ একটি উদাহরণ দিয়ে ভাবো। তুমি পরীক্ষার জন্য নোট বানাচ্ছ। তুমি যদি একই বিষয়ের সংজ্ঞা খাতার তিন-চার জায়গায় আলাদা করে লিখে রাখো, তাহলে পরীক্ষার আগে যদি ওই সংজ্ঞায় কোনো ছোট পরিবর্তন আনতে হয়, তবে তোমাকে তিন-চার জায়গাতেই তা আপডেট করতে হবে। ভুলে এক জায়গায় আপডেট না করলে ভুল তথ্য থেকে যাবে। কিন্তু তুমি যদি একটি সেন্ট্রাল সামারি বানাও এবং সব জায়গা থেকে শুধু সেই পৃষ্ঠাটি রেফার করো, তাহলে একবার আপডেট করলেই পুরো কাজ হয়ে যাবে। কোডিংয়ের ক্ষেত্রেও ঠিক এই কনসেপ্টটি কাজ করে।
DRY না মানলে কী হয় (Bad Practice)
ধরা যাক, তোমার তৈরি করা একটি অ্যাপ্লিকেশনে একাধিক জায়গায় ইউজারের বয়স চেক করার লজিক দরকার।
# Module 1: Checkout Page
user_age = 20
if user_age >= 18:
print("You are an adult. Access granted.")
else:
print("You are a minor. Access denied.")
# Module 2: Profile Settings Page
profile_age = 16
if profile_age >= 18:
print("You are an adult. Access granted.")
else:
print("You are a minor. Access denied.")
এখানে সমস্যা কোথায়? ১. একই if-else লজিক তুমি দুই জায়গায় লিখেছ। ২. ভবিষ্যতে যদি সরকারি নিয়মে পরিবর্তন আসে এবং অ্যাডাল্ট হওয়ার বয়স ১৮ থেকে ২১ করা হয়, তবে তোমাকে পুরো প্রজেক্ট খুঁজে খুঁজে যেখানে যেখানে এই লজিক আছে, সব জায়গায় পরিবর্তন করতে হবে। ৩. যদি কোনো এক জায়গায় আপডেট করতে ভুলে যাও, তবে সিস্টেমে ইনকনসিস্টেন্সি বা বাগ দেখা দেবে। একে বলা হয় মেইনটেন্যান্স নাইটমেয়ার।
DRY মেনে চললে (Good Practice)
DRY প্রিন্সিপাল মানার জন্য আমরা এই কমন লজিকটিকে সেন্ট্রালাইজ করে একটি ফাংশনে নিয়ে আসব।
# The common logic was placed in a central function.
def check_adult_status(age):
"""চেক করে ইউজার অ্যাডাল্ট কি না এবং স্ট্যাটাস রিটার্ন করে"""
ADULT_AGE_LIMIT = 18
if age >= ADULT_AGE_LIMIT:
return "You are an adult. Access granted."
else:
return "You are a minor. Access denied."
# Module 1: Checkout Page
print(check_adult_status(20))
# Module 2: Profile Settings Page
print(check_adult_status(16))
সুবিধা:
১. লজিক সেন্ট্রালাইজ বা এক জায়গায় হয়ে গেছে।
২. এখন যদি বয়সসীমা ১৮ থেকে ২১ করতে হয়, তুমি শুধু ADULT_AGE_LIMIT এর মান পরিবর্তন করবে। পুরো সিস্টেমে তা স্বয়ংক্রিয়ভাবে আপডেট হয়ে যাবে।
৩. কোড এখন অনেক বেশি ক্লিন, মেইনটেইনেবল এবং স্কেলেবল।
DRY Principle-এর গভীরে: কেন এটি এত গুরুত্বপূর্ণ?
১. Maintainability (রক্ষণাবেক্ষণ সহজ হয়): কোডবেসে বাগ ফিক্স করা বা নতুন ফিচার যুক্ত করা অনেক সহজ হয়। এক জায়গায় পরিবর্তন করলে পুরো সিস্টেমে তার প্রভাব পড়ে।
২. Readability (পঠনযোগ্যতা বৃদ্ধি পায়): ডুপ্লিকেট কোড না থাকায় ফাইলের আকার ছোট হয়। ফাংশন বা ক্লাসের নাম দেখে অন্য ডেভেলপাররা সহজেই বুঝতে পারে কোডটি কী কাজ করছে।
৩. Reusability (পুনর্ব্যবহারযোগ্যতা): একবার লেখা কোড তুমি প্রজেক্টের যেকোনো জায়গা থেকে বারবার কল করে ব্যবহার করতে পারবে।
৪. Consistency (ধারাবাহিকতা): সিস্টেমে একই কাজের জন্য একাধিক লজিক থাকে না। ফলে ইনকনসিস্টেন্ট বিহেভিয়ার বা অপ্রত্যাশিত বাগ তৈরি হওয়ার ঝুঁকি থাকে না।
DRY মানার কিছু প্রফেশনাল টিপস
Rule of Three: তুমি যখন একই কোড দ্বিতীয়বার লিখছ, তখন সেটি মেনে নেওয়া যায়। কিন্তু যখনই তৃতীয়বার একই কোড লেখার প্রয়োজন পড়বে, তখনই থেমে যাও এবং সেটিকে রিফ্যাক্টর করে একটি ফাংশন বা মেথডে নিয়ে আসো।
ম্যাজিক নাম্বার পরিহার করো: কোডের ভেতর সরাসরি নাম্বার (যেমন উপরোক্ত উদাহরণে 18) ব্যবহার না করে সেগুলোকে কনস্ট্যান্ট (Constant) ভেরিয়েবলে সেন্ট্রালাইজ করো।
ডেটাবেস লজিক ডুপ্লিকেট করবে না: ORM (যেমন: Django ORM বা SQLAlchemy) ব্যবহার করলে একই কোয়েরি বারবার না লিখে কাস্টম ম্যানেজার বা রিপোজিটরি প্যাটার্ন ব্যবহার করো।
ওভার-অ্যাবস্ট্রাকশন থেকে সাবধান: DRY মানতে গিয়ে অনেক সময় ডেভেলপাররা সবকিছু সেন্ট্রালাইজ করতে চায়। যদি দুটি কোড দেখতে একই রকম হয় কিন্তু তাদের বিজনেস লজিক বা উদ্দেশ্য সম্পূর্ণ ভিন্ন হয়, তবে তাদের জোর করে এক ফাংশনে ঢোকানোর চেষ্টা করবে না। অতিরিক্ত অ্যাবস্ট্রাকশন কোডকে আরও বেশি জটিল করে তুলতে পারে।
DRY প্রিন্সিপাল মানা মানে শুধু দেখতে সুন্দর কোড লেখা নয়, বরং ফিউচার-প্রুফ এবং বাগ-ফ্রি সফটওয়্যার তৈরি করা। এটি এমন একটি অভ্যাস যা তোমাকে একজন সাধারণ প্রোগ্রামার থেকে প্রফেশনাল সফটওয়্যার ইঞ্জিনিয়ারে পরিণত করবে।