কনস্ট্রাক্টর বা সম্পত্তি সেটারের মাধ্যমে নির্ভরতা ইনজেকশন?


151

আমি একটি ক্লাস রিফ্যাক্টর করছি এবং এর সাথে একটি নতুন নির্ভরতা যুক্ত করছি। বর্গ বর্তমানে কনস্ট্রাক্টরে তার বিদ্যমান নির্ভরতা নিচ্ছে। সুতরাং ধারাবাহিকতার জন্য আমি কনস্ট্রাক্টরের সাথে প্যারামিটার যুক্ত করব।
অবশ্যই, ইউনিট পরীক্ষার জন্য কয়েকটি আরও কয়েকটি সাবক্লাস প্লাস এবং আরও অনেক কিছু রয়েছে, তাই এখন আমি সমস্ত কনস্ট্রাক্টরের সাথে মিল রেখে পরিবর্তন ঘুরানোর গেমটি খেলছি, এবং এটি যুগে যুগে গ্রহণ করছে।
এটি আমাকে ভাবতে বাধ্য করে যে সেটারগুলির সাথে সম্পত্তি ব্যবহার করা নির্ভরতা পাওয়ার একটি আরও ভাল উপায়। আমি মনে করি না কোনও শ্রেণীর উদাহরণ তৈরির জন্য ইঞ্জেকশন নির্ভরতা ইন্টারফেসের অংশ হওয়া উচিত। আপনি একটি নির্ভরতা যুক্ত করুন এবং এখন আপনার সমস্ত ব্যবহারকারী (সাবক্লাস এবং যে কেউ আপনাকে সরাসরি ইনস্ট্যান্ট করছে) হঠাৎ এটি সম্পর্কে জানতে পারে। এটি encapsulation বিরতির মত অনুভূত।

এটি এখানে বিদ্যমান কোডের সাথে প্যাটার্ন বলে মনে হয় না, তাই আমি সাধারণ sensকমত্য কী, কনস্ট্রাক্টর বনাম সম্পত্তিগুলির পক্ষে কি তা জানার চেষ্টা করছি। সম্পত্তি সেটটার ব্যবহার কি আরও ভাল?

উত্তর:


126

ভাল, এটি নির্ভর করে :-)।

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

যদি শ্রেণি নির্ভরতা ছাড়াই কাজ করতে পারে তবে একটি সেস্টার ভাল।


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

3
@ মার্ক: শুভ পয়েন্ট তবে, প্রশ্নটি ছিল একটি বিদ্যমান বর্গের উপর নির্ভরতা যুক্ত করার বিষয়ে। তারপরে কোনও নো-আরগ কনস্ট্রাক্টর রাখার ফলে পশ্চাদপটে সামঞ্জস্যের সুযোগ হয়।
স্লেসকে

নির্ভরতা যখন কাজ করতে হয় তখন কী হবে তবে সেই নির্ভরতার একটি ডিফল্ট ইনজেকশন সাধারণত যথেষ্ট। তারপরে সেই নির্ভরতা কি সম্পত্তি বা "কনভার্ট্রাকর ওভারলোড" দ্বারা "ওভাররিডেবল" হওয়া উচিত?
প্যাট্রিক জাজালাপস্কি

@ পেট্রিক: "শ্রেণি তার কাজটি ডব্লিউ / ও নির্ভরতা করতে পারে না" দ্বারা, আমি বোঝাতে চেয়েছিলাম যে কোনও যুক্তিসঙ্গত ডিফল্ট নেই (যেমন ক্লাসটির জন্য ডিবি সংযোগ প্রয়োজন)। আপনার পরিস্থিতিতে, উভয়ই কাজ করবে। আমি এখনও সাধারণভাবে কনস্ট্রাক্টর পদ্ধতির বিকল্পটি বেছে নেব, কারণ এটি জটিলতা হ্রাস করে (যদি সেটারটিকে দু'বার বলা হয় তবে কী হবে)?
sleske

1
এ সম্পর্কে এখানে একটি ভাল লিখনআপ এক্সপ্লোরভডাডাডাফিডেটার
টাইপস

21

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

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

public class ClassExample
{
    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo)
        : this (dependnecyOne, dependencyTwo, new DependnecyThreeConcreteImpl())
    { }

    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo, IDependencyThree dependencyThree)
    {
        // Set the properties here.
    }
}

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


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

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

