কোড পর্যালোচনা করার সময়, আমি নিম্নলিখিত নিয়মগুলি প্রয়োগ করি:
সর্বদা const
রেফারেন্স দ্বারা পাস ফাংশন পরামিতিগুলির জন্য ব্যবহার করুন যেখানে ফাংশনটি নির্দেশিত ডেটা সংশোধন করে না (বা বিনামূল্যে)।
int find(const int *data, size_t size, int value);
সবসময় const
ধ্রুবকগুলির জন্য ব্যবহার করুন যা অন্যথায় একটি # নির্দিষ্ট বা এনুম ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে। সংকলক ফলস্বরূপ পঠনযোগ্য মেমরি (ROM) এ ডেটা সনাক্ত করতে পারে (যদিও লিঙ্কার এম্বেডড সিস্টেমে প্রায়শই এই উদ্দেশ্যে আরও ভাল সরঞ্জাম হয়)।
const double PI = 3.14;
মান দ্বারা পাস হওয়া প্যারামিটারের জন্য কোনও
ফাংশন প্রোটোটাইপে কখনও কনস্ট ব্যবহার করবেন না । এর কোনও অর্থ নেই এবং তাই কেবল 'আওয়াজ'।
// don't add const to 'value' or 'size'
int find(const int *data, size_t size, const int value);
উপযুক্ত যেখানে, const volatile
অবস্থানগুলি ব্যবহার করুন যা প্রোগ্রাম দ্বারা পরিবর্তন করা যায় না তবে এখনও পরিবর্তিত হতে পারে। হার্ডওয়্যার রেজিস্ট্রারগুলি এখানে সাধারণ ব্যবহারের কেস, উদাহরণস্বরূপ এমন একটি স্ট্যাটাস রেজিস্টার যা কোনও ডিভাইসের রাজ্যকে প্রতিফলিত করে:
const volatile int32_t *DEVICE_STATUS = (int32_t*) 0x100;
অন্যান্য ব্যবহারগুলি alচ্ছিক। উদাহরণস্বরূপ, ফাংশন বাস্তবায়নের মধ্যে কোনও ফাংশনের পরামিতিগুলি কনস্ট হিসাবে চিহ্নিত করা যেতে পারে।
// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)
{
... etc
বা ফাংশন রিটার্ন মান বা গণনাগুলি প্রাপ্ত হয় এবং তারপরে কখনই পরিবর্তন হয় না:
char *repeat_str(const char *str, size_t n)
{
const size_t len = strlen(str);
const size_t buf_size = 1 + (len * n);
char *buf = malloc(buf_size);
...
const
কেবলমাত্র এর ব্যবহারগুলি ইঙ্গিত দেয় যে আপনি পরিবর্তনশীল পরিবর্তন করবেন না; পরিবর্তনশীল কীভাবে বা কোথায় সংরক্ষণ করা হয় তা তারা পরিবর্তন করে না। সংকলক অবশ্যই কার্যকরভাবে কাজ করতে পারে যে কোনও ভেরিয়েবল পরিবর্তন হয় না, তবে যুক্ত করে const
আপনি এটি প্রয়োগ করতে পারবেন। এটি পাঠককে সাহায্য করতে পারে এবং কিছুটা সুরক্ষা যোগ করতে পারে (যদিও আপনার ফাংশনগুলি যদি বড় বা জটিল হয়ে থাকে যে এটির ফলে একটি দুর্দান্ত পার্থক্য হয় তবে আপনার পক্ষে যুক্তিযুক্তভাবে অন্যান্য সমস্যা রয়েছে)। সম্পাদনা - যেমন। নেস্টেড লুপস এবং অনেকগুলি লম্বা বা অনুরূপ ভেরিয়েবল নাম সহ একটি 200-লাইনের ঘন কোডিং ফাংশন, জেনে রাখা যে নির্দিষ্ট ভেরিয়েবলগুলি কখনই পরিবর্তন হয় না তা উল্লেখযোগ্যভাবে আন্ডারট্যানিংকে স্বাচ্ছন্দ্য করতে পারে। এই ধরনের ফাংশনগুলি খারাপভাবে ডিজাইন করা হয়েছে বা মূলত হয়েছে।
সমস্যা const
। আপনি সম্ভবত "কনস্টেটিভ বিষ" শব্দটি শুনবেন। const
কোনও ফাংশন প্যারামিটারে যুক্ত হওয়ার পরে এটি প্রচার করতে 'স্থিরতা' সৃষ্টি করে occurs
সম্পাদনা করুন - কনস্টের বিষ: উদাহরণস্বরূপ ফাংশনে:
int function_a(char * str, int n)
{
...
function_b(str);
...
}
যদি আমরা পরিবর্তিত str
হয় const
, আমাদের অবশ্যই এটি fuction_b
অবশ্যই গ্রহণ করবে তা নিশ্চিত করতে হবে const
। এবং তাই উপর যদি function_b
পাস str
করতে function_c
, ইত্যাদি আপনি কল্পনা করতে পারেন এই বেদনাদায়ক হতে পারে যদি এটি অনেক পৃথক ফাইল / মডিউল মধ্যে propagates। যদি এটি এমন কোনও ফাংশনে প্রচার করে যা পরিবর্তন করা যায় না (যেমন সিস্টেম লাইব্রেরি), তবে একটি কাস্ট প্রয়োজনীয় হয়ে যায়। সুতরাং const
বিদ্যমান কোডে চারপাশে ছিটানো
সম্ভবত সমস্যার জন্য জিজ্ঞাসা করছে। যদিও নতুন কোডে, const
যেখানে উপযুক্ত সেখানে ধারাবাহিকভাবে যোগ্যতা অর্জন করা ভাল ।
আরও কুখ্যাত সমস্যাটি const
হ'ল এটি মূল ভাষায় ছিল না। অ্যাড-অন হিসাবে এটি যথেষ্ট ফিট করে না। শুরু করার জন্য এর দুটি অর্থ রয়েছে (যেমন উপরের বিধিগুলির মধ্যে, যার অর্থ "আমি এটিকে পরিবর্তন করব না" এবং "এটি সংশোধন করা যায় না")। তবে এর চেয়ে বেশি বিপজ্জনক হতে পারে। উদাহরণস্বরূপ, এই কোডটি সংকলন করুন এবং চালান এবং (সংকলক / বিকল্পগুলির উপর নির্ভর করে) রান করার সময় এটি ভাল ক্রাশ হতে পারে:
const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';
strchr
একটি char*
না একটি প্রদান const char*
। এর কল প্যারামিটার হিসাবে
const
এটি অবশ্যই কল প্যারামিটারটি cast ালাই করতে পারে char*
। এবং এই ক্ষেত্রে আসল পঠনযোগ্য স্টোরেজ সম্পত্তি কেড়ে দেয়। সম্পাদনা করুন: - এটি সাধারণত পঠনযোগ্য মেমরিটিতে ভারসের ক্ষেত্রে প্রযোজ্য। 'রম' দ্বারা, আমি কেবল শারীরিক রমকেই বোঝাতে চাইছি না তবে কোনও রচনা-সুরক্ষিত কোনও মেমরি যেমন একটি সাধারণ ওএসে চালিত প্রোগ্রামগুলির কোড বিভাগে ঘটে।
অনেকগুলি স্ট্যান্ডার্ড গ্রন্থাগার ফাংশন একইভাবে আচরণ করে, তাই সাবধান হন: যখন আপনার আসল ধ্রুবক থাকে (যেমন রমগুলিতে সঞ্চিত থাকে) আপনার অবশ্যই তাদের দৃ careful়তা হারাতে না দেওয়ার জন্য খুব সতর্ক থাকতে হবে।
Specific issues with software development
। আমি বেশ নির্দিষ্ট করা হচ্ছে।