নির্ভরতা ইনজেকশন ধীরে ধীরে পন্থা


12

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

আমি যে কনসিডার করছি সেগুলির একটি উপায় সমস্ত "নতুন" কলগুলি তাদের নিজস্ব পদ্ধতিতে সরিয়ে নিয়েছে, যেমন:

public MyObject createMyObject(args) {
  return new MyObject(args);
}

তারপরে আমার ইউনিট পরীক্ষায়, আমি কেবল এই শ্রেণীর সাবক্লাস করতে পারি এবং তৈরি ফাংশনগুলিকে ওভাররাইড করতে পারি, সুতরাং তারা পরিবর্তে জাল বস্তু তৈরি করতে পারে।

এই একটি ভাল পন্থা? কোন অসুবিধা আছে কি?

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

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


কেন তারা এখন একক পরীক্ষার যোগ্য নয় তা আপনি বিশদ দিয়ে বলতে পারেন?
অস্টিন সালোনেন

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

উত্তর:


13

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

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

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


"একবার আপনি পরীক্ষা করে নিলে আপনি আরও নিখরচায় চুল্লী ব্যবহার করতে পারেন" - এই বিষয়ে কেবলমাত্র একটি মন্তব্য - যদি আপনার পরীক্ষা না হয় তবে আপনি রিফ্যাক্টরিং করছেন না, আপনি কেবল কোডটি পরিবর্তন করছেন।
অক্টোডো

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

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

1
অ্যালবাম, পরীক্ষাগুলি ছাড়াই রিফ্যাক্টর করা সর্বদা বেশি ঝুঁকিপূর্ণ। অটোমেটেড রিফ্যাক্টরিংগুলি নিশ্চিত করে যে ঝুঁকি হ্রাস পেয়েছে তবে শূন্যের কাছে নয়। সবসময় জটিল প্রান্তের কেস রয়েছে যেগুলি সরঞ্জামগুলি সঠিকভাবে পরিচালনা করতে সক্ষম হতে পারে। ভাল ক্ষেত্রে ফলাফলটি থেকে কিছু ত্রুটি বার্তা, তবে সবচেয়ে খারাপ ক্ষেত্রে এটি নিঃশব্দে সূক্ষ্ম বাগগুলি প্রবর্তন করতে পারে। সুতরাং এটি স্বয়ংক্রিয় সরঞ্জাম দ্বারা এমনকি সবচেয়ে সহজ এবং নিরাপদ সম্ভাব্য পরিবর্তনগুলি চালিয়ে যাওয়ার পরামর্শ দেওয়া হচ্ছে।
পিটার তারেক

3

গুইস-লোকেরা ব্যবহারের পরামর্শ দেয়

@Inject
public void setX(.... X x) {
   this.x = x;
}

সমস্ত সংখ্যার পরিবর্তে কেবলমাত্র @ সংজ্ঞাটি তাদের সংজ্ঞাতে যুক্ত করার পরিবর্তে। এটি আপনাকে এগুলি সাধারণ মটরশুটি হিসাবে বিবেচনা করার অনুমতি দেবে, যা আপনি newটেস্ট করার সময় করতে পারেন (এবং বৈশিষ্ট্যগুলিকে ম্যানুয়ালি সেট করে) এবং @ উত্পাদনে ইনজেক্ট করুন।


3

যখন আমি এই ধরণের সমস্যার মুখোমুখি হই তখন আমি আমার ক্লাস-টু-পরীক্ষার প্রতিটি নির্ভরতা সনাক্ত করব এবং একটি সুরক্ষিত কন্সট্রাক্টর তৈরি করব যা আমাকে তাদের মধ্যে পাস করতে দেবে This এটি কার্যকরভাবে প্রতিটিটির জন্য একটি সেটার তৈরির মতো, তবে আমি পছন্দ করি আমার নির্মাতাদের মধ্যে নির্ভরতা ঘোষণা করা যাতে ভবিষ্যতে আমি তাদের ইনস্ট্যান্ট করতে ভুলি না।

সুতরাং আমার নতুন ইউনিট পরীক্ষামূলক ক্লাসে 2 জন নির্মাতা থাকবে:

public MyClass() { 
  this(new Client1(), new Client2()); 
}

public MyClass(Client1 client1, Client2 client2) { 
  this.client1 = client1; 
  this.client2 = client2; 
}

2

আপনি ইনজেকশনের নির্ভরতা ব্যবহার করতে সক্ষম না হওয়া পর্যন্ত আপনি "গিটার তৈরি করে" আইডিয়ামটি বিবেচনা করতে চাইতে পারেন।

উদাহরণ স্বরূপ,

public class Example {
  private MyObject myObject=null;

  public MyObject getMyObject() {
    if (myObject==null) {
      myObject=new MyObject();
    } 
    return myObject;
  }

  public void setMyObject(MyObject myObject) {
    this.myObject=myObject;
  }

  private void myMethod() {
    if (getMyObject().doSomething()) {
      // Instance automatically created
    }
  }
}

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

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

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


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

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

এটা সিঙ্গলটন কেবল
সিলেটলেটগুলি ও_ও

@ ডারিওইউ আসলে এটি খুব দরিদ্র সিঙ্গলটন। আরও কার্যকর বাস্তবায়ন জোশ ব্লচের মত একটি এনাম ব্যবহার করবে। সিঙ্গলেটগুলি একটি বৈধ ডিজাইনের প্যাটার্ন এবং এর ব্যবহার রয়েছে (ব্যয়বহুল ওয়ান-অফ ক্রিয়েশন ইত্যাদি)।
গ্যারি রোয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.