در قسمتهای گذشته پیرامون مسایلی برای ظاهر کدها و بخش بصری آنها صحبت کردیم. در ادامهی سلسله مقالات قصد داریم تا به راهکارهایی سطح بالاتر از جمله سادهسازی منطق برنامه بپردازیم. برای مثال یکی از ویژگیهای کدهای ناخوانا اینه که در اونها، از حلقهها و شرطهای تو در تویی استفاده شده که این امر باعث ناخوانا شدن کدها و گیج شدن خواننده میشه. در ادامه قصد داریم تا به شما راهکارهایی رو بدیم تا در زمینهی سادهنویسی منطق و دستورات برنامه، موثرتر عمل کنید.
اگه بخوام در یک کلمه بگم که به صورت ایدهآل چه کدی خوانا هستش میتونیم بگیم که کدهایی که فاقد هرگونه دستور شرطی یا حلقه و سایر دستورات کنترلی باشند، کدهای سادهای هستند. چرا که این کدها صرفا خط به خط اجرا میشن و خواننده رو مجبور نمیکنند که برای درک اونها مجددا اون خطوط رو مطالعه کنه. اما خب نوشتن برنامهای که فاقد هر گونه دستور کنترلی باشه سخته و در عمل غیر ممکنه. ولی تا اونجایی که ممکنه باید تلاش کنیم تا میزان جریانهای کنترلی به حداقل برسه.
ایدهی کلیدی
تمام عبارات شرطی، حلقهها، و دیگر تغییرات برای جریان کنترل را تا حد امکان طبیعی کنید، به حدی که طوری نوشته بشه که خواننده رو متوقف نکنه و مجبور به خواندن دوباره کد نشه.
به عبارت دیگه اگه هر چقدر کدهای شما روانتر بودند و کمتر باعث شدند که خواننده مکث کنه و اونها رو مجبور به خواندن دوباره کد کنه، این نشون دهندهی این هستش که کدهای شما از خوانایی بالاتری برخوردارند.
در ادامه قصد داریم تا به بررسی چند راهکار در زمینهی سادهسازی جریان کنترل کدها ارائه کنیم.
ترتیب آرگومانها در عبارات شرطی
بیاین با یه مثال شروع کنیم. از بین دو تکه کد ذکر شده زیر به نظر شما کدوم یک از اینها خواناتره.
if (length >= 10)
if (10 <= length)
به احتمال زیاد اولی خواناتر هستش. اما در مورد مثال بعدی چی فکر میکنید؟
while (bytes_received < bytes_expected)
while (bytes_expected > bytes_received)
در این مثال هم دوباره کد اول خواناتر هستش. پس اگه بخواهیم یه قانون کلی در ترتیب آرگومانها ذکر کنیم، میتونیم بگیم:
معمولا متغیری که تصمیم گیریهای ما بر اساس اون انجام میشه در ابتدا ذکر میشه.
ترتیب بلاکهای if else
یکی دیگه از مواردی که میتونه در خوانایی کدها موثر باشه، ترتیب بلاکهای شرطی if/else هستش. اگرچه در عمل و اجرا ترتیب دستورات شرطی if/else تفاوت چندانی نداره، و شاید برای شما هم ترتیب اونها اهمیت زیادی نداشته باشه اما اگه بخواهیم دقیقتر این مساله رو بررسی کنیم، رعایت ترتیب صحیح در نوشتن بلاکهای شرطی میتونه در سرعت خواندن تاثیرگذار باشه.
معمولا پیشنهاد میشه که بخشهای سادهتر و یا بخشهایی که مثبت هستند رو در ابتدا پردازش کنید. چرا که اینکار باعث افزایش سرعت خواندن میشه.
عملگر شرطی سه تایی
در برخی از زبانهای مشابه c شما میتونید دستورات شرطی خودتون رو که دارای دو حالت true/false هستند به صورت زیر تعریف کنید.
condition ? a : b
در اینجا condition نشاندهندهی یک عبارت منطقی هستش که میتونه درست یا نادرست باشه. در صورت صحیح بودن بخش a اجرا میشه و در صورت نادرست بودن بخش b. مثال:
time_str += (hour >= 12) ? "pm" : "am";
در اینجا بررسی میکنه که آیا ساعت ما بعد از ظهر هستش یا قبل از ظهر. طبعیتا نوشتن این مثال به کمک عملگر شرطی سه تایی نسبت به مثال زیر هم جمع و جور تر هستش و هم خواناتر.
if (hour >= 12) {
time_str += "pm";
} else {
time_str += "am";
}
اما آیا همیشه استفاده از عملگر شرطی سه تایی باعث خوانایی کد میشه. مثلا کد زیر رو در نظر بگیرید.
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
به نظر شما، آیا این فشرده کردن کدها باعث کاهش خوانایی و سرعت نشده. برای مثال، تکه کد بالا رو میشه به صورت زیر بازنویسی کرد.
if (exponent >= 0) {
return mantissa * (1 << exponent);
} else {
return mantissa / (1 << -exponent);
}
در این مثال اگرچه تعداد خطها بیشتر هستش اما سرعت خواندن بالاتره. پس اگه بخواهیم یه قاعده کلی برای استفاده یا عدم استفاده از عملگر شرطی سه تایی داشته باشیم، میتونیم بگیم:
در خواناتر کردنها، به جای تلاش برای کاهش تعداد خطها، برای کاهش زمان خواندن آنها کوشش کنید.
به بیان دیگه، اگه زمان مطالعهی کد به حد بهینهای کم شد، این نشون دهندهی این هستش که کد شما خوانا هستش حتی اگر حجم اون کدها نسبتا زیاد بشه.
بلاکهای تو در تو
یکی از مواردی که باعث کاهش سرعت خواندن کدها و افزایش سرباز ذهنی برای خواننده میشه، بلاکهای تو در تو هستند. بلاکهای تو در تو باعث ایجاد بار ذهنی بیشتری در ذهن خواننده میشه و ممکنه که حتی خواننده رو مجبور به دوباره خواندن کنه.
یکی از راهکارهایی که میشه برای رفع تو در تو بودن بلاکها استفاده کرد، بازگشت سریع از توابع هستش. بعضی از برنامهنویسان تصور میکنند که توابع اونها نباید بیش از یک دستور return داشته باشه و همین امر ممکنه باعث پیچیده و تو در تو شدن کدها بشه.
نکات پایانی
توی این پست درباره یه سری نکات درباره سادهسازی جریان برنامه گفتیم. به طور کلی در کدهای ما هر چقدر از دستورات کنترلی سادهتری استفاده بشه، سرعت خواندن رو افزایش میده. در خوانایی کدها، همواره تمرکزتون رو بر روی کاهش زمان خوندن کدها بذارین. ممکنه حجم کدهای شما زیاد بشه اما در این صورت از ابهام و پیچیدگی اونها کاسته میشه.
این مقاله هم به پایان رسید و امیدوارم که نکات اون براتون مفید بوده باشه. در مقالات بعدی نکات بیشتری رو دربارهی خوانایی کدها منتشر میکنیم.
آشنایی با مفاهیم کدنویسی تمیز + راهکارهای کاربردی برای نوشتن کدهای خوانا