روشهای عملی نوشتن کد خوانا
خوانا بودن کد یک موضوع جهانی در دنیای برنامهنویسی است و اولین چیزی است که به عنوان توسعه دهنده آن را میآموزیم. اگر تا به حال درگیر فهمیدن یک کد ناخوانا شده باشید، احتمالا بیشتر اهمیت این موارد را درک کردهاید. در این مطلب ۱۵ تا از مهمترین نکات آن را مطرح میکنیم تا اگر هم قبلا با آن آشنا بودید ببینید هماکنون چقدر آنها را در برنامهنویسیهای خود مدنظر قرار میدهید.
۱- کامنت گذاری و مستند کردن
امروزه IDEها نسبت به گذشته امکانات زیادی برای کامنت گذاری در اختیار قرار میدهند. به عنوان مثال در اکلیپس در صورتی که یک جاواداک برای متد یادداشت کنید در هرجایی از پروژه که آن متد را فراخوانی کنید توضیحاتتان، مشابه سایر توابع تعریف شده کتابخانههای جاوا برایتان به نمایش گذاشته میشوند. حتی اگر به فکر مشکلات دیگران در خواندن و فهمیدن کدتان نیستید، برای سادگی کار خودتان از این امکانات استفاده کنید.
۲- indentگذاری یکپارچه
احتمالا میدانید که بایستی کد خود را indentگذاری کنید اما اینجا میخواهیم بگوییم که این indentگذاری را یکپارچه نگه دارید. به عنوان مثال اگر برای تعریف بلوک توابع آکولاد باز را جلوی نام تابع میگذارید یا اگر در خط جدید مینویسید، در کل توابع برنامه این روند را دنبال کنید. این دو روش برتری به هم ندارند اما حفظ یکپارچگی شیوه خودتان در کل پروژه است که اهمیت پیدا میکند. (البته اگر نمیدانید بدانید که در اکلیپس لازم نیست خودتان را درگیر سبک indentگذاری کنید و با کلیدهای میانبر ctrl+shift+f در کل برنامه indentگذاری را اصلاح نمایید.)
۳- بدیهیات را کامنت نکنید!
کامنت گذاری کار نیکی است! اما ممکن است در آن زیادهروی شود و تبدیل به تکرار شود. برای تابع get_country_code لازم نیست که کامنت بگذارید که get the country code// !
۴- گروهبندی کدها
اغلب موارد تسکهای مشخص در تعداد محدودی از خطوط کد انجام میشوند. خیلی خوب است که بتوانیم این چند خط را در بخشهای متمایز و جدا با استفاده از چند خط فاصله بین آنها قرار دهیم و یک خط کامنت در مورد تسکی که این چند خط انجام میدهند بالای آن بنویسیم.
۵- نامگذاری یکپارچه
در نام گذاری دو سیاست کلی وجود دارد:
camelCase: اولین کاراکتر هر لغت به جز لغت اول با حروف بزرگ نوشته میشود
underscores: بین کلمات موجود در یک نام underline گذاشته میشود.
پس در گام اول لازم است برای حفظ یکپارچگی یکی از این دو سیاست را دنبال کنیم. البته زبانهایی مثل جاوا و PHP خود سیاست مشخصی را در برنامهنویسی تعریف میکنند که در جاوا نامها به شکل camelCase باید باشد.
البته میتوان از این دو سیاست به طور ترکیبی نیز استفاده کرد به این صورت که بعضی توسعهدهندگان ترجیح میدهند از underscore برای اسم توابع procedural و کلاس ها و از camelCase برای اسم توابع درون کلاس استفاده کنند.
۶- قانون DRY
DRY مخفف Dont Repeat Yoursele است و طبق این اصل، تکرار پدیده شومی است!
هدف اغلب برنامهها اتوماتیک سازی کارهای تکراری است. این موضوع در کدها و حتی کدهای برنامههای وب هم وجود دارد. یک تکه کد یکسان نباید بارها تکرار شود.
۷- اجتناب از تودرتو نویسیهای عمیق
چندین سطح از nesting کد را برای خواندن و فهمیدن دشوار میکنند. در اغلب موارد میتوان کاری کرد که این سطوح تو در تو کاهش پیدا کنند مانند زیر:
boolean doStuff(boolean z,boolean x,boolean w,boolean y ) { // ... if (x) { if (y) { if (z) { if (w) { // ... } else { return false; } } else { return false; } } else { return false; } } else { return false; } return y; }
که میتواند با کد زیر جایگزین شود:
boolean do_stuff(boolean z, boolean x, boolean w, boolean y) { // ... if (!x) { return false; } if (!y) { return false; } if (!z) { return false; } if (w) { // ... } else { return false; } return y; }
۸- محدود کردن طول خط
چشمهای ما احساس راحتی بیشتری با خواندن ستونهای طولانی و باریک حاوی متن دارد و به همین دلیل روزنامهها نیز به این شکل چاپ میشوند پس در کد نویسی هم توصیه میشود خطوط افقی کد خیلی طولانی نشوند و در مواقع لزوم به خطوط جدید شکسته شوند.
۹- مرتب کردن فایلها و پوشهها
شما میتوانید کل کد را در یک فایل بنویسید اما قول خواهم داد که خواندن و پشتیبانی های بعدی از آن به کابوس همیشگیتان تبدیل خواهد شد!
یکی از راهکارها تقلید کلاسبندی از روی یک چارچوب دیگر است اما همیشه در نظر داشته باشید که تا حد امکان پیوستگی کد در هر پوشه زیاد و ارتباط آن با سایر پوشهها کمینه باشد. (این مفهوم تحت عنوان افزایش cohesion و کاهش coupling در مهندسی نرمافزار مطرح میشود )
۱۰- نامگذاری یکپارچه متغیرهای میانی
نامگذاری متغیرها اغلب از یک یا چند اسم تشکیل شده است اما برای نامگذاری متغیرهای میانی چنین چیزی لازم نیست و میتواند در حد یک کاراکتر باشد اما خوب است که در این نامگذاری هم یکپارچگی را در کل برنامه حفظ کنیم. مثلا در نامگذاری شمارنده حلقهها به ترتیب اسامی i, j, k, l رایج هستند و استفاده میشوند و تاجایی که امکان داشته باشد از i و در صورت وجود حلقه تو در تو متغیر بعدی j و به همین ترتیب الی آخر…
همانطور که در نگارش فارسی هم رعایت فاصلهها و نیمفاصلهها در خوانایی متن تاثیر زیادی دارد رعایت کردن فواصل مناسب بین عملگرها و عملوندها و قبل و بعد از کاما در خوانایی کد بسیار موثر است. دقت داشته باشید که قبل از کاما فاصلهای وجود نداشته و عبارت بعد از آن با یک فاصله جدا میشود. در طرفین یک عملگر نیز لازم است فاصله وجود داشته باشد. خودتان قضاوت کنید کدامیک از کدهای زیر خواناتر است؟
void func(int a,int b,int c,int d){ if(a+b-c*d==7) { double[] x={0.4,0.5}; doStuf(x); } }
void func(int a, int b, int c, int d){ if(a + b - c * d == 7) { double[] x = {0.4, 0.5}; doStuf(x); } }
۱۲- جدا سازی کد از داده
این اصلی است که در تمام زبانهای برنامهنویسی مدنظر قرار دارد. اگر برنامهنویسی اندروید انجام داده باشید حتما با الگوی قرار دادن دادهها در یک پوشه جدا از کد اصلی برنامه آشنا هستید. در جاوا نیز همواره تلاشتان بر جدابودن کد از داده باشد خدا را چه دیدید شاید فردا روزی خواستید زبان برنامه خود را تغییر دهید و آن وقت لازم نباشد در چندین کلاس و چندین خط کد دنبال دادههای ثابت بگردید.
۱۳- کد خوب، کد هوشمندانه نیست
سعی نکنید به طرز پیچیده و غیرقابل فهم کدنویسی کنید. کد خوب کدی است که سرراست و واضح کارها را انجام دهد.
۱۴- کد خود را بازآرایی کنید
بازآرایی(refactoring) تغییر کد بدون تغییر رفتار آن است. به عبارتی میتوان به نوعی تمیزکاری کد، برای افزایش کیفیت و خوانایی آن تلقی کرد.
بازآرایی به معنی رفع باگهای کد یا اضافه کردن ویژگی جدید نیست. شما کدی را بازآرایی میکنید که روز گذشته نوشتید و به آن تسلط کافی دارید تا اگر ماه آینده سراغ آن آمدید خواناتر و قابل استفادهتر باشد.
۱۵- پروژه های متن باز را بخوانید
پروژههای متن باز توسط چندین توسعهدهنده ساخته شدهاند. در این پروژهها نیاز است خوانایی کد در سطح بسیار بالایی باشد تا به راحتی توسط یک توسعهدهنده جدید فهمیده شود و نگهداری و مراقبت از آن آسان و حتی ممکن باشد. پس بسیار مفید خواهد بود که کدهای این پروژهها را مشاهده کنید تا ببینید این توسعهدهندگان چه میکنند
منابع:
البته crt+shift+f کدها رو مرتب میکنه 🙂
بله درست میفرمایید.
در واقع منظور از F همان shift+f است که الان در متن نیز یادداشت میکنم.
با تشکر از دقتتان 🙂