আপনার কীভাবে ইয়াহটজি গেম টিডিডি করা উচিত?


36

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

  • প্রথমে পরীক্ষা লিখুন
  • কার্যকর যে সহজ কাজ লিখুন
  • পরিমার্জন এবং সংশোধক

সুতরাং প্রাথমিক পরীক্ষাটি এর মতো দেখতে পারে:

public void Returns_true_when_roll_is_full_house()
{
    FullHouseTester sut = new FullHouseTester();
    var actual = sut.IsFullHouse(1, 1, 1, 2, 2);

    Assert.IsTrue(actual);
}

"কার্যকরভাবে কাজ করতে পারে এমন সহজ জিনিসটি লিখুন" অনুসরণ করার পরে, আপনার এখন এই IsFullHouseপদ্ধতিটি লিখতে হবে :

public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
    if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
    {
        return true;
    }

    return false;
}

এটি সবুজ পরীক্ষায় ফলাফল দেয় তবে বাস্তবায়ন অসম্পূর্ণ।

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

আপনি ইউনিট পরীক্ষা কিভাবে এই জাতীয় কিছু হবে?

হালনাগাদ

এরিক এবং কিলিয়ান উল্লেখ করেছেন যে গ্রিন টেস্ট পেতে প্রাথমিক প্রয়োগে আক্ষরিক ব্যবহার করা সেরা ধারণা নাও হতে পারে। আমি কেন এটি করেছি তা ব্যাখ্যা করতে চাই এবং সেই ব্যাখ্যা কোনও মন্তব্যে মানায় না।

ইউনিট পরীক্ষার সাথে আমার ব্যবহারিক অভিজ্ঞতা (বিশেষত একটি টিডিডি পদ্ধতির ব্যবহার) খুব সীমাবদ্ধ। আমার মনে আছে টেকপবে রয় ওশেরভের টিডিডি মাস্টারক্লাসের একটি রেকর্ডিং দেখেছি। একটি পর্বে তিনি একটি স্ট্রিং ক্যালকুলেটর টিডিডি স্টাইল তৈরি করেন। স্ট্রিং ক্যালকুলেটরটির সম্পূর্ণ স্পেসিফিকেশনটি এখানে পাওয়া যাবে: http://osherove.com/tdd-kata-1/

তিনি এইভাবে একটি পরীক্ষা দিয়ে শুরু করেন:

public void Add_with_empty_string_should_return_zero()
{
    StringCalculator sut = new StringCalculator();
    int result = sut.Add("");

    Assert.AreEqual(0, result);
}

Addপদ্ধতির প্রথম প্রয়োগে এটি ফলাফল :

public int Add(string input)
{
    return 0;
}

তারপরে এই পরীক্ষাটি যুক্ত করা হয়:

public void Add_with_one_number_string_should_return_number()
{
    StringCalculator sut = new StringCalculator();
    int result = sut.Add("1");

    Assert.AreEqual(1, result);
}

এবং Addপদ্ধতিটি পুনঃসংশ্লিষ্ট:

public int Add(string input)
{
    if (input.Length == 0)
    {
        return 0;
    }

    return 1;
}

প্রতিটি পদক্ষেপের পরে রায় বলেছেন "সহজ জিনিসটি লিখুন যা কাজ করবে"।

তাই আমি ভেবেছিলাম যে টিডিডি-স্টাইল ইয়াহটজি গেমটি করার চেষ্টা করার সময় আমি এই পদ্ধতির চেষ্টা করব।


8
"কাজ করা সহজতম জিনিসটি লিখুন" আসলে সংক্ষেপণ; সঠিক পরামর্শটি হ'ল "সম্ভাব্যতম সহজ জিনিসটি লিখুন যা পুরোপুরি ব্রিনেডেড নয় এবং স্পষ্টতই ভুল যে কাজ করে"। সুতরাং, না, আপনার লেখা উচিত নয়if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
কার্সন 63000

3
এরিকের উত্তর সংক্ষিপ্ত করার জন্য আপনাকে ধন্যবাদ, এটি কম বিতর্কিত বা সভ্য উপায়ে হোক।
ক্রিস্টফ ক্লেস

