ফ্রেমওয়ার্ক লেখার সময় নির্ভরতা ইনজেকশন / আইওসি পাত্রে অনুশীলন


18

আমি নেট প্রকল্পের জন্য নেট জন্য বিভিন্ন আইওসি পাত্রে (ক্যাসেল। উইন্ডসর, অটোফ্যাক, এমইএফ, ইত্যাদি) ব্যবহার করেছি। আমি খুঁজে পেয়েছি যে তারা ঘন ঘন নির্যাতন করা হয় এবং অনেকগুলি খারাপ অভ্যাসকে উত্সাহিত করে।

আইওসি ধারক ব্যবহারের জন্য কি কোনও প্রতিষ্ঠিত অনুশীলন রয়েছে, বিশেষত যখন প্ল্যাটফর্ম / কাঠামো সরবরাহ করার সময়? ফ্রেমওয়ার্ক রাইটার হিসাবে আমার লক্ষ্য কোডটি যতটা সম্ভব সহজ এবং যত সহজে ব্যবহার করা সহজ make আমি বরং দশ বা এমনকি দুটিয়ের চেয়ে একটি অবজেক্ট তৈরি করতে কোডের একটি লাইন লিখি।

উদাহরণস্বরূপ, কয়েকটি কোডের গন্ধ যা আমি লক্ষ্য করেছি এবং এর জন্য ভাল পরামর্শ নেই:

  1. কনস্ট্রাক্টরগুলির জন্য বৃহত সংখ্যক পরামিতি (> 5)। পরিষেবা তৈরি করা জটিল হতে থাকে; সমস্ত নির্ভরতা কন্সট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয় - তবুও উপাদানগুলি খুব কমই alচ্ছিক হয় (সম্ভবত টেস্টিং ব্যতীত)।

  2. বেসরকারী এবং অভ্যন্তরীণ শ্রেণীর অভাব; এটি সি # এবং সিলভারলাইট ব্যবহারের নির্দিষ্ট সীমাবদ্ধতা হতে পারে তবে আমি কীভাবে এটি সমাধান করা যায় তাতে আগ্রহী। যদি সমস্ত শ্রেণি সর্বজনীন হয় তবে ফ্রেমওয়ার্ক ইন্টারফেসটি কী তা বলা মুশকিল; এটি আমাকে ব্যক্তিগত অংশগুলিতে অ্যাক্সেসের অনুমতি দেয় যা আমি সম্ভবত স্পর্শ করি না।

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

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

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

আমি কীভাবে পরীক্ষামূলক ইন্টারফেস, পাশাপাশি ব্যবহারযোগ্য সহজ উভয়টিকে কীভাবে সরবরাহ করব? সেরা অনুশীলনগুলি কী কী?


1
তারা কোন খারাপ অভ্যাসকে উত্সাহ দেয়? বেসরকারী ক্লাস হিসাবে, আপনার যদি ভাল এনক্যাপসুলেশন থাকে তবে তাদের মধ্যে খুব বেশি হওয়া দরকার নেই; একটি জিনিস জন্য, তারা পরীক্ষা করা আরও কঠিন।
অ্যারোনআউট

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

2
এটি কি সম্ভব যে সম্ভবত আপনার শ্রেণি নির্মাতাদের জন্য অনেক পরামিতিগুলির প্রয়োজনের একটি চিহ্ন নিজেই কোড গন্ধ এবং ডিআইপি কেবল এটি আরও স্পষ্ট করে তুলছে?
dreza

3
একটি কাঠামোর মধ্যে একটি নির্দিষ্ট আইওসি ধারক ব্যবহার করা ভাল অভ্যাস নয়। নির্ভরতা ইনজেকশন ব্যবহার করা একটি ভাল অনুশীলন। আপনি কি পার্থক্য সম্পর্কে সচেতন?
অ্যারোনআউট

1
অ্যারোনট (মৃত থেকে ফিরে) "নির্ভরতা ইনজেকশন একটি ভাল অনুশীলন" ব্যবহার করা মিথ্যা। ডিপেন্ডেন্সি ইনজেকশন এমন একটি সরঞ্জাম যা কেবলমাত্র উপযুক্ত হলে ব্যবহার করা উচিত। Dependency Injection সর্বদা ব্যবহার করা একটি খারাপ অভ্যাস।
ডেভ হিলিয়ার

উত্তর:


27

