পোস্ট
নির্ভরতা ইনজেকশন কি আমাকে একজন ভাল পাইথন প্রোগ্রামার বানাতে পারে?
১৬ ফেব্রুয়ারী, ২০২৫ • 3 মিনিট পড়া
নির্ভরতা ইনজেকশন স্ট্যাটিক ভাষাগুলিতে একটি প্রধান বৈশিষ্ট্য, কিন্তু এটি পাইথনে ব্যবহার করা কি যুক্তিসঙ্গত? এটি কি আমাকে একজন ভাল পাইথন প্রোগ্রামার বানাবে?
এবং, অপেক্ষা করুন, নির্ভরতা ইনজেকশন আবার কি?
প্রথমে, প্রশ্নের উত্তর দেওয়া যাক: নির্ভরতা ইনজেকশন (DI) কি?
নির্ভরতা ইনজেকশন একটি প্যাটার্ন যা ব্যবহার করা হলে, একটি অবজেক্টের নির্মাণকে ক্লাসের বাইরে নিয়ে যায়। পরিবর্তে, ক্লাস একটি বিমূর্ততার উপর নির্ভরতা নেয়।
সি# এবং জাভার মতো স্ট্যাটিক ভাষাগুলিতে, নির্ভরতা ইনজেকশন সংযোগ কমাতে এবং পরীক্ষা সহজতর করতে ব্যাপকভাবে ব্যবহৃত হয়। প্রকৃতপক্ষে, আপনি নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক খুঁজে পাবেন যাদের একমাত্র উদ্দেশ্য হল নির্ভরতা এবং তাদের একে অপরের সাথে সম্পর্ক বজায় রাখা।
নির্ভরতা ইনজেকশন দুটি প্রধান উদ্দেশ্য পরিবেশন করে:
প্রথমত, এটি একটি বিমূর্ততার উপর নির্ভরতা নিয়ে জটিলতা কমায়।
দ্বিতীয়ত, একটি বিমূর্ততার উপর নির্ভর করা বিভিন্ন বাস্তবায়ন, পরীক্ষার জন্য মকস সহ, ক্লাস বা ফাংশনে পাস করা যায়।
আমি কিছু কোড দিয়ে প্রদর্শন করি:
# Before
class User:
def __init__(self):
self.database = SqlServerDatabase()
def get_details(self, user_id: int):
self.database.get_user_details(user_id)
# After
class User:
def __init__(self, database: Database):
self.database = database
def get_details(self, user_id: int):
self.database.get_user_details(user_id)
এটি তার সরলতম আকারে নির্ভরতা ইনজেকশন। যদিও ধারণাটি সরল, এর শক্তি নমনীয় ডিজাইন সক্ষম করার মধ্যে নিহিত।
Before উদাহরণে, User ক্লাস SqlServerDatabase ক্লাসের সাথে দৃঢ়ভাবে সংযুক্ত। যদি আমরা User ক্লাস পরীক্ষা করতে চাই, আমাদের একটি নতুন SqlServerDatabase উদাহরণ তৈরি করতে হবে।
After উদাহরণে, User ক্লাস Database বিমূর্ততার সাথে দুর্বলভাবে সংযুক্ত। আমরা Database বিমূর্ততার একটি ভিন্ন বাস্তবায়ন User ক্লাসে পাস করতে পারি।
আমি এই নমনীয়তা প্রদর্শন করি একটি ব্যবহারিক উদাহরণ দিয়ে যা দেখায় কিভাবে আমরা বিভিন্ন ডাটাবেস বাস্তবায়নের মধ্যে স্যুইচ করতে পারি:
date_string = "2023-10-01" # Example date string
date_format = "%Y-%m-%d" # Input string format
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 এবং SubStack এ দেখুন।