1
@ কারসন 000৩০০০ এর মতো "সবচেয়ে সহজ কাজটি লিখুন" আসলে একটি সরলীকরণ। এটি ভাবতে আসলেই বিপজ্জনক; এটি কুখ্যাত সুডোকু টিডিডি পরাজয়ের দিকে পরিচালিত করে (গুগল এটি)। অন্ধভাবে অনুসরণ করা হলে, টিডিডি প্রকৃতপক্ষে ব্রেইনডেড: "অনায়াসে" কাজ করে এমন সবচেয়ে সহজ জিনিস "করে আপনি একটি তুচ্ছ তাত্পর্যপূর্ণ অ্যালগরিদমকে সাধারণ করতে পারবেন না ... আপনাকে আসলে ভাবতে হবে! দুর্ভাগ্যক্রমে, এমনকি এক্সপি এবং টিডিডি-র কথিত মাস্টাররা কখনও কখনও এটি অন্ধভাবে অনুসরণ করে ...
আন্দ্রেস এফ।

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

1
pvv.org/~oma/TDDinC_Yahtzee_27oct2011.pdf আগ্রহী হতে পারে।

উত্তর:


40

এই প্রশ্নের ইতিমধ্যে প্রচুর ভাল উত্তর আছে, এবং আমি তাদের বেশ কয়েকটি মন্তব্য এবং উন্নত করেছি। তবুও, আমি কিছু চিন্তা যুক্ত করতে চাই।

নমনীয়তা novices জন্য নয়

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

  • শিক্ষিত নিয়ম বা পরিকল্পনা কঠোরভাবে মেনে চলা
  • বিচক্ষণ বিচারের কোন অনুশীলন

এটি কোনও ব্যক্তিত্বের ঘাটতির বর্ণনা নয়, সুতরাং এতে লজ্জা পাওয়ার কোনও কারণ নেই - এটি এমন একটি পর্যায়ে যা আমাদের সকলকে নতুন কিছু শেখার জন্য প্রয়োজন।

এটি টিডিডির ক্ষেত্রেও সত্য।

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

যদি কোনও নবজাতক পরামর্শ গ্রহণ করেন যে কখনও কখনও টিডিডি না করা ঠিক হয়, তবে তিনি কীভাবে নির্ধারণ করতে পারবেন যে টিডিডি করা বাদ দেওয়া ঠিক হবে?

কোনও অভিজ্ঞতা বা দিকনির্দেশনা না থাকলে, একজন শিক্ষানবিশরা কেবল যেটি করতে পারে তা হ'ল প্রতিবারই টিডিডি থেকে বেরিয়ে আসা খুব বেশি কঠিন হয়ে যায়। এটি মানুষের স্বভাব, তবে শেখার ভাল উপায় নয়।

পরীক্ষা শুনুন

যেকোন সময় শক্ত হয়ে ওঠার পরে টিডিডি থেকে বেরিয়ে আসা হ'ল টিডিডির অন্যতম গুরুত্বপূর্ণ সুবিধা বাদ দেওয়া। টেস্টগুলি SUT এর API সম্পর্কে প্রাথমিক প্রতিক্রিয়া সরবরাহ করে। পরীক্ষাটি যদি লেখা শক্ত হয় তবে এটি একটি গুরুত্বপূর্ণ লক্ষণ যে এসইউটি ব্যবহার করা শক্ত।

এই কারণেই জিওএসের অন্যতম গুরুত্বপূর্ণ বার্তা হ'ল: আপনার পরীক্ষা শোনো!

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

পূর্ণ সংখ্যার অর্ডার ক্রম হিসাবে API এ ডাইস রোলগুলি উপস্থাপন করতে হবে? আমার কাছে, আদিম আবেশের সেই গন্ধ । সে কারণেই Rollক্লাসের সূচনা করার পরামর্শ দিয়ে আমি উত্তরটি দেখে সন্তুষ্ট হয়েছি । আমি মনে করি এটি একটি দুর্দান্ত পরামর্শ।

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

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

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

একটি পরীক্ষার সহায়তার পরামর্শ অগত্যা এলোমেলোভাবে বোঝায় না - এটি পরীক্ষাটিকে আরও পাঠযোগ্য করে তোলার একমাত্র উপায়।

Rollউদাহরণের ক্ষেত্রে মডেল ইনপুটটির কাছে যাওয়ার আরও একটি উপায় হ'ল একটি পরীক্ষা ডেটা বিল্ডারকে পরিচয় করানো

লাল / সবুজ / রিফ্যাক্টর একটি তিন-পর্যায়ের প্রক্রিয়া

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

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

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

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

