টিডিডিতে আমাকে প্রথমে টেস্ট লিখতে হবে নাকি ইন্টারফেসটি প্রথম লিখতে হবে?


23

আমি সিডি ব্যবহার করে টিডিডি শিখছি, যতদূর আমি জানি পরীক্ষার বিকাশ চালানো উচিত , এটি প্রথম পরীক্ষায় পাস করার জন্য খালি ন্যূনতম কোড লেখার পরে একটি ব্যর্থ পরীক্ষা লিখুন তারপরে রিফ্যাক্টরিং করুন।

তবে এটিও বলা হয় যে " প্রোগ্রাম থেকে ইন্টারফেস, বাস্তবায়ন নয় ", তাই প্রথমে একটি ইন্টারফেস লিখুন । এখান থেকেই আমার বিভ্রান্তি শুরু হয়, আমি যদি প্রথমে ইন্টারফেস লিখছি তবে এটি দুটি জিনিস লঙ্ঘন করছে

  1. ইন্টারফেসের জন্য যে কোডটি লেখা হয় তা পরীক্ষার দ্বারা চালিত হয় না

  2. এটি একটি খালি ন্যূনতম নয় স্পষ্টতই আমি এটি একটি সাধারণ বর্গ দিয়ে লিখতে পারি।

ইন্টারফেসের জন্যও পরীক্ষা লিখতে শুরু করা উচিত? কোন বাস্তবায়ন ছাড়াই আমি কি পরীক্ষা করতে যাচ্ছি?

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


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

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

2
টিডিডি বলে, "একটি পরীক্ষা লিখুন যা ব্যর্থ হয়।" কিছু কঠোর টিডিডার বলেছেন যে আপনি পরীক্ষাটি সংকলন করতে না পারলে এটি "ব্যর্থ" হিসাবে গণ্য হয়েছে কারণ এটি যে ধরণের ডেটা টাইপ পরিচালনা করে তা এখনও ঘোষণা করা হয়নি।
সলোমন

উত্তর:


29

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

public class CalculatorTest {
    @Test
    public void testAddTwoIntegers() {
        Calculator calc = new Calculator();
        int result = calc.add(2, 2)
        Assert.assertEquals(4, result);
    }
}

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

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

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


2
+1 " আমি মনে করি না আপনি ইন্টারফেস ডিজাইনকে পরীক্ষার নকশা থেকে আলাদা করতে পারবেন " সাহসী হওয়া উচিত, আইএমএইচও :)
বাইনারি ওয়ারিয়ার

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

আপনি বলেছেন পরীক্ষার পরিবর্তন করার দরকার নেই, তবে new Calculator()বাস্তবায়ন কি ঠিক? যদি কোনও নতুন বাস্তবায়ন প্রয়োজন হয় তবে সম্ভবত আপনি তখন একটি গুণক ক্যালকুলেটরটি করতেন, এবং new AdditionCalculator()এখনও পাস করার জন্য আপনাকে পরীক্ষাটি পরিবর্তন করতে হবে? নাকি আমি কিছু মিস করছি?
স্টিভ চ্যামিলার্ড

3
@ স্টিভচ্যামিলার্ড অবশ্যই, আপনার নকশাটি যদি আপনি ক্লাসের নামটি ক্যালকুলেটর থেকে অ্যাডিশনক্যালকুলেটরে পরিবর্তন করেন তবে পরীক্ষার সাথে মিলতে হবে। অবশ্যই, টিডিডি করে যা ঘটেছিল তা হ'ল আপনি প্রথমে পরীক্ষা পরিবর্তন করবেন এবং ক্লাস পরিবর্তনটি পরীক্ষার পাস করার জন্য অনুসরণ করবে।
এরিক কিং

5

আমরা যখন লিখি তখন আমরা কী করছি interface? আমরা কোড লিখছি, বা আমরা ডিজাইন করছি?

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

আমি ঝাঁকুনি শুরু করার আগে থামব, তবে আশা করি এটি সম্পর্কে আপনার ভাবার পক্ষে একটি সহায়ক উপায়।


4

টিডিডিতে আমাকে প্রথমে টেস্ট লিখতে হবে নাকি ইন্টারফেসটি প্রথম লিখতে হবে?

এটি সমস্ত নির্ভর করে যে আপনি কীভাবে গোঁড়া / ধর্মীয়, টিডিডি করতে চান ।

