কৌশল প্যাটার্ন এবং নির্ভরতা ইনজেকশনের মধ্যে পার্থক্য কী?


96

কৌশল প্যাটার্ন এবং নির্ভরতা ইনজেকশন উভয়ই আমাদের রান সময় অবজেক্টগুলি সেট / ইনজেক্ট করার অনুমতি দেয়। কৌশল প্যাটার্ন এবং নির্ভরতা ইনজেকশনের মধ্যে পার্থক্য কী?


কৌশল
নিদর্শন

উত্তর:


110

ডিআই এবং কৌশল একইভাবে কাজ করে তবে কৌশলটি আরও সূক্ষ্ম ও স্বল্প-জীবন নির্ভরতাগুলির জন্য ব্যবহৃত হয়।

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

এছাড়াও, আপনি পদ্ধতিগুলিতে আর্গুমেন্ট হিসাবে কৌশলগুলি পাস করতে পারেন, তবে পদ্ধতি যুক্তি ইঞ্জেকশন সম্পর্কিত ধারণাটি ব্যাপক নয় এবং বেশিরভাগই কেবল স্বয়ংক্রিয় পরীক্ষার প্রসঙ্গে ব্যবহৃত হয়।

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

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


কেবলমাত্র একটি প্রয়োগের সাথে ডিআই-তে ব্যবহৃত একটি ইন্টারফেস খুব সাধারণ - তাই তাহলে এই বিশেষ ক্ষেত্রে ডিআই কী?
কল্পনা সনি

4
এই উক্তিটি মূলত এগুলি ব্যাখ্যা করে:in a DI scenario it is more unusual that the dependencies of objects change during their lifetimes, while this is not uncommon with Strategy
সের্গেই তেলশেভস্কি

কৌশল: শ্রেণিগুলি এমনভাবে ডিজাইন করা হয়েছে যাতে রান-টাইমে এগুলিকে অ্যালগরিদম দিয়ে কনফিগার করা যায়। ডিআই: এই জাতীয় ক্লাসগুলি রান-টাইমে ইনজেকশনের সাথে একটি অ্যালগরিদম (একটি কৌশল অবজেক্ট) পায়। W3sdesign.comজিওএফ ডিজাইন প্যাটার্নস মেমরি থেকে ।
GFranke

39

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

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

public class DataExporter() {
  XMLFormatter formatter = new XMLFormatter();
}

আপনি কনস্ট্রাক্টরে ফরম্যাটারটি 'ইনজেকশন' করবেন:

public class DataExporter {
  IFormatter formatter = null;

  public DataExporter(IDataFormatter dataFormatter) {
    this.formatter = dataFormatter;
  }
}

DataExporter exporter = new DataExporter(new XMLFormatter());

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

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


28

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

এটি বলা ঝুঁকিপূর্ণ যে ডিআই হ'ল একটি নাম পরিবর্তিত কৌশল প্যাটার্ন কারণ এটি আইএমওর জন্য কৌশলগত প্যাটার্নটি আসলে কী ম্লান করতে শুরু করে।


4
আমি মনে করি আমি আপনার বক্তব্যটি বুঝতে পেরেছি, তবে আমি এটি কথায় সঠিকভাবে রাখতে পারি না ... সুতরাং আপনার বক্তব্য ডিআই একটি বাস্তবায়ন প্যাটার্নের চেয়ে বেশি কৌশল যখন ডিজাইনের নকশার চেয়ে বেশি, এবং কৌশল বাস্তবায়নের এক উপায় ডিআই এর মাধ্যমে?
রবার্ট গোল্ড

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

15

ডুড, নির্ভরতা ইনজেকশন একটি আরও সাধারণ প্যাটার্ন এবং এটি বিমূর্তির উপর নির্ভরতা সম্পর্কে নয় যা কনক্রেশনগুলি নয় এবং এটি প্রতিটি প্যাটার্নের একটি অংশ, তবে কৌশল প্যাটার্ন আরও নির্দিষ্ট সমস্যার সমাধান is

এটি উইকিপিডিয়া থেকে সংজ্ঞা:

ডিআই:

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

কৌশল প্যাটার্ন:

কম্পিউটার প্রোগ্রামিংয়ে, কৌশল প্যাটার্ন (নীতি প্যাটার্ন নামেও পরিচিত) একটি নির্দিষ্ট সফ্টওয়্যার ডিজাইনের প্যাটার্ন, যার মাধ্যমে রানটাইম সময়ে অ্যালগরিদম নির্বাচন করা যায়।

কৌশল নিদর্শনটি অ্যালগরিদমের একটি পরিবারকে সংজ্ঞায়িত করার জন্য, প্রতিটিকে একটি বস্তু হিসাবে আবদ্ধ করে এবং তাদেরকে বিনিময়যোগ্য করে তোলার জন্য একটি উপায় সরবরাহ করার উদ্দেশ্যে। কৌশল প্যাটার্নটি তাদের ব্যবহার করে এমন ক্লায়েন্টদের থেকে পৃথকভাবে অ্যালগরিদমগুলি পৃথক হতে দেয়।


4
আপনার ব্যাখ্যায় আমি বিশেষত "বউ" অংশটি পছন্দ করি। :-)
জোহে

7

কৌশলগুলি হ'ল উচ্চ-স্তরের জিনিস যা জিনিসগুলি কীভাবে গণনা করা হয় তা পরিবর্তন করতে ব্যবহৃত হয়। নির্ভরতা ইনজেকশন সহ, আপনি কীভাবে জিনিসগুলি গণনা করা যায় তা পরিবর্তন করতে পারবেন না তবে যা আছে তা পরিবর্তন করতে পারেন।

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


কৌশল উদাহরণ:

