সি # - অ্যাসেট () পদ্ধতিটি কী করে? এটি এখনও দরকারী?


156

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


9
যাইহোক, আপনি যদি দৃ as়ভাবে আগ্রহী হন তবে আপনার অবশ্যই কোড চুক্তিতে প্রবেশ করা উচিত ।
মাস্টারমাস্টিক

উত্তর:


200

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

আপনি যদি রিলিজে সংকলন করেন, সমস্ত Debug.Assertস্বয়ংক্রিয়ভাবে বাদ পড়েছে।


12
রিলিজ মোডে আমি কীভাবে একই রকম আচরণ পেতে পারি?
হামিশ গ্রুবিজন

15
মুক্তি মোড দৃশ্যত refs জন্য Trace.Assert: msdn.microsoft.com/en-us/library/... msdn.microsoft.com/en-us/library/e63efys0.aspx
টিম Abell

8
@ হামিশগ্রুবিজান এবং আপনি কেন Debug.Assertমুক্তি মোডে চান ?
ক্যামিলো মার্টিন

25
আইএমও, রিলিজ কোড থেকে দাবি বাদ দেওয়া হ'ল ডক করার সময় লাইফবোট ড্রিল পরিচালনা করা এবং তারপরে আপনি যখন যাত্রা করবেন তখন লাইফবোটগুলি রেখে যাওয়ার মতো behind :)
খ্রিস্ট

113
জোর দেওয়া লাইফবোট নয়, এগুলি আইসবার্গ সনাক্তকরণ সিস্টেম। যেহেতু ব্যবহারকারী জাহাজটি চালাচ্ছেন না, তাই রিলিজ কোডে একটি দৃsert়তা কেবল তাদেরকে বলে যে তারা ধ্বংস হয়ে গেছে; এটি তাদের আইসবার্গ এড়াতে দেয় না।
স্টিফান

97

কোড সম্পূর্ণ থেকে

8 ডিফেন্সিভ প্রোগ্রামিং

৮.২ জোর

একটি প্রতিস্থাপনটি এমন কোড যা বিকাশের সময় ব্যবহৃত হয় used সাধারণত একটি রুটিন বা ম্যাক্রো — যা কোনও প্রোগ্রামকে চালিত হওয়ার সাথে সাথে নিজেকে পরীক্ষা করতে সহায়তা করে allows যখন একটি দৃ true়তা সত্য হয়, তার অর্থ প্রত্যাশা অনুযায়ী সবকিছুই পরিচালনা করছে। যখন এটি মিথ্যা হয়, তার মানে এটি কোডটিতে একটি অপ্রত্যাশিত ত্রুটি সনাক্ত করেছে। উদাহরণস্বরূপ, যদি সিস্টেমটি ধরে নেয় যে কোনও গ্রাহক-তথ্য ফাইলে কখনই 50,000 রেকর্ডের বেশি রেকর্ড থাকবে না, প্রোগ্রামটিতে এমন একটি বক্তব্য থাকতে পারে যে রেকর্ডের সংখ্যা 50,000 এর চেয়ে কম বা সমান। যতক্ষণ রেকর্ডের সংখ্যা 50,000 এর থেকে কম বা সমান হয়, ততক্ষণ দৃ silent়তা নিরব থাকবে। এটি যদি ৫০,০০০ রেকর্ডেরও বেশি রেকর্ডের মুখোমুখি হয় তবে এটি উচ্চস্বরে "জোর দিয়ে" বলবে যে প্রোগ্রামটিতে একটি ত্রুটি রয়েছে।

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

একটি দৃser়তা সাধারণত দুটি যুক্তি গ্রহণ করে: একটি বুলিয়ান এক্সপ্রেশন যা সত্য বলে মনে করা হয় এমন ধারণাটি বর্ণনা করে এবং যদি তা না হয় তবে প্রদর্শন করার জন্য একটি বার্তা।

(...)

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


2
সলিড কোড রাইটিং বইটিতেও দৃsert়তার ব্যবহার সম্পর্কে দুর্দান্ত আলোচনা হয়েছে। তারা একটি দুর্দান্ত ডিবাগিং সরঞ্জাম!
জুরোপা

39

ভেরিয়েবলগুলি পরীক্ষা করতে আপনার কোডের প্রতিটি ছোট রেখা ব্রেকআপপয়েন্ট করতে না চাইলে আপনার এটি ব্যবহার করা উচিত, তবে নির্দিষ্ট পরিস্থিতি উপস্থিত থাকলে আপনি কিছুটা প্রতিক্রিয়া পেতে চান, উদাহরণস্বরূপ:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

যদি আমি উপরে আপনার মত কোডের একটি লাইন যুক্ত করি, তবে আমার প্রোগ্রামটি চালানো নিম্নলিখিত ত্রুটিটি দেয়: "ত্রুটি CS0103: বর্তমান প্রসঙ্গে 'ডিবাগ' নামটি বিদ্যমান নেই"। এটিকে কাজ করতে আমার কি কোনও ধরণের স্টেটমেন্ট ব্যবহার করা দরকার?
জোশ ডেসমন্ড

4
@JoshDesmondSystem.Diagnostics
Sinjai

16

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


3
বাতিল / পুনরায় চেষ্টা / উপেক্ষা ক্লাসিক! উইন্ডোজ ৩.১ এর জন্য সর্বদা এটি প্রদর্শন করার কারণেই কি দাবি করা হয়েছিল?
devlord

