বিজ্ঞপ্তি নির্ভরতা কীভাবে সমাধান করবেন?


33

আমার তিনটি ক্লাস রয়েছে যা একে অপরের সাথে বিজ্ঞপ্তিযুক্ত:

টেস্টএকসিকিউটার টেস্টসেনারিওর অনুরোধগুলি কার্যকর করে এবং প্রতিবেদন ফাইলটি জেনারেটর ক্লাস ব্যবহার করে সংরক্ষণ করে। তাই:

  • প্রতিবেদন উত্পন্ন করতে টেস্টএক্সেকিউটার নির্ভর করে রিপোর্টিজেনেটরের উপর
  • রিপোর্টজেনারেটর টেস্টসেনারিও এবং টেস্টেক্সেকিউটার থেকে সেট করা পরামিতিগুলির উপর নির্ভর করে।
  • টেস্টসেনারিও টেস্টএক্সেকটারের উপর নির্ভর করে।

কীভাবে এর নির্ভরতাগুলি সরিয়ে ফেলা যায় তা অনুমান করতে পারছি না।

public class TestExecuter {

  ReportGenerator reportGenerator;  

  public void getReportGenerator() {
     reportGenerator = ReportGenerator.getInstance();
     reportGenerator.setParams(this.params);
     /* this.params several parameters from TestExecuter class example this.owner */
  }

  public void setTestScenario (TestScenario  ts) {
     reportGenerator.setTestScenario(ts); 
  }

  public void saveReport() {
     reportGenerator.saveReport();    
  }

  public void executeRequest() {
    /* do things */
  }
}
public class ReportGenerator{
    public static ReportGenerator getInstance(){}
    public void setParams(String params){}
    public void setTestScenario (TestScenario ts){}
    public void saveReport(){}
}
public class TestScenario {

    TestExecuter testExecuter;

    public TestScenario(TestExecuter te) {
        this.testExecuter=te;
    }

    public void execute() {
        testExecuter.executeRequest();
    }
}
public class Main {
    public static void main(String [] args) {
      TestExecuter te = new TestExecuter();
      TestScenario ts = new TestScenario(te);

      ts.execute();
      te.getReportGenerator();
      te.setTestScenario(ts);
      te.saveReport()
    }
}

সম্পাদনা: উত্তরের উত্তরে আমার টেস্টসেনারিও ক্লাস সম্পর্কে আরও বিশদ:

public class TestScenario {
    private LinkedList<Test> testList;
    TestExecuter testExecuter;

    public TestScenario(TestExecuter te) {
        this.testExecuter=te;
    }

    public void execute() {
        for (Test test: testList) {
            testExecuter.executeRequest(test); 
        }
    }
}

public class Test {
  private String testName;
  private String testResult;
}

public class ReportData {
/*shall have all information of the TestScenario including the list of Test */
    }

দুটি পরীক্ষা থাকা দৃশ্যের ক্ষেত্রে তৈরি হওয়া এক্সএমএল ফাইলের একটি উদাহরণ:

<testScenario name="scenario1">
   <test name="test1">
     <result>false</result>
   </test>
   <test name="test1">
     <result>true</result>
   </test>
</testScenario >

আগের জিনিসগুলির জন্য আপনার কী (অবজেক্ট) প্রয়োজন তা জিজ্ঞাসা করে আপনার জিনিসগুলি পিছনে যেতে শনাক্ত করার চেষ্টা করুন - উদাহরণস্বরূপ:File(filename).write(Report); Report = XMLResult(ResultData).toString(); ResultData = TestSuite(SingleTestLogic).execute(TestDataIterator(TestDetailsList))
কাঁপুন

উত্তর:


35

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

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

সুতরাং পরীক্ষার পরিস্থিতি থেকে রিপোর্ট জেনারেটরের ডেটা দখল না করার পরিবর্তে কিছু মান অবজেক্ট ব্যবহার করে স্পষ্টভাবে ডেটা পাস করুন। তার মানে, প্রতিস্থাপন

   reportGenerator.setTestScenario(ts); 

কিছু কোড দ্বারা

reportGenerator.insertDataToDisplay(ts.getReportData()); 

পদ্ধতিটিতে getReportDataরিটার্নের ধরণের মতো হওয়া দরকার ReportData, একটি মান অবজেক্ট যা রিপোর্টে প্রদর্শিত হওয়ার জন্য ডেটা ধারক হিসাবে কাজ করে। insertDataToDisplayহ'ল এমন একটি পদ্ধতি যা হ'ল ধরণের অবজেক্টের প্রত্যাশা করে।

এইভাবে, ReportGeneratorএবং TestScenarioউভয়ই নির্ভর করবে ReportData, যা অন্য কোনও কিছুর উপর নির্ভর করে না এবং প্রথম দুটি শ্রেণি একে অপরের উপর আর নির্ভর করে না।

