নির্ভরতা ইনজেকশন কি হাত দিয়ে রচনা এবং পলিমারফিজমের আরও ভাল বিকল্প?


13

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

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

উত্তর:


21

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

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

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

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


1
ডিপেন্ডেন্সি ইনজেকশন (ডিআই) ইনভার্শন অফ কন্ট্রোল (আইওসি) এর একটি ফর্ম form
ম্যাথু ফ্লিন

@ ম্যাথেজফ্লিন, সত্যিই রেফারেন্সের জন্য: martinfowler.com/articles/inication.html
পেটার

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

উফ - আমি "সত্যই" মিস করেছি। আমি ভেবেছিলাম আপনি আমার সাথে বিরোধিতা করছেন ... দুঃখিত।
ম্যাথু ফ্লিন

আপনার শেষ অনুচ্ছেদটি আমাকে কিছুটা ভাল বোধ করে; আমি যখন আমার ছোট্ট শেখার প্রকল্পটিতে কাজ করছিলাম, তখন আমি নিজেকে বলেই থাকি, "এটি বহুবর্ষের মতো অনুভব করে .."। দুর্ভাগ্যক্রমে, আমার কাজের জন্য নেট এবং সি # মারাত্মকভাবে পুরানো, কিন্তু এটি অনুসন্ধান করে, ityক্যটি কি সি # ফ্রেমওয়ার্কের মধ্যে নির্মিত যা আপনি কথা বলছেন?
ড্রার ক্লারিস

22

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

"নির্ভরতা ইনজেকশন" একটি 5-শতাংশ ধারণার জন্য 25 ডলার শব্দ is

এটি শোরের পোস্ট থেকে, যা আমার জন্য সমস্ত কিছু পরিষ্কার করে দিয়েছে। উদাহরণ স্বরূপ:

প্রদত্ত

class Engine {public abstract void start()}
class V8 extends Engine {...}
class V6 extends Engine {...}

লেখার পরিবর্তে:

class Car
{
    private Engine engine;
    public Car()
    {
        this.engine = new V6();
    }

    public void start()
    {
        this.engine.start();
    }
}

আপনার লেখার মতো কিছু:

class Car
{
    private Engine engine;
    public Car(Engine a)
    {
        this.engine = a;
    }

    public void start()
    {
        this.engine.start();
    }
}

...

Car F = new Car(new V8());

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

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

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

এটাই.


0

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

  • অবজেক্ট তৈরির কেন্দ্রীয় কেন্দ্র
  • প্রতি থ্রেড ভিত্তিতে একক প্রদান করুন
  • যেমন বাধা হিসাবে দিক ওরিয়েন্টেড কৌশল

0

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

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