আমি বুঝতে পারি যে প্রশ্নটির কোনও ভাষা ট্যাগ না থাকলেও সম্ভবত এটি সম্ভবত "কফি ভাষাগুলি" সম্পর্কে কথা বলছে। তবে কেবল সম্পূর্ণতার জন্য, আমি সি ++ বিশ্বে কিছুটা বিচ্যুত আপাত conকমত্যের কথা উল্লেখ করতে চাই।
তিনটি বিষয় রয়েছে যা সি ++ প্রোগ্রামাররা সাধারণত আগ্রহী:
- এটির কি অপ্টিমাইজড বিল্ডগুলিতে শূন্য-ওভারহেড থাকবে? (এটি কি "সংকলিত" করা যেতে পারে?)
- ত্রুটিটি সনাক্ত করা হয়েছে ঠিক ঠিক সেই বিন্দুতে ডিবাগারে আটকাতে আমি কি এটি ব্যবহার করতে পারি?
- ঘোষিত ফাংশনগুলি থেকে সমস্যার প্রতিবেদন করতে আমি কি এটি ব্যবহার করতে পারি
noexcept
?
অতীতে, আমি এই জাতীয় কোড লিখে প্রথম সমস্যাটির সাথে যোগাযোগ করেছি
int
factorial(const int n)
{
if (CHECK_ARGS)
{
if (n < 0)
throw std::invalid_argument {"n < 0"};
}
int fac = 1;
for (int i = 2; i <= n; ++i)
fac *= i;
return fac;
}
যেখানে CHECK_ARGS
হয় #define
একটি কম্পাইল-টাইম ধ্রুবক ডি তাই কম্পাইলার সম্পূর্ণরূপে সমস্ত যুক্তি পরীক্ষণ কোড নিষ্কাশন পারে অপ্টিমাইজ তৈরী করে। (আমি বলছি না যে চেক আউট করা সাধারণভাবে একটি ভাল জিনিস তবে আমি বিশ্বাস করি যে কোনও ব্যবহারকারীর বিকল্প থাকা উচিত এগুলি সংকলনের ))
আমি এখনও এই সমাধানটি পছন্দ করি যে যুক্তি যাচাইকরণ কোডটি স্পষ্টভাবে একত্রিত হয়ে গ্রুপে দৃশ্যমান if
। তবে দ্বিতীয় এবং তৃতীয় ইস্যু এর দ্বারা সমাধান হয় না। অতএব, আমি এখন আবার assert
যুক্তিতে যাচাইয়ের জন্য ম্যাক্রো ব্যবহারের দিকে আরও ঝুঁকছি।
বুস্ট মান কোডিং এই সঙ্গে সম্মত হন:
প্রোগ্রামার ত্রুটিগুলি সম্পর্কে কী?
বিকাশকারী হিসাবে, যদি আমি যে লাইব্রেরিটি ব্যবহার করছি তার পূর্ব শর্ত লঙ্ঘন করেছি, আমি স্ট্যাক আনওয়াইন্ডিং চাই না। আমি যা চাই তা হল একটি মূল ডাম্প বা সমতুল্য - সমস্যাটি সনাক্ত করা হয়েছে ঠিক এমন জায়গায় প্রোগ্রামের অবস্থাটি পরীক্ষা করার একটি উপায়। এর অর্থ সাধারণত assert()
বা এর মতো কিছু।
ডিপেনসিয়াল প্রোগ্রামিং ডোন রাইট ( অংশ 1 , অংশ 2 ) শিরোনামে সিপিপিউন 14 এ জন লাকোস একটি খুব আকর্ষণীয় আলোচনা করেছিলেন । তাঁর আলাপের প্রথম অংশে তিনি চুক্তি এবং অপরিজ্ঞাত আচরণের তত্ত্ব নিয়ে আলোচনা করেছেন। দ্বিতীয় অংশে, তিনি যা উপস্থাপন করেছেন তা আমি পদ্ধতিগত যুক্তি যাচাইয়ের জন্য খুব ভাল প্রস্তাব বিবেচনা করি। সংক্ষেপে, তিনি দৃ ma় ম্যাক্রোগুলির প্রস্তাব রাখেন যে ব্যবহারকারীকে বাজেটের কত অংশ (সিপিইউ ব্যবহারের ক্ষেত্রে) বাছাই করার জন্য লাইব্রেরিতে অনুদান দিতে ইচ্ছুক এবং লাইব্রেরিটি সেই বাজেটের বুদ্ধিমানভাবে ব্যবহার করতে পারে তা নির্বাচন করতে দেয়। সংযোজন হিসাবে, ব্যবহারকারী একটি বিশ্বব্যাপী ত্রুটি হ্যান্ডলিং ফাংশনও ইনস্টল করতে পারে যা কোনও ভাঙা চুক্তি সনাক্ত করা হলে ডাকা হবে।
কোনও ফাংশনটি ব্যক্তিগত যে দিকটি সম্পর্কে, আমি মনে করি না এর অর্থ এই যে আমাদের কখনই এর যুক্তিগুলি পরীক্ষা করা উচিত নয় । অভ্যন্তরীণ ফাংশনের চুক্তি লঙ্ঘন না করার জন্য আমরা আমাদের নিজস্ব কোডকে আরও বেশি বিশ্বাস করতে পারি তবে আমরা জানি যে আমরাও নিখুঁত নই। অভ্যন্তরীণ ফাংশনগুলিতে আর্গুমেন্ট চেক করা যেমন আমাদের নিজস্ব বাগগুলি সনাক্ত করতে তেমনি সহায়ক যেমন এটি ক্লায়েন্ট কোডে বাগ সনাক্ত করার জন্য জনসাধারণের কার্যক্রমে রয়েছে।