1
আমি ডেটাবেস সংযোগ যেমন রিসোর্স পরিচালনা নির্ভরতা সম্পর্কে আপনার বক্তব্য। আমি মনে করি যে আমার ক্ষেত্রে সমস্যাটি হ'ল আমি যে ক্লাসের উপর নির্ভরতা যুক্ত করছি তার বেশ কয়েকটি সাবক্লাস রয়েছে। আইওসি কনটেইনার বিশ্বে যেখানে সম্পত্তিটি ধারক দ্বারা সেট করা হবে সেখানে সেটার ব্যবহার করে কমপক্ষে সমস্ত সাবক্লাসের মধ্যে কনস্ট্রাক্টর ইন্টারফেস নকলের চাপকে মুক্তি দিতে পারে।
নিলাল কানাহটন

17

অবশ্যই, কনস্ট্রাক্টর লাগানোর অর্থ আপনি একবারে সমস্ত যাচাই করতে পারবেন। আপনি যদি কেবল পঠনযোগ্য ক্ষেত্রগুলিতে জিনিসগুলি বরাদ্দ করেন তবে আপনার নির্মাণের সময় থেকেই আপনার অবজেক্টের নির্ভরতা সম্পর্কে কিছু গ্যারান্টি রয়েছে।

এটি নতুন নির্ভরতা যুক্ত করা একটি আসল ব্যথা, তবে কমপক্ষে এইভাবে সংকলকটি সঠিক না হওয়া পর্যন্ত অভিযোগ করতে থাকে। যা একটি ভাল জিনিস, আমি মনে করি।


এর জন্য প্লাস ওয়ান। এছাড়াও এটি চক্রাকার নির্ভরতার বিপদকে অত্যন্ত হ্রাস করে ...
গিলগমাস

11

আপনার যদি প্রচুর পরিমাণে alচ্ছিক নির্ভরতা থাকে (যা ইতিমধ্যে গন্ধযুক্ত) তবে সম্ভবত সেটার ইঞ্জেকশনটিই যাওয়ার উপায়। কনস্ট্রাক্টর ইনজেকশন যদিও আপনার নির্ভরতাগুলি আরও ভালভাবে প্রকাশ করে।


11

সাধারণ পছন্দসই পদ্ধতিটি যতটা সম্ভব কনস্ট্রাক্টর ইনজেকশন ব্যবহার করা।

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

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

আপনি যখন মার্ক সিম্যান তার "" নেট ইন ডিপেন্ডেন্সি ইনজেকশন "গ্রন্থে স্থানীয় ডিফল্ট বলে থাকেন তখন আপনি সম্পত্তি ইনজেকশনটি ব্যবহার করতে পারেন : নির্ভরতা alচ্ছিক কারণ আপনি একটি সূক্ষ্ম কার্যকারিতা বাস্তবায়ন করতে পারবেন তবে কলারকে অন্য কোনও নির্দিষ্ট করার অনুমতি দিতে চাইলে প্রয়োজন ছিল।

(নীচে প্রাক্তন উত্তর)


আমি মনে করি যে ইনজেকশন বাধ্যতামূলক হলে কনস্ট্রাক্টর ইঞ্জেকশন ভাল better এটি যদি খুব বেশি কনস্ট্রাক্টর যুক্ত করে তবে কনস্ট্রাক্টরের পরিবর্তে কারখানার ব্যবহার বিবেচনা করুন।

ইনজেকশনটি isচ্ছিক হলে সেটার ইঞ্জেকশনটি দুর্দান্ত, বা যদি আপনি এটি অর্ধেক ট্রুপ পরিবর্তন করতে চান। আমি সাধারণত সেটার পছন্দ করি না তবে এটি স্বাদের বিষয়।


আমি যুক্তি দিয়ে বলতে পারি যে সাধারণত ইনজেকশনটি অর্ধেকের মধ্য দিয়ে পরিবর্তন করা খারাপ স্টাইল (কারণ আপনি নিজের অবজেক্টে লুকানো অবস্থা যুক্ত করছেন)। তবে কোনও নিয়ম
ডাব্লু

হ্যাঁ, কেন আমি বললাম যে আমি সেটার খুব বেশি পছন্দ করি না ... আমি কনস্ট্রাক্টর পদ্ধতির পছন্দ করি কারণ এটি পরিবর্তন করা যায় না।
ফিলিপ

"এটি যদি আরও অনেক কনস্ট্রাক্টর যুক্ত করে তবে কনস্ট্রাক্টরের পরিবর্তে কারখানাগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন" " আপনি মূলত কোনও রান সময় ব্যতিক্রম স্থগিত করে এবং এমনকি জিনিসগুলি ভুল পেতে এবং কোনও পরিষেবা লোকেটার প্রয়োগের সাথে আটকে থাকতে পারে।
মেটিটাস