আসলেই কী ঘটতে উচিত যে যদি আপনি করতে পারেন সমস্ত পরীক্ষার একটি সঙ্গে পাস হয় স্পষ্টত ভুল বাস্তবায়ন, যে এর প্রতিক্রিয়া যে, আপনি অন্য পরীক্ষা লিখতে হবে

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

রিগার একটি শেখার সরঞ্জাম

যতক্ষণ না কেউ শিখছে ততক্ষণ রেড / গ্রিন / রিফ্যাক্টারের মতো কঠোর প্রক্রিয়াগুলির সাথে লেগে থাকা অনেক অর্থবোধ করে। এটি শিখনকে টিডিডি নিয়ে অভিজ্ঞতা অর্জন করতে বাধ্য করে যখন এটি সহজ তখনই নয়, যখন এটি কঠিন হয়।

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


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

1
ওহ! ধন্যবাদ. "নিয়মগুলির বিষয়ে চিন্তা করবেন না, কেবল যা ভাল মনে হয় তা করুন" বলার জন্য টিডিডিতে (বা কোনও অনুশাসন) শুরুর লোকদের বলার প্রবণতা দেখে আমি সত্যিই ভয় পেয়েছি। যখন আপনার কোনও জ্ঞান বা অভিজ্ঞতা নেই তখন আপনি কীভাবে সেরা অনুভব করতে পারেন? আমি রূপান্তর অগ্রাধিকার নীতিটি উল্লেখ করতে চাই, বা পরীক্ষাগুলি আরও সুনির্দিষ্ট হওয়ার সাথে সাথে কোডটি আরও জেনেরিক হওয়া উচিত। চাচা ববের মতো সবচেয়ে ডাই-হার্ড টিডিডি সমর্থকরা "প্রতিটি পরীক্ষার জন্য কেবল নতুন একটি বিবৃতি যুক্ত করুন" এই ধারণার পিছনে দাঁড়াবেন না।
সারা

41

অস্বীকৃতি হিসাবে, এটি টিডিডি হ'ল আমি অনুশীলন করার সময় এবং কিলিয়ান যথাযথভাবে উল্লেখ করেছেন, আমি যে কেউ পরামর্শ দিয়েছিলাম যে এটি অনুশীলনের একটি সঠিক উপায় আছে। তবে এটি আপনাকে সহায়তা করবে ...

প্রথমত, আপনার পরীক্ষাটি পাস করার জন্য আপনি যে সহজ জিনিসটি করতে পারেন তা হ'ল:

public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
    return true;
}

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

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

public void Returns_true_when_roll_is_full_house()
{
    FullHouseTester sut = new FullHouseTester();
    var actual = sut.IsFullHouse(1, 2, 3, 4, 5);

    Assert.IsFalse(actual);
}

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

public void Returns_true_when_roll_is_full_house()
{
    FullHouseTester sut = new FullHouseTester();
    var actual = sut.IsFullHouse(-1, -2, -3, -4, -5);

    //I dunno - throw exception, return false, etc, whatever you think it should do....
}

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

হালনাগাদ:

আপনার আপডেটের প্রতিক্রিয়া হিসাবে আমি এটি একটি মন্তব্য হিসাবে শুরু করেছি, তবে এটি বেশ দীর্ঘ হতে শুরু করেছে ...

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

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

সুতরাং, আমি যদি এই ধারণাটি দিয়েছিলাম যে আক্ষরিকের অস্তিত্বই সমস্যা ছিল - তবে তা নয়। আমি বলতে চাই যে 5 টি দফা সহ শর্তাধীন জটিলতা সমস্যা আপনার প্রথম লাল থেকে সবুজ কেবল "সত্যিকারের প্রত্যাবর্তন" হতে পারে কারণ এটি সত্যই সহজ (এবং কৌতূহলযুক্ত) t পরবর্তী পরীক্ষার ক্ষেত্রে (1, 2, 3, 4, 5) এর সাথে মিথ্যা ফিরতে হবে এবং আপনি এখানেই "অবসেস" রেখে যেতে শুরু করেন। নিজেকে জিজ্ঞাসা করতে হবে "কেন (1, 1, 1, 2, 2) একটি পূর্ণ ঘর এবং (1, 2, 3, 4, 5) কেন নয়?" আপনি যে সহজ জিনিসটি নিয়ে আসতে পারেন তা হতে পারে যে একটির শেষ সিকোয়েন্স এলিমেন্ট 5 বা দ্বিতীয় সিকোয়েন্স উপাদান 2 রয়েছে এবং অন্যটিতে নেই। এগুলি সহজ, তবে সেগুলিও (অযথা) অবক্ষয়। আপনি আসলে যা চালনা করতে চান তা হ'ল "তাদের একই সংখ্যার সংখ্যা কত?" সুতরাং আপনি পুনরাবৃত্তি আছে কিনা তা পরীক্ষা করে দ্বিতীয় পরীক্ষায় উত্তীর্ণ হতে পারেন। পুনরাবৃত্তি সহ একটিতে আপনার একটি পুরো ঘর আছে এবং অন্যটিতে আপনি নেই। এখন পরীক্ষাটি পাস হয়ে গেছে এবং আপনি আবার একটি পরীক্ষার কেস লিখেছেন যার পুনরাবৃত্তি রয়েছে তবে আপনার অ্যালগরিদমকে আরও পরিমার্জন করার জন্য একটি সম্পূর্ণ বাড়ি নয়।

