একটি নতুন কাজে, আমি কোডের মত কোডের জন্য এই জাতীয় কোডের পতাকাঙ্কিত হয়ে যাচ্ছি:
PowerManager::PowerManager(IMsgSender* msgSender)
: msgSender_(msgSender) { }
void PowerManager::SignalShutdown()
{
msgSender_->sendMsg("shutdown()");
}
আমাকে বলা হয়েছে যে শেষ পদ্ধতিটি পড়া উচিত:
void PowerManager::SignalShutdown()
{
if (msgSender_) {
msgSender_->sendMsg("shutdown()");
}
}
অর্থাত্, আমি অবশ্যই ভেরিয়েবলের NULLচারপাশে একটি প্রহরী রাখতে পারি msgSender_, যদিও এটি একটি ব্যক্তিগত ডেটা সদস্য। এই 'প্রজ্ঞা' এর টুকরোগুলি সম্পর্কে আমি কীভাবে অনুভব করছি তা বর্ণনা করার জন্য আমার কাছে নিজেকে এক্সপ্লিটিভ ব্যবহার থেকে বিরত রাখা কঠিন difficult যখন আমি ব্যাখ্যা জিজ্ঞাসা করি, তখন কোনও জুনিয়র প্রোগ্রামার, কোনও এক বছর, কোনও শ্রেণি কীভাবে কাজ করার কথা ছিল তা সম্পর্কে বিভ্রান্ত হয়ে পড়ে এবং দুর্ঘটনাক্রমে তার যে সদস্যকে না করা উচিত ছিল তাকে মুছে ফেলা হয়েছিল (এবং এটি NULLপরে সেট করা হয়েছে) সম্পর্কে আমি হরর গল্পের লিটানি পেয়েছি , স্পষ্টতই), এবং পণ্যগুলি প্রকাশের ঠিক পরে ক্ষেত্রগুলিতে জিনিসগুলি উড়ে যায় এবং আমরা "শক্ত উপায় শিখেছি, আমাদের বিশ্বাস করুন" যে কেবল সবকিছুNULL পরীক্ষা করা আরও ভাল ।
আমার কাছে, এটি কার্গো কাল্ট প্রোগ্রামিংয়ের মতো অনুভব করে , সরল এবং সাধারণ। কয়েকজন সার্থক সহকর্মী আন্তরিকভাবে আমাকে 'এটি' পেতে এবং এটি আরও শক্তিশালী কোড লেখার ক্ষেত্রে কীভাবে সহায়তা করবে তা দেখতে চেষ্টা করার চেষ্টা করছে, কিন্তু ... আমি যারা অনুভব করি না তারা তার মতো হওয়ার মতো অনুভূতিতে সহায়তা করতে পারি না ।
কোডিং স্ট্যান্ডার্ডের পক্ষে কি কোনও ফাংশনে ডিপ্রিফারিত প্রতিটি একক পয়েন্টারটি NULLপ্রথমে এমনকি ব্যক্তিগত ডেটা সদস্যদের জন্যও পরীক্ষা করা প্রয়োজন ? (দ্রষ্টব্য: কিছু প্রসঙ্গ দেওয়ার জন্য, আমরা একটি ভোক্তা ইলেকট্রনিক্স ডিভাইস তৈরি করি, এয়ার ট্র্যাফিক কন্ট্রোল সিস্টেম বা অন্য কিছু 'ব্যর্থতার সমান-জনগণের মরা' পণ্য নয়))
সম্পাদনা : উপরের উদাহরণে, msgSender_সহযোগী optionচ্ছিক নয়। যদি এটি কখনও হয় তবে এটি NULLএকটি বাগ নির্দেশ করে। এটি নির্মাণকারীর মধ্যে পাস করার একমাত্র কারণ তাই PowerManagerমক IMsgSenderসাবক্লাস দিয়ে পরীক্ষা করা যেতে পারে ।
সংক্ষিপ্তসার : এই প্রশ্নের কিছু সত্যই দুর্দান্ত উত্তর ছিল, সবাইকে ধন্যবাদ। আমি উড়োজাহাজ থেকে মুখ্যতঃ এর ব্রবটিটির কারণে এটি গ্রহণ করেছি। মোটামুটি বিস্তৃত সাধারণ চুক্তি বলে মনে হচ্ছে যে:
- প্রতিটি একক বিনীত পয়েন্টারের
NULLজন্য ম্যান্ডেটিং গার্ডগুলি ওভারকিল, তবে - পরিবর্তে কোনও রেফারেন্স (যদি সম্ভব হয়) বা
constপয়েন্টার ব্যবহার করে আপনি পুরো বিতর্ককে একপাশে পদক্ষেপ নিতে পারেন এবং assertNULLফাংশনের পূর্বশর্ত পূরণ হয়েছে তা যাচাই করার জন্য বিবৃতি রক্ষীদের আরও আলোকিত বিকল্প ।
nullএবং কিছুই করছেন এটা উৎসে আবার নিয়ে ট্র্যাক করতে অনেক বেশী কঠিন মৃত্যুদন্ড নিচে বাগ উপর সরানো শুধু একটি উপায়।