@ মার্কো যা আমার আগের উত্তর এবং আপনি ঠিক বলেছেন are যদি অনেক কনস্ট্রাক্টর থাকে তবে আমি যুক্তি দিয়ে বলব যে ক্লাসটি অনেকগুলি কাজ করে :-) অথবা একটি বিমূর্ত কারখানাটি বিবেচনা করুন।
ফিলিপ

7

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

যতক্ষণ ক্লাস ইন্টারফেস (এপিআই) এর কাজটি সম্পাদন করতে হবে তা পরিষ্কার হওয়া পর্যন্ত আপনি ভাল।


দয়া করে নির্দিষ্ট করে দিন কেন আপনি নিম্নচাপ করছেন?
nkr1pt

3
হ্যাঁ, অনেক যুক্তিযুক্ত নির্মাণকারীরা খারাপ। এজন্য আপনি প্রচুর কনস্ট্রাক্টর পরামিতি :-) সহ ক্লাসগুলি রিফেক্টর করেন।
সলেসকে

10
@ এনকেআর 1 সেট: বেশিরভাগ লোক (আমার অন্তর্ভুক্ত) সম্মত হন যে সেটার ইনজেকশনটি খারাপ যদি এটি আপনাকে একটি ক্লাস তৈরি করতে দেয় যা রানটাইম এ ব্যর্থ হয় যা ইঞ্জেকশনটি না করা হয়। আমি বিশ্বাস করি যে কেউ আপনার বিবৃতিটিকে ব্যক্তিগত স্বাদ বলে আপত্তি জানায়।
স্লেসকে

7

মূলত আপনার প্রশ্নের বর্ণিত কারণের জন্য আমি ব্যক্তিগতভাবে কনস্ট্রাক্টরের ইনজেকশন নির্ভরতার চেয়ে এক্সট্রাক্ট এবং ওভাররাইড "প্যাটার্ন" পছন্দ করি । আপনি বৈশিষ্ট্য হিসাবে সেট করতে পারেন virtualএবং তারপরে পরীক্ষিত টেস্টযোগ্য শ্রেণিতে প্রয়োগটি ওভাররাইড করতে পারেন ।


1
আমি মনে করি প্যাটার্নটির অফিশিয়াল নাম "টেম্পলেট পদ্ধতি"।
ডেভিডজেলসন

6

আমি কনস্ট্রাক্টর ইনজেকশন পছন্দ করি কারণ এটি একটি শ্রেণীর নির্ভরতা প্রয়োজনীয়তা "প্রয়োগ" করতে সহায়তা করে। যদি c'tor এর একজন ক্রেতা রয়েছে কম্পাইল করার অ্যাপ্লিকেশন পেতে বস্তু সেট করতে। আপনি যদি সেটার ইনজেকশন ব্যবহার করেন তবে তারা জানেন না যে রান সময় পর্যন্ত তাদের কোনও সমস্যা আছে - এবং অবজেক্টের উপর নির্ভর করে এটি রান টাইমে দেরি হতে পারে।

আমি এখনও সময়ে সময়ে সেটার ইনজেকশন ব্যবহার করি যখন ইনজেকশন হওয়া অবজেক্টটি সম্ভবত নিজেই একগুচ্ছ কাজের প্রয়োজন হয়, যেমন প্রাথমিককরণ like


6

আমি কনস্ট্রাক্টর ইনজেকশন সরবরাহ করি কারণ এটি সবচেয়ে যুক্তিসঙ্গত বলে মনে হয়। এটি বলার মতো আমার ক্লাসটির কাজ করার জন্য এই নির্ভরতাগুলির প্রয়োজন । এটি যদি একটি alচ্ছিক নির্ভরতা হয় তবে বৈশিষ্ট্যগুলি যুক্তিসঙ্গত বলে মনে হয়।

আমি এমন জিনিস সেট করার জন্য সম্পত্তি ইনজেকশনও ব্যবহার করি যা ধারকটির কোনও উল্লেখ নেই যেমন ধারকটি ব্যবহার করে তৈরি করা উপস্থাপকের উপর একটি এএসপি.নেট দেখুন।

আমি মনে করি না এটি এনক্যাপসুলেশন ভেঙে যায়। অভ্যন্তরীণ কাজগুলি অভ্যন্তরীণ থাকা উচিত এবং নির্ভরতাগুলি একটি আলাদা উদ্বেগের সাথে মোকাবিলা করে।


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

