انسان یک گونه نقاد ، هنرمند و هوشمند است ! به همین خاطر است که پرسشگری میکند!
تجربه من از برنامه نویسی روز 4 ام ، فلسفه ای بسیار کارآمد در زندگی.
توجه توجه : این مطلب رو حتما با ویس روی مقاله بخونید و گوش بدید تا به درک بهتری از موضوع برسید ممنون.
مقدمه
درود اینجا جی بی گیکه و من فَرِهان هستم، سلام حالتون چطوره ؟
یک فلسفه جالبی رو برنامه نویسی بهم یاد داده ، این که من به هیچ وجه نمیتونم در رابطه با یک چیز یا حالا یک سری چیز ها به طور 100 درصد مطمئن باشم. اتفاقی که افتاد از تجربیات خودِ منه ، من فصل 4 رو تموم کردم و به فصل 5 کتاب programming principles and practice using c plus plus رسیدم قبلا در سری پست های تجربه من از برنامه نویسی (1و2و3) گفتم که این کتاب در رابطه با c plus plus نیست بلکه در رابطه با برنامه نویسی هست که به طور کلی با آموزش c plus plus به صورت یک ابزار و tool هم همراهه.
توی این قسمت از تجربه ام باز میخوام در رابطه با یک تمرینی که در آخر فصل 5 یعنی فصل errors انجام دادم صحبت کنم. این فصل در رابطه با خطا ها، نحوه دیباگ کردن و فلسفه نوشتن برنامه و خط خطی کردن کاغذ قبل از نوشتن برنامه یا به قول کتاب estimate کردن و البته فرق دیباگ با تست و مباحثی از قبیل استفاده از pre-condition و post-condition و اینجور چیزا هست که توی مقاله بعدی در رابطه با هرکدومشون مینویسم و توضیح میدم فقط الان خلاصه بگم که فصل فوق العاده ایه.
اما بزارید بریم سر اصل مطلب.
بالا گفتم که این تمرین به من یاد داده که نمیتونم به طور 100 درصد در رابطه با چیزی مطمئن باشم البته باید بهتون بگم که این قضیه در دنیای واقعی صدق میکنه شما میتونید در داستان ها و البته در مباحث ریاضیاتی محض تا حدود بسیار زیادی در رابطه با هر چیزی که دوست دارید مطمئن باشید.
اما چرا میگم دنیای واقعی؟ اصلا تمرین در مورد چی بود؟
تمرین کتاب خیلی ساده بود، میگفت من یه کد دارم به شکل زیر :
//CALLEE START
int area(int width, int hight) {
// pre-condition -> width and hight must be greater than 0, that is, positive
// post-condition -> the result must be greater than 0, that is, positive
/*___pre-condition___ */
if(width < 0 || hight < 0) error("hight or width may be less or equal to zero. wdf?");
int result = width * hight;
/*___post-condition___*/
if(result < 0) error("area is 0 or less, wtf?");
return result;
}
//CALEE END
int main() {
int h;
int w;
cout << "INSERT WIDTH AND HIGHT OF YOUR DESIRED RECTANGLE\n"
while(cin >> w >> h) { // press ctrl + z to terminate the loop.
cout << area(w,h) << '\n';
cout << "do it again\n"
}
return 0;
}
کل کد بالا داره چی میگه؟ میگه آقا من یه تابع دارم به اسم area که قراره دوتا مقدار ورودی بگیره یکی عرض {width} یکی ارتفاع (یا همون طول) {hight} حالا در نهایت این دوتا رو ضرب در هم میکنه و در بخشی از حافظه که اسمش result هست ذخیره اش میکنه و در نهایت این مقداری که داخل result هست جواب ماست.
بعد توی main اومده یه لوپ ساخته که هی شما بتونید عرض و ارتفاع بدید و به عبارتی دیگه هربار نیاز نباشه که برنامه رو ران کنید.
چیز خیلی مهمی که توی این برنامه وجود داره دوتا عبارت pre-condition و post-condition هست این رو بهتون بگم که توی مقاله ها و کتاب های آکادمیک به فانکشن و کل بدنه ی فانکشن میگن callee اگر به callee توی کد بالا نگاه کنید میبینید که پری کاندیشن و پست کاندیشن مشخص شده. در واقع pre-condition شرط یا شرط هایی هست که میاد و نگاه میکنه ببینه که ورودی هایی که میدیم به یه فانکشن اوکی هستند یا نه ؟ یعنی مثلا برای این مثال چون ما قراره مساحت حساب کنیم پس نمیتونه عرض یا ارتفاع ما صفر یا حالا عدد منفی باشه چرا؟ چون اگر شما یه شکل داشته باشید که عرضش 0 هست آیا میتونید بهش بگید مستطیل؟ یا این که آیا طول منفی وجود داره؟ مثلا میتونید بگید قد یکی -183 هست؟
به همین دو دلیلی که بهتون با استفهام انکاری گفتم باید بگم که پس طبیعیه که شرطی بزاریم که عرض و ارتفاع هر دو از صفر بزرگتر باشن اینجوری دیگه نه صفر میشن و نه منفی. به این قضیه میگن pre-condition یعنی شرطی که قبل از این که فانکشن بخواد از ورودی هاش استفاده کنه مینویسیم. حالا بعد از این یه post-condition هم داریم این شرطی هست که میاد نتیجه نهایی تابع یا فانکشن ما رو بررسی میکنه. نتیجه ای که توی مثال ما مقدار مساحت مستطیل هست. مقدار مساحت هم نمیتونه صفر یا منفی باشه. پس باید همیشه مثبت باشه. اتفاقی که میوفته اینه که ما یه همچین شرطی رو هم مینویسیم.
اما صبر کنید.
آیا نیازه؟ که همچین شرطی بنویسیم؟
ما از ریاضیات میدونیم که اگر مستطیلی به عرض w و طول h داشته باشیم پس مساحت اون h × w میشه . حالا با فرض این که h و w بزرگتر از صفر هستند پس رسما هیچ وقت مقدار مساحت ما صفر یا منفی نمیشه.
با این تفاسیر دیگه نیازی به post-condition نیست بلکه کافیه که همون pre-condition رو به کار بگیریم درسته ؟ چون ما مطمئنننیم که قرار نیست مساحت ما صفر یا منفی بشه. چون عرض و ارتفاع ما صفر یا منفی نیست.
و این دقیقا همونجایی هست که میتونم بگم فلسفه ای که بالا گفتم شکل میگیره و شما نمیتونید هیچوقت در رابطه با چیزی در دنیای واقعی مطمئن باشید. چرا؟ چون اینجا قرار نیست که روی کاغذ خط خطی کنید و بگید که ریاضی به طور کامل حکمفرماست اینجا قوانین ترمودینامیک و البته فیزیک هم حکمفرمایی میکنه به عبارتی اینجا هر سیستمی محدودیتی در خودش داره. که این محدودیت میتونه باعث ایجاد یک خطا حتی در چیزی به اسم ریاضیات که کاملا لاجیکال و منطقی هست بشه.
در c plus plus اگر دو عدد بسیار بزرگ رو در هم ضرب کنید در نهایت عدد منفی رو پس میگیرید (عکس بالا). پس اگر کسی احیانن یک مستطیل بسیار بزرگ رو در نظر داشته باشه و بخواهد که مساحتش رو با برنامه شما در نظر بگیره . ممکنه که برنامه شما همچین خطایی رو بده پس بهتره بگم که یه چیزی این وسط اشتباهه و بهتره که از post-condition استفاده کنیم تا مخاطب ما گیر نکنه و فکر نکنه که برنامه مشکلی داره. و از طرفی بتونیم این خطا رو هم مدیریت کنیم.
نتیجه :
اگر شما در این مثال احیانن صرفا به ریاضیات دلخوش میکردید و کاملا مطمئن میشدید که مساحتتون هیچوقت به خاطر pre-condition منفی یا صفر نمیشه. حتما لذت مدیریت کردن این خطا رو از دست میدادید پس باز هم میگم در دنیایی که فیزیک حکمفرماست و خستگی و محدودیت بخشی از حیات (زندگی) هر موجود زنده و شبه زنده هست. بهتره که فکر مطمئن بودن 100 درصد رو از ذهنمون بیرون کنیم و تا جایی که میتونیم در بحث error handling به این فکر باشیم که کار از محکم کاری عیب نمیکنه.
من فَرِهان بودم مرسی که من رو شنیدید، و خوندید، دمتون گرم ، میتونید من رو شبکه های اجتماعی با آدرس و آیدیه @atfarhanwd پیدا کنید. چه در تلگرام و چه در اینستاگرام و حتی در یوتیوب و توییتر (ایکس :( )
در نهایت تا درودی دیگر بدرود فعلا.
توجه جی بی گیک (GBGEEK) یه پادکست در زمینه تکنولوژی و جامعه هست، چرا اسمش اینه؟ خب به این خاطر که به پادکست ربط داره کلا پادکست رو میتونی بزاری توی جیبت و بهش گوش بدی.
ایمیل من اگر حرفی داشتید که نمیخواستید اینجا بگید : atfarhanwd@gmail.com
مطلبی دیگر از این انتشارات
راهنمای انجام اولین مشارکت در متن باز
مطلبی دیگر از این انتشارات
مقایسه Dispatchers.Default و Dispatchers.IO در کاتلین کوروتین (kotlin Coroutine)
مطلبی دیگر از این انتشارات
محاسبه مدت زمان ویدیو ها با یه دکمه!