নির্ভরতা ইনজেকশন: আমি কি এর সমস্ত অংশ ধরে রাখার জন্য একটি গাড়ি শ্রেণি তৈরি করব?


10

আমার সি সি ++ অ্যাপ্লিকেশনটিতে আমার কাছে অনেকগুলি গাড়ি রয়েছে যা রেসট্র্যাক সহ রয়েছে।

প্রতিটি গাড়ী শত শত অংশ নিয়ে গঠিত। প্রতিটি অংশ অন্য কোনও অংশ বা দুটি উপর নির্ভর করে।

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

সুতরাং যখন আমি আমার রেসিংয়ের সমস্ত গাড়ি রেসট্র্যাকটিতে রাখি তখন কোনও গাড়ী সত্ত্বা থাকবে না তবে প্রচুর গাড়ির অংশগুলি একে অপরের উপর নির্ভর করে রেসিংয়ের উপর নির্ভর করে ?? আমি কি সঠিক?

সম্পাদনা করুন:

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

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

উত্তর:


24

রেস ট্র্যাকের উপর বসে থাকা গাড়ির একগুচ্ছ দলগুলি কী করছে?

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

ব্যবহার

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

আমি যা চাই তা ব্যবহারযোগ্য class যা আমি কার্বুরেটর কীভাবে কাজ করে তা ভেবে চিন্তা না করেই কাজগুলি করতে বলতে পারি। আমি কেবল গ্যাস প্যাডেল সম্পর্কে চিন্তা করি। সেগুলি কীভাবে সংযুক্ত রয়েছে তা আমি উদ্বিগ্ন কিছু নয়। এটি বিমূর্ততা।

ইনজেকশন নির্ভরতা

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

না, ডিআই হ'ল ট্র্যাকের বৃষ্টিপাত শুরু হওয়ার সাথে সাথে আমার পিট ক্রুগুলি আরও ভালর জন্য আমার টায়ারগুলি দ্রুত বদলাতে দেয়। সম্পূর্ণ ভিন্ন গাড়ীতে hopুকতে না পেরে এটি করতে পেরে ভাল লাগছে।

ডিআই সত্যই কোনও নীতি অনুসরণ করে: নির্মাণ থেকে পৃথক ব্যবহার।

এমন একটি গাড়ি যা এক ঘন্টা 90 মাইল বেগে নতুন টায়ার ইনস্টল করতে পারে তা শীতল লাগতে পারে তবে আমি মনে করি না যে এটি কোনও টায়ারের সাথে বৈদ্যুতিন ইনস্টল করে কোনও ঘোড়দৌড় জিততে চলেছে।

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

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

নির্মাণ

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

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

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

ভাষায় এটি করা এবং কিছু ডিআই ফ্রেমওয়ার্ক বা আইওসি পাত্রে ব্যবহার না করাকে খাঁটি ডিআই বলে । এটি খুব ভাল কাজ করে। অনেক দিন ধরে আছে আমরা এটিকে কেবল রেফারেন্স পাসিং বলি ।

ডিআই সরঞ্জাম

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

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

নকশার মূলনীতি

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

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

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

এটি করা থেকে বিরত থাকা নির্ভরতা বিপরীত নীতি অনুসরণ করে বলা হয় । সাধারণত, একটি উচ্চ স্তরের মডিউল (গাড়ির বর্গের মতো) সরাসরি নিম্ন স্তরের মডিউলগুলিতে (গুডিয়ায়ার টায়ারের ক্লাসের মতো) উপর নির্ভর করে না। এটি কোনও বিমূর্তনের উপর নির্ভর করতে হবে (টায়ার ইন্টারফেসের মতো)।

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

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

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

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


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

6
এবং আমি সর্বদা ভেবেছিলাম যখন আপনি বাম দিকে
চালাবেন

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

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

15

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

না।

নির্ভরতা ইনজেকশন পয়েন্ট নির্ভরতা নিরুৎসাহিত করার জন্য মোটেই নয় । পুরোপুরি বিপরীত.

নির্ভরতা ইনজেকশন এই প্রশ্নটি সম্পর্কে: গাড়িটি তার অংশগুলি কোথা থেকে পায় ? এগুলি কোথায় এবং কীভাবে তৈরি করা হয়েছে এবং গাড়ি কীভাবে তাদের উল্লেখ পেয়ে যায়?

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

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


1
অবশেষে, dependency injectionধারণার একটি বুদ্ধিমান ব্যাখ্যা ।
অ্যানাটোলি টেকটোনিক

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

2
@ ওহটসিসনাম আমি সহজেই অবৈধ এবং অর্ধিক অর্ধায়িত বস্তু তৈরি করতে ডিআই ব্যবহার করতে পারি। বৈধতা একটি ডিআই দায়িত্ব নয়। না হয় পরিবর্তনহীন। বৈধ এবং অপরিবর্তনীয় বস্তু তৈরির কাজ ডিআই নিতে পারে। ডিআই-এর প্রয়োগের কোনও উপায় নেই যে কেবলমাত্র সেগুলিই সেই বিষয়গুলি তৈরি এবং ব্যবহার করা হয়। অবজেক্টগুলি অবশ্যই এটি প্রয়োগ করে।
candied_orange

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

0

সুতরাং যখন আমি আমার রেসিংয়ের সমস্ত গাড়ি রেসট্র্যাকটিতে রাখি তখন কোনও গাড়ী সত্ত্বা থাকবে না তবে প্রচুর গাড়ির অংশগুলি একে অপরের উপর নির্ভর করে রেসিংয়ের উপর নির্ভর করে ?? আমি কি সঠিক?

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

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

সত্যিই, না। একটি গাড়ী কেবল ধাতব এবং প্লাস্টিকের একটি এলোমেলো ব্যাগ নয়। এটি একটি মেশিন।

নির্ভরতা ইনজেকশন এই ক্ষেত্রে ওভারকিল নয়। গাড়িটি আরও কিছু তৈরি করতে হবে যা কারখানার শ্রেণি বা বিল্ডার অবজেক্ট হবে। গাড়িটি কীভাবে নিজের তৈরি করতে হবে তা জানা উচিত নয়।


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