একমাত্র বৈধ নির্ভরশীলতা ইনজেকশন অ্যান্টি-প্যাটার্ন সম্পর্কে যা আমি সচেতন তা হ'ল সার্ভিস লোকেটার প্যাটার্ন, যা কোনও ডিআই ফ্রেমওয়ার্কের জন্য ব্যবহৃত হলে এটি একটি অ্যান্টি-প্যাটার্ন হয়।
অন্যান্য বা তথাকথিত ডিআই অ্যান্টি-প্যাটার্নগুলির যেগুলি আমি এখানে বা অন্য কোথাও শুনেছি, সেগুলির মধ্যে সাধারণ ওও / সফ্টওয়্যার ডিজাইনের অ্যান্টি-প্যাটার্নগুলির কিছুটা বেশি নির্দিষ্ট ক্ষেত্রে। এই ক্ষেত্রে:
কনস্ট্রাক্টর ওভার-ইনজেকশনটি একক দায়িত্বের নীতি লঙ্ঘন । অনেকগুলি নির্মাণকারী যুক্তি অনেকগুলি নির্ভরতা নির্দেশ করে; অনেক বেশি নির্ভরশীলতা ইঙ্গিত করে যে শ্রেণিটি খুব বেশি কিছু করার চেষ্টা করছে। সাধারণত এই ত্রুটিটি অন্যান্য কোডের গন্ধগুলির সাথে সম্পর্কিত, যেমন অস্বাভাবিকভাবে দীর্ঘ বা অস্পষ্ট ("পরিচালক") শ্রেণীর নাম। স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি সহজেই অত্যধিক অ্যাফেরেন্ট / এফেরেন্ট কাপলিং সনাক্ত করতে পারে।
আচরণের বিপরীতে ডেটা ইনজেকশন হ'ল পল্টেরজিস্ট অ্যান্টি-প্যাটার্নের একটি উপ - প্রকার , 'এই ক্ষেত্রে জিস্টটি ধারক হয়ে থাকে। যদি কোনও শ্রেণীর বর্তমান তারিখ এবং সময় সম্পর্কে সচেতন হওয়া দরকার, আপনি কোনও ইনজেক্ট করবেন না DateTime
যা ডেটা; পরিবর্তে, আপনি সিস্টেম ঘড়ির উপর একটি বিমূর্ততা ইনজেকশন করুন (আমি সাধারণত আমার কল ISystemClock
করি, যদিও আমি মনে করি যে সিস্টেমআর্পার্স প্রকল্পে আরও সাধারণ কিছু রয়েছে )। এটি কেবল ডিআই-র ক্ষেত্রেই সঠিক নয়; এটি টেস্টিবিলিটির জন্য একেবারে অপরিহার্য, যাতে আপনি প্রকৃতপক্ষে তাদের অপেক্ষা না করে সময়-পরিবর্তিত ফাংশনগুলি পরীক্ষা করতে পারেন।
প্রতিটি জীবনচক্রকে সিঙ্গেলটন হিসাবে ঘোষণা করা আমার কাছে কার্গো কাল্ট প্রোগ্রামিংয়ের একটি নিখুঁত উদাহরণ এবং স্বল্প পরিমাণে স্বতঃস্ফূর্তভাবে নামকরণ করা " অবজেক্ট সেসপুল "। আমি মনে রাখার চেয়ে বেশি সিঙ্গলটনের অপব্যবহার দেখেছি এবং এর মধ্যে খুব কমই ডিআই জড়িত।
আর একটি সাধারণ ত্রুটিটি হ'ল বাস্তবায়ন-নির্দিষ্ট ইন্টারফেসের ধরণের (যেমন অদ্ভুত নাম সহ IOracleRepository
) কেবলমাত্র এটি ধারকটিতে নিবন্ধন করতে সক্ষম হ'ল । এটি নির্ভরতা ইনভার্জন নীতি লঙ্ঘন করে এবং এটি কেবল একটি ইন্টারফেস, এর অর্থ এটি সত্যিকারের বিমূর্ত নয়) এবং প্রায়শই ইন্টারফেস বিভাজনও অন্তর্ভুক্ত করে যা ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে ।
সর্বশেষ ত্রুটিটি যা আমি সাধারণত দেখি তা হ'ল " alচ্ছিক নির্ভরতা", যা তারা নেডডিনারে করেছিলেন । অন্য কথায়, এমন একটি কনস্ট্রাক্টর রয়েছে যা নির্ভরতা ইনজেকশন গ্রহণ করে, তবে অন্য একটি কনস্ট্রাক্টর যা একটি "ডিফল্ট" বাস্তবায়ন ব্যবহার করে। এই এছাড়াও চোবান লঙ্ঘন করে এবং tends নেতৃত্ব LSP লঙ্ঘনের সময়ের, ডেভেলপারদের সেইসাথে, ডিফল্ট বাস্তবায়ন প্রায় অনুমানের শুরু, এবং / অথবা ডিফল্ট কন্সট্রাকটর ব্যবহার করে নতুন-ing আপ দৃষ্টান্ত শুরু।
পুরানো প্রবাদটি যেমন চলে যায়, আপনি যে কোনও ভাষায় ফোরট্রান লিখতে পারেন । নির্ভরতা ইনজেকশন কোনও রূপালী বুলেট নয় যা বিকাশকারীদের তাদের নির্ভরতা পরিচালনার ব্যবস্থা থেকে বিরত রাখতে পারে না , তবে এটি বেশ কয়েকটি সাধারণ ত্রুটি / বিরোধী নিদর্শনগুলি রোধ করে:
... ইত্যাদি।
স্পষ্টতই আপনি ইউনিটি বা অটোফ্যাকের মতো নির্দিষ্ট আইওসি ধারক প্রয়োগের উপর নির্ভর করতে কোনও কাঠামো ডিজাইন করতে চান না । সেটি হচ্ছে, আবারও ডিআইপি লঙ্ঘন করা। তবে যদি আপনি নিজেকে এমন কিছু করার বিষয়ে ভাবতেও দেখেন তবে অবশ্যই আপনি ইতিমধ্যে বেশ কয়েকটি ডিজাইনের ত্রুটি করেছেন, কারণ ডিপেন্ডেন্সি ইনজেকশন একটি সাধারণ-উদ্দেশ্য নির্ভরতা-পরিচালন কৌশল এবং আইওসি ধারকটির ধারণার সাথে আবদ্ধ নয় ।
যে কোনও কিছু নির্ভরশীলতা গাছ তৈরি করতে পারে; হতে পারে এটি একটি আইওসি ধারক, সম্ভবত এটি একটি ইউনিট পরীক্ষা সহ প্রচুর উপহাস, সম্ভবত এটি পরীক্ষামূলক ড্রাইভার যা ডামি ডেটা সরবরাহ করে। আপনার কাঠামোর যত্ন নেওয়া উচিত নয় এবং আমি দেখেছি বেশিরভাগ ফ্রেমওয়ার্কগুলি যত্ন করে না, তবে তারা এখনও নির্ভরতা ইনজেকশনটির ভারী ব্যবহার করে যাতে এটি সহজেই শেষের ব্যবহারকারীর পছন্দের আইওসি ধারকটিতে সংহত করা যায়।
ডিআই রকেট বিজ্ঞান নয়। এগুলি ব্যবহার করার বাধ্যতামূলক কারণ থাকার মতো কেবল এড়াতে new
এবং static
বাদ দেওয়ার চেষ্টা করুন, যেমন কোনও বাহ্যিক নির্ভরতা নেই এমন একটি ইউটিলিটি পদ্ধতি, বা কাঠামোর বাইরে কোনও উদ্দেশ্য থাকতে পারে না এমন একটি ইউটিলিটি শ্রেণি (ইন্টারপ র্যাপার এবং অভিধান কীগুলি এর সাধারণ উদাহরণ) এই).
আইওসি ফ্রেমওয়ার্কগুলির সাথে অনেকগুলি সমস্যা উপস্থিত হয় যখন বিকাশকারীরা প্রথমে সেগুলি কীভাবে ব্যবহার করবেন তা শিখছেন এবং আইওসি মডেলের সাথে মানিয়ে নেওয়ার জন্য নির্ভরতা এবং বিমূর্ততাগুলি পরিচালনা করার পদ্ধতি পরিবর্তনের পরিবর্তে তাদের প্রত্যাশা পূরণের জন্য আইওসি পাত্রে হেরফের করার চেষ্টা করুন পুরানো কোডিং শৈলী, যা প্রায়শই উচ্চ সংযোগ এবং কম সংহতিতে জড়িত। খারাপ কোডটি খারাপ কোড, এটি ডিআই কৌশল ব্যবহার করে বা না করে।