উপহাস কংক্রিট বর্গ - প্রস্তাবিত নয়


11

আমি স্রেফ "গ্রোয়িং অবজেক্ট-ওরিয়েন্টেড সফ্টওয়্যার" বইয়ের একটি অংশ পড়েছি যা কংক্রিটের ক্লাসকে বিদ্রূপ করার জন্য কেন কিছু কারণ ব্যাখ্যা করে না।

এখানে সংগীত কেন্দ্রের শ্রেণীর জন্য ইউনিট-পরীক্ষার কয়েকটি নমুনা কোড:

public class MusicCentreTest {
  @Test public void startsCdPlayerAtTimeRequested() {
    final MutableTime scheduledTime = new MutableTime();
    CdPlayer player = new CdPlayer() { 
      @Override 
      public void scheduleToStartAt(Time startTime) {
        scheduledTime.set(startTime);
      }
    }

    MusicCentre centre = new MusicCentre(player);
    centre.startMediaAt(LATER);

    assertEquals(LATER, scheduledTime.get());
  }
}

এবং তার প্রথম ব্যাখ্যা:

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

তিনি যখন বলেছিলেন তখন তার ঠিক কী অর্থ আমি বুঝতে পারি না:

এটি এই সম্পর্কটিকে সমর্থন করে যে পরিষেবাটি অন্য কোথাও প্রাসঙ্গিক হতে পারে তা দেখার পক্ষে এটি আরও কঠিন করে তোলে এবং পরের বার যখন ক্লাসের সাথে কাজ করবেন তখন আমাকে আবার বিশ্লেষণ করতে হবে।

আমি বুঝতে পারি যে পরিষেবাটি কল করা MusicCentreপদ্ধতির সাথে সম্পর্কিত startMediaAt

তিনি "অন্য কোথাও" বলতে কী বোঝায়?

সম্পূর্ণ উদ্ধৃতিটি এখানে: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html


তার ব্লগে একটি মন্তব্য যুক্ত করা হয়েছে, কারণ এই উদ্ধৃতিগুলি থেকে তিনি কী বোঝাতে চেয়েছিলেন তা বুঝতে পেরে আমি অক্ষম।
অলিগোফ্রেন

@ অলিগোফ্রেন এটি সত্যিই দুর্দান্ত এক রহস্য :) ...
মিক 378

উত্তর:


6

সদস্যের ক্লাসগুলির ব্যবহারের বিষয়ে ইন্টারফেসের ব্যবহারকে এই পোস্টটির লেখক প্রচার করছেন।

It turns out that my MusicCentre object only uses the starting and stopping methods on the CdPlayer, the rest are used by some other part of the system. I'm over-specifying my MediaCentre by requiring it to talk to a CdPlayer, what it actually needs is a ScheduledDevice.

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

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

আপনি যখন সম্ভাব্য সমস্ত কার্যকারিতাটি বিস্ফোরিত করবেন তখন দাবিটি আরও অর্থবোধ করতে শুরু করে:

  • শুরু
  • স্টপ
  • বিরতি
  • নথি
  • এলোমেলো প্লে অর্ডার
  • নমুনা ট্র্যাক, গানের শুরু
  • নমুনা ট্র্যাক, গানের এলোমেলো নমুনা
  • মিডিয়া তথ্য সরবরাহ
  • ...

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

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


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

@ মিক ৩7878 - হ্যাঁ, আমি যা পেয়েছিলাম ঠিক তেমনই আমি এটিকে অন্যভাবে উচ্চারণ করেছি। এবং আমি আরও উত্তর পরিষ্কার করতে আমার উত্তর আপডেট।

তবে আমি "চলমান ইউনিট পরীক্ষা" শব্দটি বিভ্রান্তিকর বলে মনে করি। এর অর্থ হ'ল মিউজিকেনট্রে তার সহযোগীকে ইউনিট-টেস্ট করতে চলেছে ... যদিও বাস্তবে এটি তার ওবডব্লিউএন পরিষেবাদির ইউনিট-পরীক্ষা করার জন্য তার সহযোগীকে মকস করে। যাইহোক, আমি এখন অর্থটি বুঝতে পারি :)
Mik378

@ মিক ৩7878 - আমরা একই কথা বলছি এবং এটি করার জন্য আমি সম্ভবত সুনির্দিষ্ট পরিভাষার চেয়ে কম ব্যবহার করছি। বিভ্রান্তির জন্য দুঃখিত।

4

এটি এই সম্পর্কটিকে সমর্থন করে যে পরিষেবাটি অন্য কোথাও প্রাসঙ্গিক হতে পারে তা দেখার পক্ষে এটি আরও কঠিন করে তোলে এবং পরের বার যখন ক্লাসের সাথে কাজ করবেন তখন আমাকে আবার বিশ্লেষণ করতে হবে।

এটি সম্পর্কে অনেক চিন্তা করার পরে, আমি এই উদ্ধৃতিটির একটি সম্ভাব্য ব্যাখ্যা পেয়েছি:

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

উপরের নমুনায়, সময় নির্ধারণ পুরো পুরো বৈশিষ্ট্যযুক্ত বস্তুর দ্বারা প্রকাশ করা হয় CDPlayer। সুতরাং, এটি এখনও MusicCentreএবং "সময় নির্ধারণের সত্যতা" এর মধ্যে অন্তর্নিহিত সম্পর্কের দিকে পরিচালিত করে ।

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


আমি মনে করি আপনি এখন এটি পেয়েছেন। দুর্ভাগ্যক্রমে, আমি আপনার মন্তব্যের কোনও বিজ্ঞপ্তি পাইনি।
স্টিভ ফ্রিম্যান

3

আমি যে পরিষেবাটি এখানে বোঝাতে চাইছি তা হ'ল সিডিপ্লেয়ার.সেকুলেড টোস্টার্টএট ()। মিডিয়াসেন্ট্রে এটি কল করে - এটির কাজ করা সহযোগী to মিডিয়াসেন্ট্রে হচ্ছে পরীক্ষার অধীনে থাকা অবজেক্ট।

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

এটা কি সাহায্য করে?


(এই দুর্দান্ত নিবন্ধের লেখক :)) আমি যা ব্যাখ্যা করতে চেয়েছিলাম তা এই বাক্যটি ছিল: "এই সম্পর্কটি সমর্থন করে যে পরিষেবাটি অন্য কোথাও প্রাসঙ্গিক হতে পারে কিনা তা দেখার পক্ষে এটি আরও কঠিন হয়ে যায় এবং পরের বার কাজ করার পরে আমাকে আবার বিশ্লেষণ করতে হবে see ক্লাস সহ "। কি ধরণের বিশ্লেষণ? কোনটি অবজেক্টের পদ্ধতি সনাক্ত করার বিষয়টি যেহেতু এটি পরিষ্কারভাবে লুকানো আছে তাই সম্পর্কের বাস্তবায়ন করার কথা?
মিক 378
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.