এটি ম্যাসেজবক্স ব্যবহার করে কারণ এটি আপনার উইন্ডোজ ৩.১-এ রয়েছে এবং কেবলমাত্র পূর্বনির্ধারিত বোতামের লেবেল রয়েছে because সুতরাং আপনি বুঝতে পারেন কেন হ্যাকটি এসেছে কেন, তবে কেন এটি এখনও সেখানে নেই!
জো

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

5
এবং ভাল এটি এখন 2019 এবং একই ডায়ালগ বক্স / বোতাম এখনও এখানে আছে!
বুকে

10

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

ব্রেক-পয়েন্টের মতো নয়, এ্যাসেটটি আপনার কোডের সাথে যায় এবং আপনার উদ্দেশ্য সম্পর্কে অতিরিক্ত বিশদ যুক্ত করতে ব্যবহার করা যেতে পারে।


10

সংস্থান পরীক্ষা এবং প্রকাশের মধ্যে পৃথক বার্তাপ্রবণ আচরণ দিতে সহায়তা করতে পারে। উদাহরণ স্বরূপ,

Debug.Assert(x > 2)

আপনি যদি কোনও "ডিবাগ" বিল্ড চালাচ্ছেন, কোনও রিলিজ বিল্ড নয়, কেবল তখনই বিরতি দেবে। এই আচরণ একটি পূর্ণ উদাহরণ এখানে


10

সমস্ত Assert()পদ্ধতি প্রথম Traceএবং Debugক্লাস জন্য উপলব্ধ ।
Debug.Assert()শুধুমাত্র ডিবাগ মোডে কার্যকর করা হচ্ছে।
Trace.Assert()ডিবাগ এবং রিলিজ মোডে নির্বাহ করছে।

এখানে একটি উদাহরণ:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

এই কোডটি ডিবাগ মোডে এবং তারপরে রিলিজ মোডে চালান।

এখানে চিত্র বর্ণনা লিখুন

আপনি লক্ষ্য করবেন যে ডিবাগ মোড চলাকালীন আপনার কোড Debug.Assertবিবৃতি ব্যর্থ হয়, আপনি অ্যাপ্লিকেশনটির বর্তমান স্ট্যাক ট্রেস দেখিয়ে একটি বার্তা বাক্স পাবেন। Trace.Assert()শর্তটি সত্য হওয়ায় এটি রিলিজ মোডে ঘটছে না (i == 4)

WriteLine() পদ্ধতিটি আপনাকে ভিজ্যুয়াল স্টুডিও আউটপুটটিতে তথ্য লগ করার একটি বিকল্প দেয়। এখানে চিত্র বর্ণনা লিখুন


5

চুক্তি দ্বারা ডিজাইনের ক্ষেত্রে দৃser় বৈশিষ্ট্যগুলি বৈশিষ্ট্যযুক্ত (ডিবিসি) যা আমি বুঝতে পেরেছি যে মায়ার, বার্ট্যান্ডের দ্বারা পরিচয় / অনুমোদিত হয়েছিল। 1997. অবজেক্ট-ওরিয়েন্টেড সফটওয়্যার কনট্রাকশন।

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

চুক্তির পূর্বের / পোস্টের শর্তাদি, ক্লায়েন্ট / সরবরাহকারী সম্পর্ক - ক্লায়েন্টকে অবশ্যই সরবরাহকারীর পূর্ব শর্ত পূরণ করা উচিত তা নিশ্চিত করতে উদাহরণ হিসাবে ব্যবহৃত হয় eg £ 5 প্রেরণ করে এবং সরবরাহকারী অবশ্যই পোস্ট-কন্ডিশনগুলি পূরণ করে তা নিশ্চিত করে। 12 গোলাপ সরবরাহ করে। (ক্লায়েন্ট / সরবরাহকারী সম্পর্কে কেবল সহজ ব্যাখ্যা - কম গ্রহণ করতে পারে এবং আরও সরবরাহ করতে পারে তবে জোর দেওয়া সম্পর্কে)। সি # এছাড়াও ট্রেস.আরসেট () প্রকাশ করে, যা প্রকাশের কোডের জন্য ব্যবহার করা যেতে পারে।

প্রশ্নের উত্তরটি হ্যাঁ তারা এখনও কার্যকর, তবে কোড এবং সময় + জটিলতা + পাঠযোগ্যতা যোগ করতে পারে ly আমরা এখনও তাদের ব্যবহার করা উচিত? হ্যাঁ, আমরা সবাই কি সেগুলি ব্যবহার করব? সম্ভবত না, বা মায়ার কীভাবে বর্ণনা করে তার পরিধি পর্যন্ত নয়।

(এমনকি আমি এই কৌশলটি শিখেছি এমন OU জাভা কোর্সটি কেবল সাধারণ উদাহরণ দেখিয়েছে এবং সেখানে বাকি কোডগুলি বেশিরভাগ কোডে ডিবিসি দৃser় বিধি প্রয়োগ করে না, তবে প্রোগ্রামের নির্ভুলতা নিশ্চিত করার জন্য এটি ব্যবহৃত হয়েছিল বলে ধরে নেওয়া হয়েছিল!)


3

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

এটি কাউকে অস্থির মাথায় আপনার কোড ব্যবহার করা থেকে বাধা দেয়। তবে এটি সেই অস্থির মাথার উপায়টিকে উত্পাদন করতে দেয় এবং কোনও গ্রাহককে কদর্য বার্তা দেয় না (ধরে নিলে আপনি একটি রিলিজ বিল্ড তৈরি করেন)।


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