পোস্ট
ডিপেন্ডেন্সি ইনজেকশন কি আমাকে একজন ভালো পাইথন প্রোগ্রামার বানাতে পারে?
১৬ ফেব্রুয়ারী, ২০২৫ • 3 মিনিট পড়া

ডিপেন্ডেন্সি ইনজেকশন স্ট্যাটিক ভাষাগুলোতে একটি মূল স্তম্ভ, কিন্তু পাইথনে এটি ব্যবহার করা কি যুক্তিসঙ্গত? এটি কি আমাকে একজন ভালো পাইথন প্রোগ্রামার বানাবে?
এবং, অপেক্ষা করুন, ডিপেন্ডেন্সি ইনজেকশন আবার কী?
প্রথমে, প্রশ্নের উত্তর দেওয়া যাক: ডিপেন্ডেন্সি ইনজেকশন (DI) কী?
ডিপেন্ডেন্সি ইনজেকশন হলো একটি প্যাটার্ন যা ব্যবহার করা হলে, একটি অবজেক্টের নির্মাণকে ক্লাসের বাইরে নিয়ে যায়। পরিবর্তে, ক্লাসটি একটি অ্যাবস্ট্রাকশনের উপর নির্ভরতা নেয়।
C# এবং জাভার মতো স্ট্যাটিক ভাষাগুলোতে, ডিপেন্ডেন্সি ইনজেকশন কাপলিং কমাতে এবং টেস্টিং সহজ করতে ব্যাপকভাবে ব্যবহৃত হয়। প্রকৃতপক্ষে, আপনি ডিপেন্ডেন্সি ইনজেকশন ফ্রেমওয়ার্ক পাবেন যার একমাত্র উদ্দেশ্য হলো ডিপেন্ডেন্সি এবং তাদের পারস্পরিক সম্পর্ক বজায় রাখা।
ডিপেন্ডেন্সি ইনজেকশন দুটি প্রধান উদ্দেশ্য পূরণ করে:
প্রথমত, এটি একটি অ্যাবস্ট্রাকশনের উপর নির্ভরতা নিয়ে জটিলতা কমায়।
দ্বিতীয়ত, একটি অ্যাবস্ট্রাকশনের উপর নির্ভর করা বিভিন্ন বাস্তবায়ন, টেস্টিংয়ের জন্য মক সহ, ক্লাস বা ফাংশনে পাস করার অনুমতি দেয়।
আমি কিছু কোড দিয়ে প্রদর্শন করি:
# আগে
class User:
def __init__(self):
self.database = SqlServerDatabase()
def get_details(self, user_id: int):
self.database.get_user_details(user_id)
# পরে
class User:
def __init__(self, database: Database):
self.database = database
def get_details(self, user_id: int):
self.database.get_user_details(user_id)
এটি তার সবচেয়ে সহজ রূপে ডিপেন্ডেন্সি ইনজেকশন। যদিও ধারণাটি সহজবোধ্য, এর শক্তি নমনীয় ডিজাইন সক্ষম করার মধ্যে নিহিত।
আগে
উদাহরণে, User
ক্লাসটি SqlServerDatabase
ক্লাসের সাথে শক্তভাবে যুক্ত। যদি আমরা User
ক্লাস টেস্ট করতে চাই, তাহলে আমাদের একটি নতুন SqlServerDatabase
ইনস্ট্যান্স তৈরি করতে হবে।
পরে
উদাহরণে, User
ক্লাসটি Database
অ্যাবস্ট্রাকশনের সাথে শিথিলভাবে যুক্ত। আমরা User
ক্লাসে Database
অ্যাবস্ট্রাকশনের একটি ভিন্ন বাস্তবায়ন পাস করতে পারি।
আমি একটি ব্যবহারিক উদাহরণ দিয়ে এই নমনীয়তা প্রদর্শন করি যা দেখায় কিভাবে আমরা বিভিন্ন ডেটাবেস বাস্তবায়নের মধ্যে পরিবর্তন করতে পারি:
date_string = "2023-10-01" # উদাহরণ তারিখ স্ট্রিং
date_format = "%Y-%m-%d" # ইনপুট স্ট্রিং ফরম্যাট
birthday = datetime.strptime(date_string, date_format)
turn_of_the_century = datetime.strptime('2000-01-01', date_format)
database = PostgresDatabase("")
if birthday < turn_of_the_century:
database = SqlServerDatabase("")
user = User(database=database)
user.get_details(user_id=1)
লাইন 6 (birthday < turn_of_the_century
) এ, ডিপেন্ডেন্সি ইনজেকশন আমাদের বিভিন্ন শর্তের ভিত্তিতে সহজেই বাস্তবায়ন পরিবর্তন করার অনুমতি দেয়। যদিও এই নমনীয়তা প্রোডাকশন কোডের জন্য মূল্যবান, ডিপেন্ডেন্সি ইনজেকশনের সবচেয়ে সাধারণ ব্যবহারগুলোর মধ্যে একটি, বিশেষ করে স্ট্যাটিক ভাষাগুলোতে, হলো টেস্টিংয়ে।
এখানে একটি উদাহরণ:
class UserTests(unittest.TestCase):
def test_is_authenticated(self):
database = MockDatabase('connection_string')
is_authenticated = User(database).is_authenticated('user', 'pass')
self.assertTrue(is_authenticated)
এটি একটি MockDatabase
ক্লাস ব্যবহার করে একটি সহজ উদাহরণ। পাইথনে, আমরা একই ফলাফল অর্জনের জন্য বিল্ট-ইন Mock
ক্লাসও ব্যবহার করতে পারি।
আকর্ষণীয়ভাবে, আমি যে পাইথন প্রজেক্টগুলোতে কাজ করেছি সেগুলোতে ডিপেন্ডেন্সি ইনজেকশন ব্যাপকভাবে ব্যবহৃত হয়নি। স্ট্যাটিক ভাষার পটভূমি থেকে এসে, আমি অবাক হয়েছিলাম— এবং এটি অযৌক্তিক মনে হয়েছিল।
তবে, এই সীমিত গ্রহণযোগ্যতার একটি কারণ রয়েছে। পাইথনের বিল্ট-ইন প্যাচ কার্যকারিতা ইতিমধ্যে চমৎকার টেস্টিং ক্ষমতা প্রদান করে, যা ডিপেন্ডেন্সি ইনজেকশনের প্রধান সুবিধাগুলোর একটি দূর করে। যদিও ডিপেন্ডেন্সি ইনজেকশন এখনও জটিলতা কমাতে সাহায্য করতে পারে, পাইথনে একই লক্ষ্য অর্জনের জন্য অন্যান্য পদ্ধতি রয়েছে।
আমি বলছি না যে পাইথনে ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করা উচিত নয়। বরং উল্টোটা, সব টুল এবং প্যাটার্নের মতো, সেগুলো ব্যবহার করার একটি স্থান এবং সময় রয়েছে। এবং ডিপেন্ডেন্সি ইনজেকশন আপনার টুল বেল্টের আরেকটি টুল যা আপনার কোডের গুণমান উন্নত করবে।
আমি মনে করি ডিপেন্ডেন্সি ইনজেকশন সাধারণত বেশিরভাগ পাইথন প্রজেক্টে কোডের গুণমান বৃদ্ধি করবে।
যদি আপনি ডিপেন্ডেন্সি ইনজেকশন আরও অন্বেষণ করতে আগ্রহী হন, আমি দুটি জনপ্রিয় পাইথন ফ্রেমওয়ার্ক দেখার সুপারিশ করি:
- Injector (github.com/python-injector/injector)
- Dependency Injector (python-dependency-injector.ets-labs.org)
লেখক: চাক কনওয়ে সফটওয়্যার ইঞ্জিনিয়ারিং এবং জেনারেটিভ এআই-তে বিশেষজ্ঞ। তার সাথে সোশ্যাল মিডিয়ায় যোগাযোগ করুন: X (@chuckconway) অথবা তাকে YouTube-এ দেখুন।