প্রায় প্রত্যেকেরই একটি সাধারণ ডেটা স্ট্রাকচার অ্যাক্সেসের প্রয়োজন হয় সেই ক্ষেত্রে নির্ভরতা ইনজেকশনের সুবিধা কী?


20

গ্লোবালগুলি ওওপিতে খারাপ হওয়ার কারণ রয়েছে ।

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

তবে, যেখানে প্রায় প্রত্যেককে একটি নির্দিষ্ট ডেটা কাঠামো সম্পর্কে জানতে হবে, সেখানে নির্ভরতা ইনজেকশন কেন কোনও বৈশ্বিক বস্তুর চেয়ে ভাল?

উদাহরণ (একটি সরলীকৃত একটি, নির্দিষ্ট অ্যাপ্লিকেশনটিতে খুব গভীরভাবে না ভেবে বিন্দুটি দেখানোর জন্য)

অনেকগুলি ভার্চুয়াল গাড়ি রয়েছে যার মধ্যে প্রকার, নাম, রঙ, গতি, অবস্থান ইত্যাদি থেকে শুরু করে বিপুল সংখ্যক বৈশিষ্ট্য এবং রাজ্য রয়েছে A আরম্ভ এবং স্বয়ংক্রিয়) তাদের রাজ্য বা বৈশিষ্ট্যগুলির অনেকগুলি পরিবর্তন করতে পারে।

নিষ্পাপ সমাধানটি কেবল তাদের একটি গ্লোবাল ধারক তৈরি করা হবে

vector<Vehicle> vehicles;

যা কোথাও থেকে অ্যাক্সেস করা যেতে পারে।

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

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

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


6
অপেক্ষা করুন, আপনি অ-পরিবর্তনীয় গ্লোবালগুলি নিয়ে কথা বলছেন এবং ন্যায়সঙ্গত করতে "বিশ্ব রাষ্ট্র কেন খারাপ" এর লিঙ্কটি ব্যবহার করেন? ডব্লিউটিএফ?
টেলাস্টিন

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

9
তবে কেবল পঠিত গ্লোবাল এবং বৈশ্বিক রাষ্ট্রের মধ্যে একটি নির্ধারিত পার্থক্য রয়েছে।
টেলাস্টিন


1
@vsz সত্যই নয় - প্রশ্নটি বিভিন্ন স্বতন্ত্র বস্তুর সমস্যার আশেপাশের পরিষেবা হিসাবে সার্ভিস লোকেটার কারখানার বিষয়ে; তবে এর উত্তরগুলি ক্লাসে গ্লোবাল ডেটা পাস করার পরিবর্তে ক্লাসগুলিকে বৈশ্বিক ডেটাতে অ্যাক্সেসের অনুমতি দেওয়ার আপনার প্রশ্নেরও উত্তর দেয়।
gbjbaanb

উত্তর:


37

এক্ষেত্রে যেখানে প্রায় প্রত্যেককে একটি নির্দিষ্ট ডেটা কাঠামো সম্পর্কে জানতে হবে, কেন নির্ভরতা ইনজেকশন কোনও বৈশ্বিক বস্তুর চেয়ে ভাল?

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

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

নির্ভরতা ইনজেকশন এর পয়েন্ট:

  1. অভিনেতাদের প্রয়োজনের ভিত্তিতে সংস্থানগুলি অ্যাক্সেস করার অনুমতি দেওয়া এবং
  2. কোনও প্রদত্ত অভিনেতা দ্বারা কোনও সংস্থার কোন উদাহরণ অ্যাক্সেস করা হয়েছে তার উপর নিয়ন্ত্রণ রাখা ।

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

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

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

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

তারপরে, আপনাকে বিবেচনা করতে হবে: সমস্ত অভিনেতাদের কি সেই উত্সটিতে অ্যাক্সেসের দরকার আছে? সত্যি?