দ্বিতীয় পদ্ধতির হিসাবে: এসআরপি লঙ্ঘন সমাধানের TestScenarioজন্য একটি পরীক্ষার মৃত্যুদণ্ড কার্যকর করার ফলাফলকে দায়ী করার জন্য দায়বদ্ধ হতে হবে, তবে পরীক্ষা নির্বাহককে কল করার জন্য নয়। কোডটি পুনর্গঠিত করার বিষয়টি বিবেচনা করুন যাতে পরীক্ষার দৃশ্য পরীক্ষা এক্সিকিউটারকে অ্যাক্সেস করে না, তবে পরীক্ষার নির্বাহক বাইরে থেকে শুরু করে ফলাফলটিকে TestScenarioবস্তুটিতে আবার লেখেন । উদাহরণস্বরূপ আপনি আমাদের দেখিয়েছেন, এটি জনসাধারণের LinkedList<Test>অভ্যন্তরে অ্যাক্সেস তৈরি করার মাধ্যমে এবং পদ্ধতিটি অন্য কোথাও থেকে সম্ভবত সরাসরি এ , সম্ভবত একটি নতুন শ্রেণিতে TestScenarioস্থানান্তরিত করে সম্ভব হবে ।executeTestScenarioTestExecuterTestScenarioExecuter

এই ভাবে, TestExecuterউপর নির্ভর করবে TestScenarioএবং ReportGenerator, ReportGeneratorউপর নির্ভর করবে TestScenario, খুব, কিন্তু TestScenarioঅন্য কিছুই উপর নির্ভর করবে।

এবং অবশেষে, একটি তৃতীয় পদ্ধতির: TestExecuterখুব বেশি দায়িত্বও রয়েছে। এটা তোলে পরীক্ষার নির্বাহ জন্য সেইসাথে একটি প্রদানের জন্য দায়ী TestScenarioএকটি থেকে ReportGenerator। এই দুটি দায়িত্ব দুটি পৃথক শ্রেণিতে রাখুন এবং আপনার চক্রীয় নির্ভরতা আবার অদৃশ্য হয়ে যাবে।

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


আপনার উত্তরের জন্য ধন্যবাদ, আসলে আমার প্রতিবেদনটি শেষে আমার প্রতিবেদন তৈরি করতে সক্ষম হতে টেস্টসেনারিয়োতে ​​সমস্ত তথ্য প্রয়োজন :(
সাব্রিনা2020

@ সাব্রিনা ২০২০: এবং আপনাকে এই সমস্ত তথ্য ReportData? োকাতে বাধা কী ? আপনি আপনার প্রশ্নটি সম্পাদনা করতে এবং ভিতরে কী ঘটে তার কিছুটা বিশদ ব্যাখ্যা করার জন্য বিবেচনা করতে পারেন saveReport
ডক ব্রাউন

আসলে আমার টেস্টসেনারিওতে টেস্টের একটি তালিকা রয়েছে এবং আমি একটি রিপোর্ট এক্সএমএল ফাইলে সমস্ত তথ্য চাই তাই রিপোর্টডাটাতে এই সমস্ত কিছু থাকা উচিত, আমি আরও তথ্যের জন্য আমার উত্তরটি সম্পাদনা করব, ধন্যবাদ!
sabrina2020

1
+1 টি: আপনি আমার দিকে ছিল interfaces
জোয়েল ইথারটন

@ সাব্রিনা ২০২০: আমি আমার উত্তরে দুটি পৃথক পন্থা যুক্ত করেছি, যেটি আপনার প্রয়োজন অনুসারে সবচেয়ে উপযুক্ত তা চয়ন করুন।
ডক ব্রাউন

8

ইন্টারফেস ব্যবহার করে আপনি বিজ্ঞপ্তি নির্ভরতা সমাধান করতে পারেন।

বর্তমান নকশা:

এখানে চিত্র বর্ণনা লিখুন

প্রস্তাবিত নকশা:

এখানে চিত্র বর্ণনা লিখুন

প্রস্তাবিত নকশায় কংক্রিট ক্লাসগুলি অন্যান্য কংক্রিট শ্রেণীর উপর নির্ভর করে না তবে কেবল বিমূর্ততা (ইন্টারফেস) এর উপর নির্ভর করে।

গুরুত্বপূর্ণ:

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


3

যেহেতু TestExecutorকেবলমাত্র ReportGeneratorঅভ্যন্তরীণভাবে ব্যবহার করে, আপনার এটির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করতে এবং ইন্টারফেসটি ইন্টারফেসে উল্লেখ করা উচিত TestScenario। তারপরে TestExecutorনির্ভর করে ReportGenerator, ReportGeneratorনির্ভর করে TestScenarioএবং TestScenarioনির্ভর করে ITestExecutor, যা কোনও কিছুর উপর নির্ভর করে না।

আদর্শভাবে আপনি আপনার সমস্ত শ্রেণীর জন্য ইন্টারফেসগুলি সংজ্ঞায়িত করতে এবং সেগুলির মাধ্যমে নির্ভরতা প্রকাশ করতে চাইছেন তবে এটি সবচেয়ে ক্ষুদ্রতম পরিবর্তন যা আপনার সমস্যার সমাধান করবে।

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