public class Cosine {
  private CalcStrategy strat;

  // Constructor - strategy passed in as a type of DI
  public Cosine(CalcStrategy s) {
    strat = s;
  }
}

public abstract class CalcStrategy {
  public double goFigure(double angle);
}

public class RadianStrategy extends CalcStrategy {
  public double goFigure(double angle) {
    return (...);
  }
}
public class DegreeStrategy extends CalcStrategy {
  public double goFigure(double angle) {
    return (...);
  }
}

লক্ষ করুন যে কৌশলগুলির মধ্যে পৃথক কোনও পাবলিক ডেটা নেই। বা কোন ভিন্ন পদ্ধতি আছে। উভয় কৌশলই একই ফাংশন এবং স্বাক্ষরগুলি ভাগ করে দেয়।


এখন নির্ভরতা ইনজেকশনের জন্য:

public class Cosine {
  private Calc strat;

  // Constructor - Dependency Injection.
  public Cosine(Calc s) {
    strat = s;
  }
}

public class Calc {
  private int numPasses = 0;
  private double total = 0;
  private double intermediate = 0;

  public double goFigure(double angle) {
    return(...);
}

public class CalcTestDouble extends Calc {
  // NOTICE THE PUBLIC DATA.
  public int numPasses = 0;
  public double total = 0;
  public double intermediate = 0;
  public double goFigure(double angle) {
    return (...);
  }
}

ব্যবহার:

public CosineTest {

  @Test
  public void testGoFigure() {
    // Setup
    CalcTestDouble calc = new CalcTestDouble();
    Cosine instance = new Cosine(calc);

    // Exercise
    double actualAnswer = instance.goFigure(0.0);

    // Verify
    double tolerance = ...;
    double expectedAnswer = ...;
    assertEquals("GoFigure didn't work!", expectedAnswer,
         actualAnswer, tolerance);

    int expectedNumPasses = ...;
    assertEquals("GoFigure had wrong number passes!",
        expectedNumPasses, calc.numPasses);

    double expectedIntermediate = ...;
    assertEquals("GoFigure had wrong intermediate values!",
        expectedIntermediate, calc.intermediate, tolerance);
  }
}

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

পরীক্ষার দ্বিগুণ ইনজেকশন দেওয়া হয়েছিল। এটি কেবলমাত্র একটি কৌশলের চেয়ে পৃথক যেহেতু এটি কেবলমাত্র ফাংশনগুলিতে নয় ডেটা প্রভাবিত করে


4

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

নির্ভরশীলতা ইনজেকশনটি কোন কংক্রিট কৌশলটি ব্যবহার করবেন তা সিদ্ধান্ত না দিয়ে কংক্রিট কৌশলটির একটি উদাহরণ তৈরি করে এবং এটি কলিং মডিউলটিতে "ইনজেকশন" দিয়েই কৌশল প্যাটার্নকে পরিমার্জন করে। কংক্রিট কৌশল উদাহরণটি কৌশল অবজেক্টের মধ্যেও লুকানো যেতে পারে কীভাবে পরিচালনা (প্রাথমিককরণ ইত্যাদি) সম্পর্কে জ্ঞান হিসাবে কেবলমাত্র একক নির্ভরতা থাকলেও এটি দরকারী।


1

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


0

কৌশল আপনার নির্ভরতা ইনজেকশন দক্ষতা ব্যবহার করার একটি ক্ষেত্র। নির্ভরতা ইনজেকশন বাস্তবায়নের আসল উপায়গুলি নিম্নরূপ:

  1. ইভেন্টগুলি
  2. Unityক্য / কাঠামোর মানচিত্রের কনফিগারেশন ফাইল (বা প্রোগ্রাম্যাটিকভাবে) ইত্যাদি
  3. এক্সটেনশন পদ্ধতি
  4. বিমূর্ত কারখানার প্যাটার্ন
  5. নিয়ন্ত্রণের প্যাটার্নের বিপরীতকরণ (কৌশল এবং বিমূর্ত কারখানা উভয় দ্বারা ব্যবহৃত)

কৌশলটি পৃথক করে তোলে যদিও একটি জিনিস আছে। আপনি ইউনিটিতে যেমন জানেন যে অ্যাপ্লিকেশনটি শুরু হয়ে গেলে সমস্ত নির্ভরতা সেট হয়ে যায় এবং আমরা এটিকে আর পরিবর্তন করতে পারি না। কিন্তু কৌশল রানটাইম নির্ভরতা পরিবর্তনকে সমর্থন করে। তবে আমাদের নির্ভরতা পরিচালনা করতে / ইনজেক্ট করতে হবে, কৌশলটির দায়িত্ব নয়!

আসলে কৌশল নির্ভরতা ইনজেকশন সম্পর্কে কথা বলে না। প্রয়োজনে এটি স্ট্র্যাটেজি প্যাটার্নের অভ্যন্তরে অ্যাবস্ট্রাক্ট কারখানার মাধ্যমে করা যেতে পারে। কৌশলটি কেবল ইন্টারফেসের সাথে ক্লাসের একটি পরিবার তৈরি এবং এটির সাথে 'খেলতে' কথা বলে। খেলার সময়, আমরা যদি ক্লাসগুলি অন্য স্তরের মধ্যে দেখতে পাই তবে আমাদের এটি নিজেরাই ইনজেক্ট করতে হবে তবে কৌশলটির কাজ নয়।


0

যদি আমরা সলিডের নীতিগুলি বিবেচনা করি - আমরা ওপেন ক্লোজড নীতিমালার জন্য কৌশল প্যাটার্ন এবং নির্ভরতা বিপরীত নীতিটির জন্য নির্ভরতা ইনজেকশন ব্যবহার করি


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