সম্ভবত আপনি সেই উত্সটিকে objectশ্বর বস্তুতে পরিণত করার ভুল করেছেন, (সুতরাং অবশ্যই প্রত্যেকেরই এটির অ্যাক্সেস প্রয়োজন,) অথবা সম্ভবত আপনি আপনার প্রকল্পের এমন অভিনেতাদের সংখ্যাকে অতিরিক্তভাবে বিবেচনা করছেন যাঁর সেই সংস্থানটিতে আসলে অ্যাক্সেস দরকার need

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

  • রিফ্যাক্টর যে বৃহত বিশাল বিশাল godশ্বরের সংস্থানকে ছোট ছোট উপ-সংস্থাগুলিতে পরিণত করে, তাই বিভিন্ন অভিনেতার এটির বিভিন্ন অংশে অ্যাক্সেসের প্রয়োজন হয়, তবে খুব কমই কোনও অভিনেতাকে তার সমস্ত টুকরো প্রয়োজন হয়, বা

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


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

3
@gbjbaanb মনে করুন যে উত্সটি একটি জোরক। ওপি বলছে যে তার সিস্টেমের প্রতিটি একক বস্তুর সাথে কাজ করার জন্য কেবল জর্কের দরকার নেই, তবে এটিও যে কেবলমাত্র একটি জোরকই বিদ্যমান থাকবে এবং তাঁর সমস্ত বস্তুর কেবল জোরকের সেই এক উদাহরণে অ্যাক্সেসের প্রয়োজন হবে। আমি বলছি যে এই দুটি অনুমানের উভয়ই যুক্তিসঙ্গত নয়: সম্ভবত এটি সত্য নয় যে তার সমস্ত বস্তুর একটি জর্কের প্রয়োজন, এবং এমন সময় আসবে যখন কিছু বস্তুর জোরকের নির্দিষ্ট উদাহরণ প্রয়োজন হবে, অন্য জিনিসগুলির জন্য প্রয়োজন হবে জোরকের বিভিন্ন উদাহরণ।
মাইক নকিস

2
@gbjbaanb আমি মনে করি না আপনি আমাকে জোর্কের দুটি বৈশ্বিক দৃষ্টান্ত রাখার কারণ কেন জোরকা এবং জোরকবি নামকরণ করবেন এবং যে বস্তুগুলির মধ্যে কোনটি জোরকাএ ব্যবহার করবে এবং কোনটি জোরকবি ব্যবহার করবে, তার জন্য হার্ড-কোড করা কেন বোকামি হবে তা ব্যাখ্যা করতে বলছেন না, ঠিক আছে?
মাইক নকিস

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

1
@gbjbaanb আমি বিশ্বাস করি যে এক ক্লায়েন্ট ক্লাসটি জোরকাএ বা জোরকবি যে কোনও ক্ষেত্রে একচেটিয়াভাবে কাজ করতে সক্ষম হবে, ক্লায়েন্ট শ্রেণি তাদের মধ্যে কোনটি গ্রহণ করবে তা সিদ্ধান্ত নেবে না।
ইউজিন র্যাবটসেভ

39

অপ-পরিবর্তনীয় গ্লোবালগুলি ওওপি-তে খারাপ হওয়ার কারণ রয়েছে plenty

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

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

না, তারা না।

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

অনেকগুলি ভার্চুয়াল গাড়ি রয়েছে যার মধ্যে প্রকার, নাম, রঙ, গতি, অবস্থান ইত্যাদি থেকে শুরু করে বিপুল সংখ্যক বৈশিষ্ট্য এবং রাজ্য রয়েছে A আরম্ভ এবং স্বয়ংক্রিয়) তাদের রাজ্য বা বৈশিষ্ট্যগুলির অনেকগুলি পরিবর্তন করতে পারে।

এটি একটি নকশা দুঃস্বপ্ন। আপনার কাছে প্রচুর স্টাফ রয়েছে যা বৈধতার কোনও উপায় ছাড়াই ব্যবহার করা / আপত্তিজনক ব্যবহার করা যায় না, কোনও চুক্তির সীমাবদ্ধতার কোনও পদ্ধতি নেই - এটি কেবলমাত্র জুড়েছে।

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

হ্যাঁ, সর্বত্র সাধারণ ডেটাতে সংযুক্ত হওয়া কোনও গ্লোবাল থেকে খুব আলাদা নয় এবং এর মতো এখনও খারাপ।

উত্সাহটি হ'ল আপনি গ্লোবাল ভেরিয়েবল থেকে গ্রাহককে ডেকে আনছেন। এটি আপনাকে কীভাবে উদাহরণটি তৈরি হয় তাতে কিছুটা নমনীয়তা সরবরাহ করে। এটি আপনাকে কেবলমাত্র একটি উদাহরণ থাকতে বাধ্য করে না । আপনি আপনার বিভিন্ন গ্রাহককে দিয়ে আলাদা করতে পারবেন make তারপরে আপনার প্রয়োজন অনুযায়ী আপনার ইন্টারফেসের বিভিন্ন প্রয়োগও তৈরি করতে পারেন।