শুধু একটি দীর্ঘ দীর্ঘ উত্তর লিখেছেন এবং এই সাইটে একটি ব্যতিক্রম কারণে এটি হারিয়েছে !! :( সংক্ষেপে, বেসক্লাসটি সাধারণত যুক্তি পুনরায় ব্যবহার করতে ব্যবহৃত হয় This এই যুক্তিটি সহজেই সাবক্লাসে যেতে পারে ... সুতরাং আপনি বেসক্লাস এবং সাবক্লাস = এক উদ্বেগের কথা ভাবতে পারেন, এটি একাধিক বাহ্যিক অবজেক্টের উপর নির্ভরশীল, বিভিন্ন কাজ করুন
you

3

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

অবশ্যই কিছুটা নির্ভরশীলতার যৌক্তিক গোষ্ঠীবদ্ধতা রয়েছে কিনা তা সর্বাধিক উপলব্ধি করে, সুতরাং যৌগটি একটি স্বেচ্ছাসেবী সামগ্রিকের চেয়ে বেশি হয় এবং একক যৌগের নির্ভরতার জন্য যদি একাধিক নির্ভরশীল থাকে তবে এটি সর্বাধিক উপলব্ধি করে - তবে প্যারামিটার ব্লকের "প্যাটার্ন" দীর্ঘ সময় ধরে ছিলাম এবং আমি যেগুলি দেখেছি তাদের বেশিরভাগই বেশ নির্বিচারে ছিলেন।

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


3

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

Nচ্ছিক পরামিতিগুলি কেবল তাদের ফ্রেমওয়ার্কগুলিতে সম্পন্ন করা যায় যা তাদের সমর্থন করে, যেমন নেট 4 (সি # এবং ভিবি.এনইটি উভয়ের জন্য, যদিও ভিবি.এনইটি সর্বদা তাদের কাছে রয়েছে)। অবশ্যই, আপনি কেবল আপনার শ্রেণীর ভোক্তা দ্বারা পুনর্নির্দিষ্ট সম্পত্তি ব্যবহার করে অনুরূপ কার্যকারিতা অর্জন করতে পারেন, তবে আপনি কনস্ট্রাক্টরের একটি প্যারামিটারে একটি ব্যক্তিগত ইন্টারফেস অবজেক্ট অর্পণ করে অপরিবর্তনীয়তার সুবিধা পাবেন না।

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


1

এটি একটি পুরাতন পোস্ট, তবে ভবিষ্যতে যদি এটি প্রয়োজন হয় তবে এটি সম্ভবত কোনও কাজে লাগবে:

https://github.com/omegamit6zeichen/prinject

আমি একই ধারণা পেয়েছিলাম এবং এই কাঠামোটি নিয়ে এসেছি। এটি সম্ভবত সম্পূর্ণরূপে অনেক দূরে, তবে এটি সম্পত্তি ইনজেকশনটির উপর দৃষ্টি নিবদ্ধ করে এমন একটি কাঠামোর ধারণা


0

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


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

0

কনস্ট্রাক্টর ইনজেকশন সুস্পষ্টভাবে নির্ভরশীলতা প্রকাশ করে, কোডটি আরও পাঠযোগ্য এবং কন্ট্রাক্টরের মধ্যে আর্গুমেন্টগুলি পরীক্ষা করা হয় তবে অ্যানডেল করা রান-টাইম ত্রুটির জন্য কম প্রবণতা তৈরি করে, তবে এটি সত্যই ব্যক্তিগত মতামত অবতীর্ণ হয় এবং আপনি ডিআই যত বেশি ব্যবহার করবেন আপনি প্রজেক্টের উপর নির্ভর করে এক পথে বা অন্য দিকে দৌড়ে ঝোঁক। আমার ব্যক্তিগতভাবে কোডগুলির দীর্ঘ গতিযুক্ত যুক্তিযুক্ত কনস্ট্রাক্টরের মতো গন্ধযুক্ত সমস্যা রয়েছে এবং আমি মনে করি যে কোনও বস্তুর গ্রাহক যেভাবেই অবজেক্টটি ব্যবহার করার জন্য নির্ভরতাগুলি জানতে হবে, সুতরাং এটি সম্পত্তি ইনজেকশন ব্যবহারের ক্ষেত্রে একটি কেস তৈরি করে। আমি সম্পত্তি ইনজেকশনের অন্তর্নিহিত প্রকৃতি পছন্দ করি না তবে আমি এটি আরও মার্জিত বলে মনে করি যার ফলে পরিচ্ছন্ন বর্ণন কোড পাওয়া যায়। তবে অন্যদিকে, কনস্ট্রাক্টর ইঞ্জেকশন উচ্চতর ডিগ্রি এনক্যাপসুলেশন সরবরাহ করে,

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

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