নির্ভরতা ইঞ্জেকশন নিজেই উপকারিতা আমি বুঝতে পারি। উদাহরণস্বরূপ বসন্ত নেওয়া যাক। আমি অন্যান্য স্প্রিং বৈশিষ্ট্যগুলির মতো এওপি, বিভিন্ন ধরণের সহায়তাকারী ইত্যাদির সুবিধাও বুঝতে পারি I'm আমি কেবল ভাবছি, এক্সএমএল কনফিগারেশনের সুবিধাগুলি কী কী:
<bean id="Mary" class="foo.bar.Female">
<property name="age" value="23"/>
</bean>
<bean id="John" class="foo.bar.Male">
<property name="girlfriend" ref="Mary"/>
</bean>
সাধারণ পুরানো জাভা কোডের সাথে তুলনা করুন যেমন:
Female mary = new Female();
mary.setAge(23);
Male john = new Male();
john.setGirlfriend(mary);
যা ডিবাগ করা সহজ, সময় যাচাই করা সংকলন এবং যে কেউ কেবল জাভা জানেন তা বুঝতে পারবেন। তাই নির্ভরতা ইনজেকশন কাঠামোর মূল উদ্দেশ্য কী? (বা কোডের একটি অংশ যা এর সুবিধাগুলি দেখায়))
আপডেট:
ক্ষেত্রে
IService myService;// ...
public void doSomething() {
myService.fetchData();
}
আইওসি ফ্রেমওয়ার্ক কীভাবে অনুমান করতে পারে যে মাই সার্ভিসের কোন প্রয়োগটি যদি আমি একের অধিক থাকে তবে ইঞ্জেকশন করতে চাই? যদি প্রদত্ত ইন্টারফেসের কেবলমাত্র একটি বাস্তবায়ন হয়, এবং আমি আইওসি পাত্রে স্বয়ংক্রিয়ভাবে এটি ব্যবহারের সিদ্ধান্ত নিতে দিই, দ্বিতীয় বাস্তবায়ন উপস্থিত হওয়ার পরে এটি ভেঙে যাবে। এবং যদি ইচ্ছাকৃতভাবে কোনও ইন্টারফেসের কেবলমাত্র একটি সম্ভাব্য বাস্তবায়ন হয় তবে আপনাকে এটি ইনজেক্ট করার দরকার নেই।
আইওসি-র জন্য ছোট ছোট কনফিগারেশন দেখে এটি আকর্ষণীয় হবে যা এটির সুবিধাগুলি দেখায়। আমি কিছুক্ষণের জন্য বসন্ত ব্যবহার করছি এবং আমি এরকম উদাহরণ দিতে পারি না। এবং আমি একক লাইনগুলি প্রদর্শন করতে পারি যা হাইবারনেট, ডিডাব্লিউআর এবং আমি ব্যবহার করি এমন অন্যান্য ফ্রেমওয়ার্কগুলির সুবিধা প্রদর্শন করে।
আপডেট 2:
আমি বুঝতে পারি যে IoC কনফিগারেশনটি পুনরায় সংশোধন না করে পরিবর্তন করা যেতে পারে। সত্যিই কি এটি একটি ভাল ধারণা? আমি বুঝতে পারি যে যখন কেউ সংশোধন না করে ডিবি শংসাপত্রগুলি পরিবর্তন করতে চায় - তবে সে বিকাশকারী হতে পারে না। আপনার অনুশীলনে, বিকাশকারী ছাড়া অন্য কেউ আইওসি কনফিগারেশনটি কতবার পরিবর্তন করেন? আমি মনে করি যে বিকাশকারীদের পক্ষে কনফিগারেশন পরিবর্তন করার পরিবর্তে সেই নির্দিষ্ট শ্রেণীর পুনরায় সংযোগ করার কোনও প্রচেষ্টা নেই। এবং অ-বিকাশকারীদের পক্ষে আপনি তাঁর জীবন আরও সহজ করে তুলতে এবং কিছু সহজ কনফিগারেশন ফাইল সরবরাহ করতে চান।
আপডেট 3:
ইন্টারফেস এবং তাদের কংক্রিট বাস্তবায়নের মধ্যে ম্যাপিংয়ের বাহ্যিক কনফিগারেশন
এটি বহির্মুখী করতে এত ভাল কি? আপনি আপনার সমস্ত কোডকে বাহ্যিক করে তুলবেন না, যখন আপনি অবশ্যই পারবেন - কেবল ক্লাসনেম.জভা.টিএসটিএস্ট ফাইলে রাখুন, ফ্লাইতে ম্যানুয়ালি পড়ুন এবং সংকলন করুন - বাহ, আপনি পুনরায় সংশোধন এড়িয়ে গেছেন। সংকলন এড়ানো উচিত কেন ?!
আপনি কোডিংয়ের সময় বাঁচান কারণ আপনি ম্যাপিংগুলি ঘোষণামূলকভাবে সরবরাহ করেন, কোনও পদ্ধতিগত কোডে নয়
আমি বুঝতে পারি যে কখনও কখনও ঘোষণামূলক পদ্ধতির সময় সাশ্রয় হয়। উদাহরণস্বরূপ, আমি কেবল একবার শিমের সম্পত্তি এবং একটি ডিবি কলামের মধ্যে একটি ম্যাপিং ঘোষণা করি এবং হাইবারনেট এইচএসকিউএল ভিত্তিক এসকিউএল তৈরি করার সময় লোড করার সময়, সংরক্ষণ করার সময় এই ম্যাপিং ব্যবহার করে etc. স্প্রিংয়ের ক্ষেত্রে (আমার উদাহরণে), ঘোষণার আরও লাইন ছিল এবং এটি সংশ্লিষ্ট কোডের মতোই মত প্রকাশ করে। কোডের চেয়ে এই জাতীয় ঘোষণা সংক্ষিপ্ততর হওয়ার কোনও উদাহরণ যদি থাকে - আমি এটি দেখতে চাই।
নিয়ন্ত্রণের নীতিটির বিপরীতকরণ সহজ ইউনিট পরীক্ষার অনুমতি দেয় কারণ আপনি আসল বাস্তবায়নগুলি নকলগুলির সাথে প্রতিস্থাপন করতে পারেন (যেমন এসকিউএল ডাটাবেসটিকে মেমোরির সাথে প্রতিস্থাপনের মতো)
আমি নিয়ন্ত্রণ সুবিধার বিপর্যয় বুঝতে পারি (আমি এখানে ডিপেন্ডেন্সি ইনজেকশন হিসাবে আলোচিত নকশার প্যাটার্নটিকে কল করতে পছন্দ করি, কারণ আইওসি আরও সাধারণ - অনেক ধরণের নিয়ন্ত্রণ রয়েছে, এবং আমরা তাদের মধ্যে কেবল একটিকে উল্টে দিচ্ছি - প্রাথমিককরণের নিয়ন্ত্রণ)। আমি জিজ্ঞাসা করছিলাম কারও জন্য কেন প্রোগ্রামিং ভাষা ব্যতীত অন্য কিছু প্রয়োজন হয় something কোড ব্যবহার করে আমি স্পষ্টত বাস্তব প্রয়োগগুলি প্রতিস্থাপন করতে পারি। এবং এই কোডটি কনফিগারেশন হিসাবে একই জিনিস প্রকাশ করবে - এটি কেবল জাল মান সহ ক্ষেত্রগুলিকে আরম্ভ করবে।
mary = new FakeFemale();
আমি ডিআই এর সুবিধা বুঝতে পারি। কোডটি কনফিগার করার সাথে তুলনা করে বাহ্যিক এক্সএমএল কনফিগারেশন দ্বারা কী সুবিধা যুক্ত করা হয়েছে তা আমি বুঝতে পারি না। আমি মনে করি না যে সংকলন এড়ানো উচিত - আমি প্রতিদিন সংকলন করি এবং আমি এখনও বেঁচে আছি। আমি মনে করি ডিআই এর কনফিগারেশনটি ঘোষণামূলক পদ্ধতির খারাপ উদাহরণ। ঘোষনা কার্যকর হতে পারে যদি একবার ঘোষিত হয় এবং বিভিন্নভাবে বিভিন্ন উপায়ে ব্যবহার করা হয় - যেমন হাইবারনেট সিএফজি, যেখানে বিনের সম্পত্তি এবং ডিবি কলামের মধ্যে ম্যাপিং সংরক্ষণ, লোডিং, অনুসন্ধান অনুসন্ধানগুলি তৈরি করার জন্য ব্যবহৃত হয় ইত্যাদি। স্প্রিং ডিআই কনফিগারেশন সহজেই অনুবাদ করা যায় কোড কনফিগারেশন, যেমন এই প্রশ্নের শুরুতে, এটি না? এবং এটি কেবল শিম আদিকরণের জন্য ব্যবহৃত হয়, তাই না? যার অর্থ একটি ঘোষণামূলক পদ্ধতির এখানে কিছু যুক্ত হয় না, তাই না?
যখন আমি হাইবারনেট ম্যাপিং ঘোষণা করি, আমি কেবল হাইবারনেটকে কিছু তথ্য দিই এবং এটি এর ভিত্তিতে কাজ করে - আমি কী করব তা বলি না। বসন্তের ক্ষেত্রে, আমার ঘোষনাটি বসন্তকে ঠিক কী করতে হবে তা বলে - তাই কেন এটি ঘোষণা করবেন, কেন শুধু এটি করবেন না?
শেষ আপডেট:
বলছি, অনেক উত্তর আমাকে নির্ভরতা ইনজেকশন সম্পর্কে বলছে, যা আমি ভাল জানি। প্রশ্ন কোডটি আরম্ভ করার পরিবর্তে ডিআই কনফিগারেশনের উদ্দেশ্য সম্পর্কে - আমি মনে করি প্রারম্ভিক কোডটি আরও ছোট এবং পরিষ্কার is আমার প্রশ্নের এখনও পর্যন্ত আমি যে উত্তর পেয়েছি তা হ'ল এটি কনফিগার করা এড়িয়ে যায়, যখন কনফিগারেশন পরিবর্তন হয়। আমার ধারণা, আমার আর একটি প্রশ্ন পোস্ট করা উচিত, কারণ এটি আমার পক্ষে একটি বড় গোপন বিষয়, কেন এই ক্ষেত্রে সংকলন এড়ানো উচিত।