নির্ভরতা ইনজেকশন: কোন মুহুর্তে আমাকে একটি নতুন অবজেক্ট তৈরি করার অনুমতি দেওয়া হচ্ছে?


13

আমি একটি পিএইচপি অ্যাপ্লিকেশন রিফ্যাক্টর করছি , এবং আমি চেষ্টা করছি যতটা সম্ভব নির্ভরতা ইনজেকশন (ডিআই) করা উচিত।

আমি অনুভব করি যে এটি কীভাবে কাজ করে সে সম্পর্কে আমার খুব ভাল উপলব্ধি হয়েছে এবং আমি অবশ্যই আমার ক্লাসগুলি আরও ঝুঁকির এবং আরও শক্তিশালী হয়ে উঠতে দেখতে পাচ্ছি।

আমি রিফ্যাক্টর করছি যাতে আমি ক্লাসের মধ্যে একটি নতুন অবজেক্ট তৈরির পরিবর্তে নির্ভরতা ইনজেকশন করতে পারি, তবে এক পর্যায়ে আমাকে কিছু অবজেক্ট তৈরি করতে হবে, অর্থাত্ ভয়ঙ্কর newকীওয়ার্ডটি ব্যবহার করতে হবে ।

আমি এখন যে সমস্যাটি চালিয়েছি তা হ'ল আমি আসলে কোন নতুন বস্তু তৈরি করতে পারি? দেখে মনে হচ্ছে আমি শীর্ষ স্তরের ক্লাসে এসে শেষ করব, নতুন কোনও বস্তু তৈরি করব যেখানে অন্য কোথাও যাওয়ার দরকার নেই। এটি ভুল অনুভব করে।

আমি কয়েকটি ব্লগ পড়েছি যা সমস্ত বিষয়বস্তু তৈরি করতে কারখানার ক্লাস ব্যবহার করে এবং তারপরে আপনি কারখানাকে অন্য শ্রেণিতে ইনজেক্ট করেন। তারপরে আপনি কারখানার পদ্ধতিগুলিতে কল করতে পারেন এবং কারখানাটি আপনার জন্য নতুন বস্তু তৈরি করে।

এটি করার সাথে আমার উদ্বেগ এখন আমার কারখানার ক্লাসগুলি সর্বজনীনভাবে newমুক্ত হতে চলেছে ! আমি অনুমান করি যেহেতু তারা কারখানার ক্লাস হিসাবে এটি ঠিক আছে তবে কারখানার প্যাটার্ন এবং ডিআই ব্যবহার করার সময় কি কিছু নিয়ম মেনে চলা আছে, বা আমি এখানে চিহ্নটি ছাড়ছি?



আমি পরিষেবা এবং নীতিমালা জন্য আইওসি সুপারিশ। মডেল বা সাহায্যকারী শ্রেণীর জন্য আমি কেবল ব্যবহার করতে চাই new। অবশ্যই কয়েকটি এন্ট্রি পয়েন্ট রয়েছে যেখানে আপনাকে আইওসি পাত্রে কল করতে হবে, তবে অনেকগুলি হওয়া উচিত নয়। সাধারণত আপনি একবার আইওসি কনফিগার করেন এবং তারপরে অনুরোধ অনুযায়ী এক শ্রেণির সমাধানের জন্য বলে। এমভিসির ক্ষেত্রে এটি সাধারণত নিয়ামক।
কোডসইনচাউস

আপনি যে শীর্ষ স্তরের শ্রেণীর কথা উল্লেখ করেছেন তা হ'ল কম্পোজিশন রুটের অংশ। এটা ভুল থেকে দূরে।
ফ্যাসিও অনুপাত

উত্তর:


12

এর জন্য বেশ খানিকটা গুগল করার পরেও মনে হয় (উপরের মন্তব্যে যেমন উল্লেখ করা হয়েছে) আমি যে শীর্ষ স্তরের শ্রেণির কথা বলছিলাম তাকে কম্পোজিশন রুট বলে

