آیا یاقوت ها هنوز روی ریل هستند؟
حقه های برنامه نویسی، به روش هایی گفته می شود که به کمک آنها بتوان کاری کرد که میزان خطاهایی که ممکن است در طول برنامه نویسی رخ دهند، به حد زیادی کاهش پیدا کند. برخی از این حقه ها به عنوان »برنامه نویسی تدافعی« شناخته می شوند. برنامه نویسی تدافعی جنبه های مختلفی دارد. از جنبه های امنیتی یک نرم افزار گرفته تا این که یک کد تمیز، سالم و بدون خطا باشد. پیش از این که چیزی را بخواهیم شروع کنیم، لطفا هیچ پیش فرضی در مورد کامپایلر نداشته باشید. کامپایلرها از ویژگی های مختلفی پشتیبانی می کنند که ممکن است در همه آنها ثابت نباشد. مثلا این تکه کد را نگاه کنید: array[i] = i++; نتیجه عبارت بالا چه خواهد شد؟ آیا اول عملیات جایگزینی انجام می شود و بعد یک واحد به i اضافه می شود یا برعکس این موضوع صادق خواهد بود؟ این مساله تا حدودی گنگ است، اما یک برنامه نویس خوب همواره از نوشتن کدهایی که ابهام دارد، خودداری می کند. هیچ وقت فراموش نکنید که نوشتن یک کد تمیز، خوانا و قابل ردیابی، بسیار بهتر از یک کد کوتاه، اما غیرقابل ردیابی است که نیاز به هوش بالایی دارد. 1– عبارت اگر برای مقایسه ثابت ها وقتی می خواهید مقدار ثابتی را با یک متغیر مقایسه کنید، به دو روش برمی خورید. نخستین حالت آن در این شرط مقایسه ای، چیزی شبیه به کد زیر خواهد بود: if (input_temp == const_val ) { //....some code goes here } و حالت دوم به صورت زیر: if (const_val == input_temp ) { ///....some code goes here } حالا به نظرتان کدام یک بهتر است؟ روش دوم کمی عجیب به نظر می رسد، اما بهتر است از آن استفاده شود! چرا؟ این حالت را در نظر بگیرید که به طور اشتباهی یک مساوی فراموش شود: if (input_temp = const_val) { حالا می توانید اشتباه کد بالا را درک کنید. در این حالت، همیشه جواب شرط، مقدار درست خواهد بود. این اشتباه وقتی که ثابت را اول بنویسیم برطرف خواهد شد، چرا که کامپایلر خطا می دهد. 2– تقدم عملگرها اگر بیشتر از یک عملیات وجود داشته باشد، حتما از پرانتز استفاده کنید. این کد را ببینید: ;2=1var ;10=2var ;4=3var ;3*var2+var1temp = var اگر منتظرید که عبارت بالا نتیجه 48 را بدهد به حقیقت فکر کنید که نتیجه 42 را خواهید گرفت. اشتباه از کجاست؟ اگر ندانید که عملگر ضرب نسبت به عملگر جمع اولویت بیشتری دارد، در این صورت ایرادی منطقی خواهید داشت که به سادگی قابل رفع نخواهد بود. برای سادگی کار می توان کد در دو خط را نوشت. البته پرانتزگذاری بهترین راه حل است. 3– بررسی کد بازگشتی توابع استاندارد صرف نظر کردن از کدهایی که توابع استاندارد کتابخانه ای پس می فرستند، تبدیل به امری عادی شده است. اما حواستان باشد که اگر بخواهید فرض بگیرید که این توابع همواره مقدار درست را بر می گردانند، از همین جا ضربه خواهید خورد. به عنوان مثال، تابع malloc برای تخصیص پویای حافظه استفاده می شود که شکل کلی آن به این صورت است: void *malloc(size_t size); malloc اشاره گری را به حافظه تازه تخصیص داده شده ای برمی گرداند که اندازه آن را با مقدار size به آن داده ایم. تکه کد زیر را در نظر بگیرید: * sizeof (int)); 100int *stk_ptr = malloc( if (null == stk_ptr) { // memory could not be allocated // take corrective action } اگر malloc به هر دلیلی نتوانست حافظه مناسب را تخصیص بدهد، در این صورت اگر بررسی ای صورت نگرفته باشد، برنامه تان به سادگی از کار می افتد و شما به هیچ عنوان نخواهید توانست آن را رهگیری کنید. 4– غلبه بر محدودیت آرایه وقتی یک آرایه ایجاد می کنید، شاید بزرگترین مشکل مان با آن، محدودیت اش باشد. کد زیر را در نظر بگیرید: ];10unsinged char input_buffer[ unsigned char i; ; i++) {10; i
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
منبع :جام جم آنلاین






پاسخ با نقل قول
Bookmarks