এবং পরিবর্তনের কারণে সফ্টওয়্যারটির স্থানান্তর প্রয়োজনীয়তাগুলি অনিবার্যভাবে আসে, এ জাতীয় প্রাথমিক স্তরের নমনীয়তা অত্যন্ত গুরুত্বপূর্ণ


"অ-পরিবর্তনীয়" সাথে বিভ্রান্তির জন্য দুঃখিত, আমি পরিবর্তনীয় বলতে চাই, এবং কোনওভাবে আমার ভুল স্বীকৃতি জানাতে চাই নি।
বনাম

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

2
যে অ্যাপ্লিকেশনগুলিতে অনেকগুলি অবজেক্ট থাকে যা নিয়মিত কিছু ডাটাবেস অ্যাক্সেস করে সেগুলি ঠিক অভূতপূর্ব নয়।
রবার্ট হার্ভে

@ রবার্টহারভে - নিশ্চিত, তবে তারা যে ইন্টারফেসের উপর নির্ভর করে তারা কি "কোনও ডাটাবেস অ্যাক্সেস করতে পারে" বা "এর জন্য কিছু ধ্রুবক ডেটা স্টোর foo" রাখতে পারে?
টেলাস্টিন

1
আমাকে এমন একটি দিলবার্টের কথা মনে করিয়ে দেয় যেখানে পিএইচবি 500 বৈশিষ্ট্য জিজ্ঞাসা করে এবং দিলবার্ট না বলে। সুতরাং পিএইচবি 1 টি বৈশিষ্ট্য জিজ্ঞাসা করেছে এবং দিলবার্ট নিশ্চিত বলেছে। পরের দিন দিলবার্ট 1 টি বৈশিষ্ট্যের জন্য প্রত্যেকে 500 টি অনুরোধ পেয়েছে। যদি কোনও কিছু স্কেল না করে তবে আপনি এটি কীভাবে সাজাবেন তা বিবেচনা করে না scale
corsiKa

16

আপনার তিনটি প্রধান কারণ বিবেচনা করা উচিত।

  1. পঠনযোগ্যতার। কোডের প্রতিটি ইউনিটে যদি ইনজেকশন দেওয়া হয় বা প্যারামিটার হিসাবে উত্তীর্ণ হওয়ার জন্য প্রয়োজনীয় সমস্ত কিছু থাকে তবে কোডটি দেখে সহজেই এটি কী করছে তা দেখতে সহজ। এটি আপনাকে ফাংশনটির একটি এলাকা দেয় যা আপনাকে উদ্বেগগুলি আরও ভালভাবে আলাদা করতে সক্ষম করে এবং এটি সম্পর্কে ভাবতেও বাধ্য করে ...
  2. Modularity। কেন পার্সারকে যানবাহনের পুরো তালিকা এবং তাদের সমস্ত সম্পত্তি সম্পর্কে জানতে হবে? এটা সম্ভবত না। সম্ভবত এটির জন্য কোনও গাড়ির আইডি রয়েছে কিনা বা যানবাহনের এক্সের সম্পত্তি ওয়াই আছে কিনা তা অনুসন্ধান করা দরকার Great গ্রেট means হঠাৎ করে আপনি এমন একটি নকশার সমাপ্তি ঘটান যা প্রত্যেকটি কোডের সাথে কেবল প্রাসঙ্গিক ডেটা হ্যান্ডলিংয়ের সাথে আরও বেশি সার্থক করে তোলে। যা আমাদের দিকে নিয়ে যায় ...
  3. Testability। একটি সাধারণ ইউনিট পরীক্ষার জন্য আপনি বিভিন্ন পরিবেশের জন্য আপনার পরিবেশ সেট আপ করতে চান এবং ইঞ্জেকশন এটি কার্যকর করা সহজ করে তোলে। আবার, বিশ্লেষণকারীর উদাহরণে ফিরে আসা, আপনি কীভাবে সর্বদা নিজের পার্সারের জন্য লেখেন সেই পরীক্ষার প্রতিটি ক্ষেত্রে পুরোদস্তুর সজ্জিত যানবাহনের একটি সম্পূর্ণ তালিকা হস্তশৈল করতে চান? অথবা আপনি কি কেবলমাত্র উপরে বর্ণিত পরিষেবা অবজেক্টের একটি মক বাস্তবায়ন তৈরি করবেন, বিভিন্ন সংখ্যক আইডি ফিরিয়ে আনবেন? আমি জানি আমি কোনটি বেছে নেব।