আপনি যেতে যেতে আক্ষরিক সাথে এটি করতে বা নাও করতে পারেন এবং আপনি যদি করেন তবে তা ঠিক আছে। আপনি আরও কেস যোগ করার সাথে সাথে সাধারণ ধারণাটি আপনার অ্যালগরিদমকে 'জৈবিকভাবে' বাড়ছে।


আমি কেন আক্ষরিক পদ্ধতির সাথে শুরু করেছি সে সম্পর্কে আরও কিছু তথ্য যুক্ত করতে আমার প্রশ্ন আপডেট করেছি।
ক্রিস্টফ ক্লেস

9
এটি একটি দুর্দান্ত উত্তর।
লম্বা

1
আপনার চিন্তাশীল এবং সুস্পষ্টভাবে উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। এটি আসলে এখন অনেক অর্থবোধ করে যে আমি এটি সম্পর্কে চিন্তা করি।
ক্রিস্টফ ক্লেস

1
পুরো পরীক্ষার অর্থ প্রতিটি সংমিশ্রণ পরীক্ষা করা হয় না ... এটি নির্বোধ। এই বিশেষ ক্ষেত্রে, একটি নির্দিষ্ট পূর্ণ ঘর বা দুটি এবং কিছু না খালি পূর্ণ ঘর নিন। এছাড়াও কোনও বিশেষ সংমিশ্রণ যা সমস্যা সৃষ্টি করতে পারে (যেমন, এক ধরণের 5 টি)।
শ্লেইস

3
+1 এই উত্তরের পিছনে মূলনীতিগুলি রবার্ট সি মার্টিনের রূপান্তর অগ্রাধিকারের ক্লিনকোডার.পোস্টারস ডটকম
মার্ক

5

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

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


5

এরিকের উত্তর দুর্দান্ত, তবে আমি ভেবেছিলাম পরীক্ষার লেখার কোনও কৌশল ভাগ করে নিতে পারি।

এই পরীক্ষা দিয়ে শুরু করুন:

[Test]
public void FullHouseReturnsTrue()
{
    var pairNum = AnyDiceValue();
    var trioNum = AnyDiceValue();

    Assert.That(sut.IsFullHouse(trioNum, pairNum, trioNum, pairNum, trioNum));
}

এই পরীক্ষাটি আরও ভাল হয় যদি আপনি Roll5 টি প্যারাম পাস করার পরিবর্তে কোনও ক্লাস তৈরি করেন :

[Test]
public void FullHouseReturnsTrue()
{
    var roll = AnyFullHouse();

    Assert.That(sut.IsFullHouse(roll));
}

এটি এই বাস্তবায়ন দেয়:

public bool IsFullHouse(Roll toCheck)
{
    return true;
}

তারপরে এই পরীক্ষাটি লিখুন:

[Test]
public void StraightReturnsFalse()
{
    var roll = AnyStraight();

    Assert.That(sut.IsFullHouse(roll), Is.False);
}

একবার এটি পাস হয়ে গেলে, এটি লিখুন:

[Test]
public void ThreeOfAKindReturnsFalse()
{
    var roll = AnyStraight();

    Assert.That(sut.IsFullHouse(roll), Is.False);
}

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

স্পষ্টতই, আপনার মানদণ্ডের সাথে মিলিত এলোমেলো রোলগুলি ফিরিয়ে আনার জন্য আপনার যে কোনও পদ্ধতি প্রয়োগ করুন।