এটি এই সংমিশ্রনের মূলের মধ্যে সমস্ত বস্তুর সৃষ্টি যুক্ত করার (বা এখান থেকে কোনও আইওসি ধারক উল্লেখ করে) গ্রহণযোগ্য সমাধান বলে মনে হচ্ছে।

এর সাথে আমার মূল উদ্বেগটি ছিল এই শীর্ষ স্তরের শ্রেণিটি কিছুটা গোলমাল হতে শুরু করবে। এটি কিছুটা হলেও সত্য, তবে কার্যকারিতাগুলি কনসটির ওজন weigh উদাহরণস্বরূপ আমি দেখতে পাচ্ছি আমার অন্যান্য সমস্ত শ্রেণীর পাঠযোগ্যতা, পরীক্ষাযোগ্যতা এবং রক্ষণাবেক্ষণের উন্নতি হয়েছে।

শীর্ষ স্তরের বর্গ একটি বিট নোংরা হতে পারে, সঙ্গে littered newএবং set_property()কিন্তু আমি আমি আসলে এক জায়গায় সব এই কোড থাকার পছন্দ করেন, বরং অন্য ক্লাসের সব সম্পর্কে বিক্ষিপ্ত বলার আছে

আরেকটি দরকারী পৃষ্ঠা আলোচনা এই পদ্ধতি কর্মক্ষমতা হিট এখানে


1
+1 কারণ আমি এর আগে 'কম্পোজিশন রুট' সম্পর্কে কখনও শুনিনি।
সি_মেকার

2

একটি কারখানার শ্রেণি newএটি জুড়ে ছিটানো হবে। এটি আপনাকে অনুরোধ করছে এমন যে কোনও বস্তু এবং সম্ভবত that বস্তুর নির্ভরতা তৈরি করবে। যেহেতু কারখানার কাজটি আপনার পক্ষে newএই ক্লাসে থাকা সঠিক জিনিসটি ইনস্ট্যান্ট করে তা কোনও খারাপ জিনিস নয়।

ডিআই এমনটি যাতে আপনার একটি স্বচ্ছভাবে যুগল নকশা থাকে। প্রতিটি বস্তুর সরবরাহ করা নির্ভরতা পরিবর্তন করে আপনি আপনার অ্যাপ্লিকেশনটিতে পরিবর্তন করতে সক্ষম হবেন। আপনার অ্যাপ্লিকেশনটিকে নমনীয়, এক্সটেনসিবল এবং টেস্ট করা সহজ।

শীর্ষ স্তরে, আপনার কাছে এমন কোড থাকবে যা কয়েকটি ফ্যাক্টরি ইনস্ট্যান্ট করবে, পরিষেবাগুলিতে সংযোগ স্থাপন করবে এবং প্রতিক্রিয়া প্রেরণ করবে। newএটিতে আপনার অ্যাপ্লিকেশনটির জন্য প্রয়োজনীয় অবজেক্টগুলিকে ইনস্ট্যান্টিয়েট করতে মোটামুটি পরিমাণ বা স্থির কল থাকবে। যে যেখানে সেখানে হবে।


-2

আমার দুটি সেন্ট এখানে:

আমি একটি পিএইচপি অ্যাপ্লিকেশন রিফ্যাক্টর করছি এবং আমি চেষ্টা করছি যতটা সম্ভব নির্ভরতার ইনজেকশন রয়েছে

আপনি নির্ভর করে না এমন ইনজেকশন কাঠামো ব্যবহার করছেন কিনা তা আপনি উল্লেখ করবেন না। আমি মনে করি আপনার অবশ্যই করা উচিত। এমন কিছু ব্যবহার করুন যা আপনাকে প্রয়োজনীয় বৈশিষ্ট্যগুলি দেয়: /programming/9348376/guice- Like-d dependency-inication-frameworks-in-php