একমাত্র বৈধ নির্ভরশীলতা ইনজেকশন অ্যান্টি-প্যাটার্ন সম্পর্কে যা আমি সচেতন তা হ'ল সার্ভিস লোকেটার প্যাটার্ন, যা কোনও ডিআই ফ্রেমওয়ার্কের জন্য ব্যবহৃত হলে এটি একটি অ্যান্টি-প্যাটার্ন হয়।

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

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

  • আচরণের বিপরীতে ডেটা ইনজেকশন হ'ল পল্টেরজিস্ট অ্যান্টি-প্যাটার্নের একটি উপ - প্রকার , 'এই ক্ষেত্রে জিস্টটি ধারক হয়ে থাকে। যদি কোনও শ্রেণীর বর্তমান তারিখ এবং সময় সম্পর্কে সচেতন হওয়া দরকার, আপনি কোনও ইনজেক্ট করবেন না DateTimeযা ডেটা; পরিবর্তে, আপনি সিস্টেম ঘড়ির উপর একটি বিমূর্ততা ইনজেকশন করুন (আমি সাধারণত আমার কল ISystemClockকরি, যদিও আমি মনে করি যে সিস্টেমআর্পার্স প্রকল্পে আরও সাধারণ কিছু রয়েছে )। এটি কেবল ডিআই-র ক্ষেত্রেই সঠিক নয়; এটি টেস্টিবিলিটির জন্য একেবারে অপরিহার্য, যাতে আপনি প্রকৃতপক্ষে তাদের অপেক্ষা না করে সময়-পরিবর্তিত ফাংশনগুলি পরীক্ষা করতে পারেন।

  • প্রতিটি জীবনচক্রকে সিঙ্গেলটন হিসাবে ঘোষণা করা আমার কাছে কার্গো কাল্ট প্রোগ্রামিংয়ের একটি নিখুঁত উদাহরণ এবং স্বল্প পরিমাণে স্বতঃস্ফূর্তভাবে নামকরণ করা " অবজেক্ট সেসপুল "। আমি মনে রাখার চেয়ে বেশি সিঙ্গলটনের অপব্যবহার দেখেছি এবং এর মধ্যে খুব কমই ডিআই জড়িত।

  • আর একটি সাধারণ ত্রুটিটি হ'ল বাস্তবায়ন-নির্দিষ্ট ইন্টারফেসের ধরণের (যেমন অদ্ভুত নাম সহ IOracleRepository) কেবলমাত্র এটি ধারকটিতে নিবন্ধন করতে সক্ষম হ'ল । এটি নির্ভরতা ইনভার্জন নীতি লঙ্ঘন করে এবং এটি কেবল একটি ইন্টারফেস, এর অর্থ এটি সত্যিকারের বিমূর্ত নয়) এবং প্রায়শই ইন্টারফেস বিভাজনও অন্তর্ভুক্ত করে যা ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে ।

  • সর্বশেষ ত্রুটিটি যা আমি সাধারণত দেখি তা হ'ল " alচ্ছিক নির্ভরতা", যা তারা নেডডিনারে করেছিলেন । অন্য কথায়, এমন একটি কনস্ট্রাক্টর রয়েছে যা নির্ভরতা ইনজেকশন গ্রহণ করে, তবে অন্য একটি কনস্ট্রাক্টর যা একটি "ডিফল্ট" বাস্তবায়ন ব্যবহার করে। এই এছাড়াও চোবান লঙ্ঘন করে এবং tends নেতৃত্ব LSP লঙ্ঘনের সময়ের, ডেভেলপারদের সেইসাথে, ডিফল্ট বাস্তবায়ন প্রায় অনুমানের শুরু, এবং / অথবা ডিফল্ট কন্সট্রাকটর ব্যবহার করে নতুন-ing আপ দৃষ্টান্ত শুরু।

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

... ইত্যাদি।

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

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

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

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


আমার কিছু প্রশ্ন আছে। নুগেটে বিতরণ করা লাইব্রেরির জন্য, আমি কোনও আইওসি সিস্টেমের উপর নির্ভর করতে পারি না যা অ্যাপ্লিকেশনটি লাইব্রেরি ব্যবহার করে করা হয়েছে, লাইব্রেরি নিজেই নয়। অনেক ক্ষেত্রে লাইব্রেরির ব্যবহারকারী তার অভ্যন্তরীণ নির্ভরতা একেবারেই বিবেচনা করে না। কোনও অভ্যন্তরীণ নির্ভরতা আরম্ভ করার জন্য কোনও ডিফল্ট নির্মাতা এবং ইউনিট টেস্টিং এবং / বা কাস্টমাইজড বাস্তবায়নের জন্য দীর্ঘতর নির্মাণকারী নিয়ে সমস্যা আছে? এছাড়াও আপনি "নতুন" এড়ানোর জন্য বলেছেন। এটি স্ট্রিংবিল্ডার, ডেটটাইম এবং টাইমস্প্যানের মতো কিসের জন্য প্রযোজ্য?
এটিয়েন চারল্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.