টিডিডি পদ্ধতিটি কি টপ-ডাউন প্রয়োগ করা যেতে পারে?


13

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

assert mergesort([]) === []

এবং পরীক্ষা ব্যর্থ হয়

নামের ত্রুটি: নাম 'মার্জোর্ট' সংজ্ঞায়িত করা হয়নি

আমি তারপর যোগ

def mergesort(a):
    return []

এবং আমার পরীক্ষা পাস। পরবর্তী আমি যোগ করুন

assert mergesort[5] == 5

এবং আমার পরীক্ষা ব্যর্থ হয়

AssertionError

যা দিয়ে আমি পাস করি

def mergesort(a):
    if not a:
        return []
    else:
        return a

এর পরে, আমি যুক্ত করি

assert mergesort([10, 30, 20]) == [10, 20, 30]

এবং আমাকে এখন এই পাসটি করার চেষ্টা করতে হবে। আমি একীভূত অ্যালগরিদমটি "জানি" তাই আমি লিখি:

def mergesort(a):
    if not a:
        return []
    else:
        left, right = a[:len(a)//2], a[len(a)//2:]
        return merge(mergesort(left)), mergesort(right))

এবং এই সঙ্গে ব্যর্থ

নামের ত্রুটি: নাম 'মার্জ' সংজ্ঞায়িত করা হয়নি

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

দেখে মনে হচ্ছে যে আমি নিম্নলিখিত তিনটি কুরুচিপূর্ণ দৃশ্যের সাথে আটকে আছি এবং জানতে চাই (1) এর মধ্যে কোনটি টিডিডি সম্প্রদায় পছন্দ করে, বা (2) আমি যে অন্য কোনও পদ্ধতির অনুপস্থিত রয়েছি? আমি বেশ কয়েকটি চাচা বব টিডিডি ওয়াকথ্রু দেখেছি এবং এর আগে এরকম কেস দেখে মনে নেই!

এখানে 3 টি মামলা রয়েছে:

  1. একটি পৃথক ডিরেক্টরি স্যুইটের সাথে আলাদা ডিরেক্টরিতে মার্জটি প্রয়োগ করুন।
  2. সহায়ক ফাংশনটি বিকাশকালে সবুজ হওয়ার বিষয়ে চিন্তা করবেন না, আপনি কোন পরীক্ষাগুলি সত্যিই পাস করতে চান তা নিজেই ট্র্যাক করুন ।
  3. মন্তব্য করুন (GASP!) বা mergesortসেই কলের লাইনগুলি মুছুন merge; তারপরে mergeকাজ করার পরে এগুলি আবার রেখে দিন।

এগুলি আমার কাছে নির্বোধ দেখাচ্ছে (বা আমি কি এই ভুলটির দিকে তাকিয়ে আছি?) কেউ কি পছন্দসই পদ্ধতি জানেন?


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

1
... পরবর্তী ইউনিট পরীক্ষাগুলি ধীরে ধীরে এ এর ​​প্রকৃত যান্ত্রিকগুলির গভীরতর গভীরতা আবিষ্কার করবে mergesort। আপনি যদি এটি করার জন্য "সঠিক" উপায়টি সন্ধান করেন, তবে mergesortএকক সিরিজের একক সিরিজে আপনার অ্যালগরিদমের ম্যাপিং সম্পর্কে সঠিক হওয়া ছাড়া অন্যটি নেই ; অর্থাত্ তাদের mergesortপ্রকৃতপক্ষে যা ঘটে তা প্রতিফলিত করা উচিত ।
রবার্ট হার্ভে

4
ডিজাইন একক ইউনিট পরীক্ষা থেকে নিজেকে বৃদ্ধি না; যদি আপনি mergesortলাল-সবুজ-চুল্লী থেকে প্রাকৃতিকভাবে কোনও নকশার উত্থানের প্রত্যাশা করে থাকেন তবে আপনার বিদ্যমান জ্ঞানের উপর ভিত্তি করে প্রক্রিয়াটি পরিচালনা না করা পর্যন্ত তা ঘটবে না mergesort
রবার্ট হার্ভে


1
টিডিডিতে mergeঅবশ্যই "রিফ্যাক্টরিং" পর্যায়ে উদ্ভাবন করতে হবে। আপনি যদি mergeপরীক্ষাটি পাশ করার জন্য সেই পদ্ধতিটি চালু করতে পারেন তবে mergesortপ্রথমে আপনার পরীক্ষাগুলি বিনা mergeপদ্ধতিতে পাস করুন । তারপরে mergeপদ্ধতিটি প্রবর্তন করে আপনার বাস্তবায়নটিকে রিফ্যাক্টর করুন ।
Fabio

উত্তর:


13

আপনার বিকল্পগুলি দেখার জন্য এখানে কিছু বিকল্প উপায় রয়েছে। তবে প্রথমে, টিডিডির নিয়মগুলি, আঙ্কেল বব থেকে আমার জোর দিয়ে:

  1. ব্যর্থ ইউনিট পরীক্ষার পাস করা না হলে আপনাকে কোনও প্রোডাকশন কোড লেখার অনুমতি নেই।
  2. ব্যর্থ হওয়ার পক্ষে পর্যাপ্ত পরিমাণের চেয়ে আপনাকে কোনও ইউনিট পরীক্ষার আর কোনও লেখার অনুমতি নেই; এবং সংকলন ব্যর্থতা ব্যর্থতা।
  3. একটি ব্যর্থ ইউনিট পরীক্ষায় পাস করার জন্য পর্যাপ্ত পরিমাণের চেয়ে আপনাকে আর কোনও প্রোডাকশন কোড লেখার অনুমতি নেই ।

সুতরাং, নিয়ম 3 নম্বরটি পড়ার একটি উপায় হ'ল mergeপরীক্ষায় উত্তীর্ণ হওয়ার জন্য আপনার ফাংশনটি প্রয়োজন , যাতে আপনি এটি প্রয়োগ করতে পারেন - তবে কেবল এটির সবচেয়ে বেসিক আকারে।

অথবা, পর্যায়ক্রমে, আপনি মার্জ অপারেশন ইনলাইন লিখে শুরু করে, এবং তারপরে এটি পরীক্ষার কাজ পাওয়ার পরে কোনও ফাংশনে রিফ্যাক্টর করে out

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


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

@ রায়টয়াল - আমি mergeবাছাই করার আগে পুরোপুরি অপারেশনটি পরীক্ষা করার পদ্ধতির দিকে ঝুঁকির পাশাপাশি ( partitionঅপারেশনের পৃথক পরীক্ষার পাশাপাশি )। আমি মনে করি যে দাবি করা বেনিফিটগুলির উত্থানকারী ডিজাইনটি ধীরে ধীরে একটি পরিচিত লক্ষের দিকে কাজ করে আসে। সংযুক্তির ক্ষেত্রে, আমি মনে করি না যে লক্ষ্যটি সাধারণভাবে বাছাই করা হচ্ছে (কারণ তারপরে আপনি বুদ্বুদ সাজানোর কাজটি শেষ করবেন)। আপনি বেসিক অপারেশনগুলি জানেন, তাই আপনি সেই অপারেশনগুলির দিকে কাজ করেন; বাছাই বেশিরভাগই একটি চিন্তাভাবনা।
kdgregory

1
একটি বিকল্প আছে। mergeফাংশনটি পাস করুন mergesortএবং এর আচরণকে বিদ্রূপ করুন। তারপরে ফিরে যান এবং mergeপ্রথমে পরীক্ষার প্রয়োগ করুন । প্রতিনিধিরা দুর্দান্ত ™
রাবারডাক

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