চুক্তি ভিত্তিক প্রোগ্রামিং বনাম ইউনিট পরীক্ষা


13

আমি কিছুটা প্রতিরক্ষামূলক প্রোগ্রামার এবং মাইক্রোসফ্টস কোড চুক্তির একটি বড় অনুরাগী।

এখন আমি সবসময় সি # ব্যবহার করতে পারি না এবং বেশিরভাগ ভাষায় আমার কাছে কেবলমাত্র সরঞ্জামটি হ'ল দৃser়তা। সুতরাং আমি সাধারণত এই জাতীয় কোড সহ শেষ করি:

class
{       
    function()
    {   
         checkInvariants();
         assert(/* requirement */);

         try
         {
             /* implementation */
         }
         catch(...)
         {
              assert(/* exceptional ensures */);                  
         }
         finally
         {
              assert(/* ensures */);
              checkInvariants();
         }
    }

    void checkInvariants()
    {
         assert(/* invariant */);
    }
}

যাইহোক, এই দৃষ্টান্তটি (বা আপনি যেটিকে যা বলবেন) প্রচুর কোডের ছোটাছুটি করে।

আমি ভাবতে শুরু করেছি যে এটি কি সত্যই প্রচেষ্টাটির পক্ষে মূল্যবান এবং সঠিক ইউনিট পরীক্ষাটি ইতিমধ্যে এটি কভার করবে কিনা?


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

সুতরাং এটি মূলত উন্নয়নের সময়, রক্ষণাবেক্ষণযোগ্যতা, পাঠযোগ্যতা বনাম আরও ভাল কোড কভারেজ?
রোন্যাগ

1
আমি পরামিতিগুলির যথার্থতা (উদাহরণস্বরূপ নালায়) এবং ইউনিট পরীক্ষায় অতিরিক্তভাবে সেই দৃ as়তাগুলি পরীক্ষা করতে কোডটিতে দৃ as়তা ব্যবহার করছি।
আর্টজম

উত্তর:


14

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


2
আমি মনে করি যে শর্তগুলি পূরণ না হলে কোডটি কাজ করে (যেমন এটি একটি ব্যতিক্রম ছোঁড়ে) কিনা তা পরীক্ষা করাও গুরুত্বপূর্ণ ।
সুইভ

6

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

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

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


1

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

চুক্তিগুলি পূর্বশর্তগুলি পূরণ করা হয় তা নিশ্চিত করার জন্য ডিফেন্সিভ প্রোগ্রামিং সম্পর্কে হয়, ডান প্যারামিটার সহ কোড বলা হয় ইত্যাদি etc.

পৃথক পরিস্থিতিগুলিতে কোডটি কাজ করে তা নিশ্চিত করার জন্য ইউনিট পরীক্ষা tests এগুলি 'দাঁতযুক্ত চশমা' এর মতো।

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


0

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

আমি @ ডুরোসের সাথে একমত, এগুলি একচেটিয়া বা প্রতিযোগী পদ্ধতির হিসাবে ভাবা উচিত নয়। আসলে একটি টিডিডি পরিবেশে আপনি এমনকি যুক্তি করতে পারেন যে 'প্রয়োজনীয়তা' অনুসারে পরীক্ষার দরকার হবে :)।

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

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

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

এছাড়াও আমি কৌতূহল জানিনা যে আপনার কোন ভাষা ব্যবহার করে যার কোনওরকম এক্স ইউনাইট বা অন্য টেস্টিং লাইব্রেরি নেই যেটি কেউ বিকাশ করেছে, আমি ভেবেছিলাম আজকালকার কিছুর জন্য বেশ কিছু আছে?


0

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

এটি সর্বদা সহজ বা সম্ভব নয়, তবে নিজেকে এই প্রশ্নটি অবশ্যই জিজ্ঞাসা করা উচিত, "আমি কি এই কোডটিকে আরও বোকা বানিয়ে তুলতে পারি?"

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

তবুও, কেবলমাত্র প্রয়োজনীয় এবং পর্যাপ্ত পরিমাণ গার্ড কোড আমার রিফ্যাক্টরিংয়ের জন্য, আমার অভিজ্ঞতার সাথে আরও ব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য কোডের জন্য তৈরি করে।

এটির বাকি অংশগুলিতে @ ডুরোসের সাথে সম্মত হন।


0

উভয়ই করুন, তবে আপনার উদ্দেশ্যগুলি স্পষ্ট করার জন্য কিছু স্থিতিশীল সহায়ক পদ্ধতি তৈরি করুন। গুগল জাভাতে এটিই করেছিল, কোড.google.com/p/guava-libraries/wiki/PreconditionsExplained দেখুন

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