সুতরাং এটি সংক্ষেপে বলা যায়: ডিআই একটি লক্ষ্য নয়, এটি কেবলমাত্র একটি সরঞ্জাম যা লক্ষ্য অর্জন করা সম্ভব করে। আপনি যদি এটির অপব্যবহার করেন (যেমন এটি প্রদর্শিত হয় যেমন আপনি নিজের উদাহরণে করেন) তবে আপনি লক্ষ্যটির আরও কাছাকাছি পাবেন না, ডিআই-এর কোনও noন্দ্রজালিক সম্পত্তি নেই যা খারাপ ডিজাইনকে ভাল করে তুলবে।


রক্ষণাবেক্ষণ সম্পর্কিত সমস্যার জন্য সংক্ষিপ্ত উত্তরের জন্য +1। আরও পি: এসই উত্তরগুলি এর মতো হওয়া উচিত।
dodgethesteamroller

1
আপনার যোগফল এত ভাল। খুব ভাল। আপনি যদি মনে করেন [মাসের নকশার ধরণ] বা [মাসের বাজওয়ার্ড] আপনার সমস্যাগুলি ম্যাজিকালি সমাধান করবে আপনার খারাপ সময় হবে।
কর্সিকা

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

3

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

হ্যাঁ, এটি এখনও একটি বিশ্বব্যাপী। এটি থাকার মূল কারণটি কেবল পরিবর্তিত হয়নি, কেবল এটির মাধ্যমে।

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

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

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


"সাধারণত একটি গ্লোবাল অবজেক্ট খুব রক্ষণাবেক্ষণযোগ্য" - যদি তা পরিবর্তনীয় হয় না। আমার অভিজ্ঞতায়, এত বেশি পরিবর্তনীয় বিশ্বব্যাপী রাষ্ট্র থাকা দুঃস্বপ্ন হতে পারে (যদিও এটি বহনযোগ্য করার উপায় রয়েছে)।
sleske

3

ইতিমধ্যে আপনার কাছে উত্তরগুলি ছাড়াও,

অনেকগুলি ভার্চুয়াল গাড়ি রয়েছে যার মধ্যে প্রকার, নাম, রঙ, গতি, অবস্থান ইত্যাদি থেকে শুরু করে বিপুল সংখ্যক বৈশিষ্ট্য এবং রাজ্য রয়েছে A আরম্ভ এবং স্বয়ংক্রিয়) তাদের রাজ্য বা বৈশিষ্ট্যগুলির অনেকগুলি পরিবর্তন করতে পারে।

ওওপি প্রোগ্রামিংয়ের বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল কেবলমাত্র নির্দিষ্ট বৈশিষ্ট্যের জন্য আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি রক্ষা করা,

এখনই যদি আপনার অবজেক্টের অনেকগুলি বৈশিষ্ট্য থাকে - আপনার নিজের অবজেক্টটিকে আরও সাব-অবজেক্টে ভেঙে ফেলা উচিত।

সম্পাদন করা

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

উইন্ডোজ ফর্মের জিইউআই কোডে আপনাকে ইউনিট টেস্টিং করতে হবে, আপনি যদি বিশ্বব্যাপী ব্যবহার করেন তবে আপনাকে একটি সঠিক পরীক্ষার কেস তৈরি করার জন্য সমস্ত বোতাম তৈরি করতে হবে এবং এর ইভেন্টগুলি উদাহরণস্বরূপ ...


সত্য, তবে উদাহরণস্বরূপ, পার্সারের কাছে সমস্ত কিছু জানতে হবে কারণ কোনও আদেশ পাওয়া যেতে পারে যা যে কোনও কিছুতে পরিবর্তন আনতে পারে।
vsz

1
"আমি আপনার আসল প্রশ্নে আসার আগে" ... আপনি কি তার প্রশ্নের উত্তর দিতে যাচ্ছেন?
gbjbaanb

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