আমি কি আজও ডিবাগ.আসার্ট ব্যবহার করব?


23

আমি সম্প্রতি কিছু নতুন লিখিত কোড পেয়েছি যা প্রচুর ডিবাগ.অ্যাসার্ট (সি #) এর সাথে ছেদ করা হয়েছিল।

সাধারণভাবে টিডিডি, বিডিডি এবং ইউনিট পরীক্ষার ব্যবহার সত্ত্বেও আমাদের এখনও কি এটি ব্যাপকভাবে ব্যবহার করা উচিত?


9
আমি দেখতে পাচ্ছি না কীভাবে একজন অন্যটিকে বাদ দেয়।
সুপারম

2
@ সুপেরম আমি অবশ্যই অলস বিকাশকারীদের দেখেছি আগে তারা টেস্ট যুক্ত করার আগে পরীক্ষাগুলি যুক্ত করেছিল কারণ তারা তাদের কোডটি লিখেছিল যাতে নির্ভরতা ঠাট্টা করা শক্ত ছিল। বলার অপেক্ষা রাখে না যে আমি এটি সুপারিশ করব না
জে কে।

উত্তর:


23

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

// Precondition using Asert
void SomeMethod(Foo someParameter)
{
    Debug.Assert(someParameter != null)
}

// Precondition using If-Then-Throw
void SomeMethod(Foo someParameter)
{
    if (someParameter == null)
        throw new ArgumentNullException("someParameter");
}

// Precondition using Code Contracts
void SomeMethod(Foo someParameter)
{
    Contract.Requires(someParameter != null);
}

// Precondition using some custom library
void SomeMethod(Foo someParameter)
{
    Require.ArgumentNotNull(() => someParameter);
}

সবগুলিই একই জিনিস অর্জনের উপায়: কোডের দৃ rob়তা। এটি কেবলমাত্র একটি বিকল্প বেছে নেওয়ার জন্য নেমে আসে, যার মধ্যে আসর্ট একটি বৈধ পছন্দ।

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

[Test]
void SomeMethod_WhenGivenNull_ThrowsArgumentNullException()
{
    delegate call = () => someObject.SomeMethod(null);

    Assert.That(call).Throws<ArgumentNullException>();
}

এটি সম্পূর্ণ ভিন্ন ধরণের দৃsert়তা ...

** মনে রাখবেন যে কিছু ফ্রেমওয়ার্কগুলিতে দৃ failure় ব্যর্থতার জন্য পরীক্ষার ইউনিট পরীক্ষা করা বেশ কঠিন, কারণ একটি দৃser় ব্যর্থতা পুরো রানটাইমকে হ্রাস করতে পারে, সুতরাং অন্য বিকল্পগুলির মধ্যে একটি হতে পারে ...


10

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

উদাহরণস্বরূপ, আজকাল আমি বেশিরভাগ অ-সর্বজনীন পদ্ধতির জন্য প্যারামিটারগুলিকে বৈধতা দেওয়ার জন্য অ্যাসেসর্ট ব্যবহার করি।


5

আমি আজকাল ডিবাগ.এসার্টকে অকাল অপটিমাইজেশন হিসাবে দেখি। আপনার সত্যিকারের পারফরম্যান্সের প্রয়োজন না থাকলে রিলিজ মোডে আসক্তিকে দমন করা বাগগুলি আরও বেশি সময়ের জন্য আড়াল করতে পারে।

MattDavey হিসেবে পয়েন্ট কোড চুক্তি একটি উচ্চতর স্ট্যাটিক গতিশীল পরীক্ষণ পরিবর্তে টিক চিহ্ন দেওয়ার প্রদানের হতে পারে, এবং যদি পাওয়া যায় না ্যদসব Trace.Assert বা প্লেইন পুরোনোif(x) throw SomeException;


4
এটি উল্লেখ করার মতো বিষয় যে রিলিজ মোডে ভিজ্যুয়াল স্টুডিও সহ কোড উত্পন্ন করার ফলে Debugক্লাসের সমস্ত পদ্ধতির সমস্ত কল সংকলন থেকে বাদ দেওয়া হবে ... সুতরাং Assertকেবল পারফরম্যান্সের জন্য কলগুলি দমন করা কেবল অকাল অপ্টিমাইজেশন নয়, এটি একটি সরল বাজে কথা।
কোনামিমন

@ কনামিমান এটিই মূল বিষয়, আমি প্রায় সবসময়ই চাই যে এটি মুক্তি পদ্ধতিতে একইভাবে ব্যর্থ হয়: ডিবাগ.এসার্ট আমার 97% সময়
জে কে

তাহলে কি 3%, @ জে কে? শুধুমাত্র উত্তরাধিকারের কোড, বা অন্য কোনও উদাহরণ?
ডগএম

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