এই পদ্ধতির কয়েকটি সুবিধা রয়েছে:

  • আপনাকে কোনও পরীক্ষা লেখার দরকার নেই যার একমাত্র উদ্দেশ্য আপনাকে নির্দিষ্ট মানগুলিতে আটকে যাওয়া থেকে বিরত রাখা
  • পরীক্ষাগুলি আপনার অভিপ্রায়টিকে সত্যিই সুন্দরভাবে যোগাযোগ করে (প্রথম পরীক্ষার কোডটি "কোনও পুরো বাড়ির সত্য ফিরে আসে" বলে চিৎকার করে)
  • এটি আপনাকে সমস্যার মাংসে কাজ করার জায়গায় পৌঁছে দেয়
  • কখনও কখনও এটি এমন কেসগুলি লক্ষ্য করে যা আপনি ভাবেননি

আপনি যদি এই পদ্ধতির ব্যবহার করেন তবে আপনার অ্যাসেটে আপনার লগ বার্তাগুলি উন্নত করতে হবে hat এই বিবৃতিতে। কোন ইনপুট ব্যর্থতার কারণ ঘটেছে তা বিকাশকারীকে দেখতে হবে।
ব্রিঞ্জার 128

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

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

যেকোনফুলহাউস একটি পরীক্ষার ক্ষেত্রে "সহায়ক" পদ্ধতি। যদি তারা সাধারণ হয় তবে সাহায্যকারী পদ্ধতিগুলিও পরীক্ষা করে নেওয়া হয়!
মার্ক হারড

করা উচিত IsFullHouseসত্যিই আসতে trueযদি pairNum == trioNum ?
recursion.ninja

2

এটি পরীক্ষা করার সময় আমি দুটি প্রধান উপায় বিবেচনা করতে পারি;

  1. বৈধ পূর্ণ-গৃহের সেটগুলির "কিছু" আরও পরীক্ষার কেস (~ 5) যুক্ত করুন, এবং একই পরিমাণের প্রত্যাশিত ফলস ({1, 1, 2, 3, 3 a) একটি ভাল। মনে রাখবেন যে উদাহরণস্বরূপ 5 টি হতে পারে একটি ভুল বাস্তবায়ন দ্বারা "একই সংখ্যার 3 জুটির হিসাবে স্বীকৃত)। এই পদ্ধতিটি ধরে নিয়েছে যে বিকাশকারী কেবল পরীক্ষাগুলি পাশ করার চেষ্টা করছেন না, তবে বাস্তবে এটি সঠিকভাবে প্রয়োগ করেছেন।

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

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


মিলিয়ন ডলারের প্রশ্ন হল, আপনি খাঁটি টিডিডি ব্যবহার করে ইয়াহটজি এআই পেয়েছেন? আমার বাজি হ'ল আপনি পারবেন না; আপনি আছে , ডোমেন জ্ঞান ব্যবহার করতে যা সংজ্ঞা দ্বারা অন্ধ নয় :)
আন্দ্রেজ এফ

হ্যাঁ, আমি অনুমান করি আপনি ঠিক বলেছেন। এটি টিডিডি-র একটি সাধারণ সমস্যা, আপনি কেবল অপ্রত্যাশিত ক্র্যাশ এবং অপরিশোধিত ব্যতিক্রমগুলির জন্য পরীক্ষা করতে না চাইলে পরীক্ষার ক্ষেত্রে প্রত্যাশিত আউটপুট প্রয়োজন need
আনসজব

0

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

আপনার 200 টি পৃথক যুক্তি পরীক্ষা দরকার নেই। আপনি উদাহরণস্বরূপ একটি সেট ব্যবহার করতে পারেন। প্রায় কোনও প্রোগ্রামিং ভাষার একটি অন্তর্নির্মিত থাকে:

Set set;
set.add(a);
set.add(b);
set.add(c);
set.add(d);
set.add(e);

if(set.size() == 2) { // means we *must* be of the form AAAAB or AAABB.
    if(a==b==c==d) // eliminate AAAAB
        return false;
    else
        return true;
}
return false;

এবং যদি আপনি এমন কোনও ইনপুট পান যা বৈধ ইয়াহটজি রোল নয়, আপনার আগামীকাল নেই বলে ফেলে দেওয়া উচিত।

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