আমি টিডিডি শিখছি

যেহেতু আপনি শিখছেন, আপনার ব্যক্তিগত কর্মপ্রবাহের জন্য পরীক্ষা করা উচিত, যা আপনার পক্ষে কাজ করে।

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

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

  3. অন্যদিকে, আপনি অন্যভাবে চালিত পরীক্ষার বিকাশ করতে পারেন: পরীক্ষার জন্য আপনার কোডটি ডিজাইন করুন। যার অর্থ, আপনি কোড লেখেন, যা পরীক্ষা করা সহজ - যদিও আপনি পরে পরীক্ষাগুলি লেখেন । আপনি টেস্টগুলি আগে বা তার পরে লিখেন কিনা তা বিবেচ্য নয়, যতক্ষণ আপনি যেকোনভাবে পরীক্ষা করেন।


5
শেষ পয়েন্টটির সাথে একমত হতে পারে না "আপনি পরীক্ষা করে আগে বা তারপরে লেখেন তাতে কিছু আসে যায় না, যতক্ষণ আপনি যেভাবে পরীক্ষা করে যান"। পরে যদি আপনি পরীক্ষাটি লিখতে চান তবে আপনি পরীক্ষাটি সঠিক জিনিসটি পরীক্ষা করছেন কিনা তা নিশ্চিত হতে পারবেন না।
ভিন

4
যেমনটি আমি বলেছি ... এটি নির্ভর করে আপনি কীভাবে গোঁড়া ... ...
টমাস জাঙ্ক

2

টিডিডি বা বিডিডি অর্থ আপনার ডোমেন ইন্টারফেসগুলি প্রথমে করা এবং তারপরে আমার ব্যাখ্যায় তাদের বিরুদ্ধে পরীক্ষা লেখার অর্থ would একটি ইন্টারফেসের বাস্তবায়নের একটি প্রত্যাশিত আচরণ থাকে।

কোডের আগে এটি এখনও পরীক্ষা করা হয় কারণ কোনও ইন্টারফেসে কোনও পরীক্ষণযোগ্য যুক্তি থাকে না এটি এটি এমন কাঠামো যা আপনি বিপরীতে একটি পরীক্ষা লেখেন।

আমি নীচে এটি করতে হবে

  1. সেমি ফর্মাল আচরণ লিখুন (প্রদত্ত: কখন: তখন :)

  2. ইন্টারফেসটি লিখুন (আচরণের encapsulating পদ্ধতি হোস্ট করতে)

  3. এটি সনাক্তকারী পরীক্ষাটি লিখুন (প্রদত্ত ইনপুট করুন, কখন কল করুন, তারপরে পরীক্ষা করুন)

  4. পরীক্ষায় উত্তীর্ণ হওয়ার জন্য কংক্রিট (শ্রেণি যা ইন্টারফেস প্রয়োগ করে) লিখুন / পরিবর্তন করুন


0

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

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


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

@gnat আমি বিশ্বাস করি যে এখানে নিসাম সি # interfaceকীওয়ার্ডকে উল্লেখ করছে , সাধারণ শব্দ "ইন্টারফেস" নয়।
রাবারডাক

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

যথেষ্ট পরিমাণে @gnat যা আপনার মন্তব্য থেকে পরিষ্কার ছিল না। ব্যক্তিগতভাবে, আমি এখানে নিসামের সাথে একমত। আমি দেখতে পাচ্ছি যে একেবারে ডিজাইনের অজুহাত হিসাবে টিডিডি ব্যবহার করা লোকদের থামায়। YMMV।
রাবারডাক

-2

প্রকল্পের সাথে তাদের অন্তর্ভুক্তি যতক্ষণ না ইন্টারফেস / কোড / পরীক্ষা একই সময়ে লিখতে ঠিক আছে।

আপনার বস টিডিডি সম্পর্কে ধার্মিক না হলে, সেই ক্ষেত্রে আপনাকে সম্ভবত খালি ইন্টারফেস -> পরীক্ষা -> ন্যূনতম কোড (অর্থহীন পদক্ষেপ) -> আরও পরীক্ষা -> আরও অর্থহীন কোড -> আরও পরীক্ষার -> অবশেষে আসল কোডটি লিখতে হবে - > সম্পন্ন

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