আমি এখন যে সমস্যাটি চালিয়েছি তা হ'ল আমি আসলে কোন নতুন বস্তু তৈরি করতে পারি? দেখে মনে হচ্ছে আমি শীর্ষ স্তরের ক্লাসে শেষ করব, নতুন কোনও বস্তু তৈরি করব যেখানে অন্য কোথাও যাওয়ার দরকার নেই। এটি ভুল অনুভব করে।

আপনার অ্যাপ্লিকেশনটি রচনা করা প্রাথমিক বস্তুর ইনস্ট্যান্টেশনের জন্য আপনি সাধারণত কনফিগারেশন বা কেন্দ্রীয় পয়েন্ট ব্যবহার করেন। ধারক আপনার জন্য বস্তু তৈরি করবে।

তারপরে আপনি আইওসি ধারকটির মাধ্যমে অবজেক্টস (পরিষেবা, সরবরাহকারী, নিয়ন্ত্রক ...) অ্যাক্সেস করতে পারেন। এটি প্রয়োজনে স্বচ্ছভাবে আপনার জন্য একটি বস্তু তৈরি করবে, বা আপনাকে প্রয়োজনীয় বিদ্যমান উদাহরণটির জন্য একটি রেফারেন্স দেবে।

অবশ্যই, অবজেক্টগুলির আপনার নির্দিষ্ট প্রয়োগের ভিতরে আপনি অন্যান্য বস্তুগুলি ইনস্ট্যান্ট করতে পারেন যার উপর আপনার ডিআই (ডেটা স্ট্রাকচার, কাস্টম ধরণের ইত্যাদি) প্রয়োজন হয় না, তবে এটি সাধারণ প্রোগ্রামিং।

আমি কয়েকটি ব্লগ পড়েছি যা সমস্ত বিষয়বস্তু তৈরি করতে কারখানার ক্লাস ব্যবহার করে এবং তারপরে আপনি কারখানাকে অন্য শ্রেণিতে ইনজেক্ট করেন। তারপরে আপনি কারখানার পদ্ধতিগুলিতে কল করতে পারেন এবং কারখানাটি আপনার জন্য নতুন বস্তু তৈরি করে।

সাধারণত, আপনি যদি আইওসি ফ্রেমওয়ার্কটি আপনার কারখানার মাধ্যমে কিছু আইওসি অবজেক্ট ইনস্ট্যান্ট করতে চান তবে আপনি একটি কারখানা ব্যবহার করেন (কোনও নির্দিষ্ট বস্তুর তাত্ক্ষণিককরণ করার জন্য কিছু অতিরিক্ত কাজ প্রয়োজন হলে এটি প্রয়োজন)। যদি আপনি কেবল "নতুন অবজেক্ট ()" দিয়ে আপনার অবজেক্ট তৈরি করতে এবং কিছু বৈশিষ্ট্য নির্ধারণ করতে পারেন তবে আপনি অগত্যা কোনও কারখানার প্যাটার্ন ব্যবহার করতে চান না।

অন্য কথায়, আমি বলব যে কোনও শ্রেণি বা শ্রেণীর গোষ্ঠীর জন্য কারখানার প্যাটার্ন ব্যবহার আপনি কীভাবে ডিআই ডি ব্যবহার করবেন না তার উপর নির্ভর করে আপনি কীভাবে এই শ্রেণিগুলির মডেল করতে চান তার উপর নির্ভর করে (যদি না আপনার ডিআই বাস্তবায়ন স্পষ্টভাবে কারখানার প্রয়োজন হয় যা অস্বাভাবিক)।

আপনি যখন কোনও তৃতীয় পক্ষের লাইব ব্যবহার করছেন যা ইতিমধ্যে কারখানার ব্যবহারের প্রয়োজন হয় তখন আপনি কারখানাটি ব্যবহার করতে আপনার আইওসি কাঠামোটিও কনফিগার করেন। এক্ষেত্রে আপনার কোনও নিয়ন্ত্রণ নেই এবং আপনার আইওসি কন্টেইনারটি আপনাকে বলতে হবে: "আরে, আমি যখন এই ইন্টারফেসগুলির মধ্যে একটি জিজ্ঞাসা করি তখন আমাকে একটি উপযুক্ত উদাহরণ সরবরাহ করার জন্য আপনাকে এই কারখানাটি ব্যবহার করতে হবে"।

এটি করার সাথে আমার উদ্বেগ এখন আমার কারখানার ক্লাসগুলি সকলের জন্য একটি নতুন ফ্রি হতে চলেছে! আমি অনুমান করি যেহেতু তারা কারখানার ক্লাস হিসাবে এটি ঠিক আছে তবে কারখানার প্যাটার্ন এবং ডিআই ব্যবহার করার সময় কিছু নিয়ম আছে বা আমি এখানে চিহ্ন ছাড়ছি।

এই ক্ষেত্রে, এটি মনে হচ্ছে যে আপনাকে এই বিষয়গুলি / পরিষেবাদি / নিয়ন্ত্রকদের / যাই হোক না কেন কারখানার নিদর্শনগুলি ব্যবহার করার দরকার নেই এবং আপনি কেবলমাত্র নতুন আইওসিটিকে উপযুক্ত শ্রেণীর সাথে ইনস্ট্যান্ট করতে কনফিগার করতে পারেন এবং সমস্ত কিছু ইনজেক্ট করতে পারেন।

আমি আসা করি এটা সাহায্য করবে.


উত্তরের জন্য ধন্যবাদ, তবে অবশ্যই আইওসি পাত্রে আমি 'শীর্ষ স্তরের শ্রেণি' উল্লেখ করছি। আমি যদি কেবল সেখানে বস্তু তৈরি করতে পারি তবে এটি একটি সঠিক জগাখিচুড়ি হতে চলেছে।
গাজ_এডজ

4
doing DI manually beats the whole purpose of using an Inversion of Control container- যদি এর অর্থ যদি আপনি "... যা একটি কনফিগারেশন ফাইলে আপনার নির্ভরতা কেন্দ্রিক করে তুলছে " বলতে চাচ্ছেন তবে আপনি ঠিক বলেছেন, কারণ এটি সমস্ত আইওসি ধারকই সত্যই করে। ডিআই-এর আসল লক্ষ্য হ'ল ডিউপলিং এবং আপনি এটি কোনও নির্মাতা পদ্ধতিতে আপনার নির্ভরতা সরবরাহ করে তা করতে পারেন। এটি করার জন্য আপনার কোনও ডিআই ফ্রেমওয়ার্ক দরকার হয় না।
রবার্ট হার্ভে

মিমি আপনি বস্তু তৈরি করেন না, আপনি তাদের জন্য আইওসি ধারকটি জিজ্ঞাসা করুন (যে কোনও জায়গা থেকে আপনার প্রয়োজন হবে), অথবা আপনি ক্ষেত্র / যুক্তি ইঞ্জেকশন ব্যবহার করেন যাতে আপনার ক্লাসগুলি স্বয়ংক্রিয়ভাবে যথাযথ ক্লাসগুলিতে ইনজেকশনে থাকে, আইওসি ধারক দ্বারা সর্বদা তৈরি করা হয়।
jjmontes

1
আমি সম্মত হব যে আপনার খুব বড় অ্যাপ্লিকেশনগুলির জন্য একটি কাঠামো দরকার । অনেক অ্যাপ্লিকেশনগুলি এতো বড় নয় এবং ডিআই ফ্রেমওয়ার্ক ব্যবহারের অতিরিক্ত জটিলতা থেকে উপকৃত হয় না।
রবার্ট হার্ভে

2
আমি বলিনি যে এটি ছিল। আমি কেবল বলেছিলাম যে এটি করার জন্য আপনার কোনও ডিআই কনটেইনার দরকার নেই।
রবার্ট হার্ভে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.