کدنویسی تمیز (Clean Code) اصطلاحی هستش که برای اولین بار توسط آقای رابرت سی مارتین که به عمو باب هم معروفه ابداع شد. ایشون طی تجربیاتی که از کار کردن با کدها داشته، متوجه اهمیت خوانا بودن کدها میشه و تصمیم میگیره تا دانستههای خودش رو با بقیه هم اشتراک بذاره. ایشون چندین کتاب در زمینهی مهندسی نرمافزار منتشر کردهاند. که یکی از محبوبترین اونها کتاب Clean Code هستش. در این مقاله قصد داریم تا با مفهوم کدنویسی تمیز بیشتر آشنا بشیم و در ادامه یه سری راهکارها برای خوانا شدن کدها ارائه کنیم.
مقدمه
یا مثلا بعد از مدتها، تصمیم گرفتین تا به برنامهای که قبلا خودتون نوشتید، مراجعه کنید اما احساس سردرگمی میکردید و از خودتون میپرسید این کدها چه جوری کار میکنه؟ من تا چند ماه پیش که به این مطالب مسلط بودم اما الان نمیتونم درکاش کنم؟
- کدتمیز چیه؟
- کدنویسی تمیز چه اهمیتی داره؟
- مزایای کدنویسی تمیز چیا هستند؟
- چرا کدهای ما کثیف میشن؟
- و در پایان هم یه سری راهکارها برای نوشتن کدهای خوانا ارائه میکنیم.
کدنویسی تمیز چیست؟


همونطور که در تصویر میبینید تصویر یک اتاق در دو وضعیت متفاوت نشون داده شده.
بخش سمت چپ یک اتاق نامنظم هستش و بخش سمت راست همون اتاق هستش با این تفاوت که مرتب شده.
کدنویسی تمیز هم مثل یک اتاق مرتب و منظم میمونه و در مقابل کدکثیف مثل اون اتاق نامرتب هستش.
همونطور که وقتی ما وارد یک اتاق مرتب میشیم و حس و حال خوبی داریم همونطور هم وقتی سراغ کدهای تمیز میریم احساس خوبی داریم. توی یه اتاق تمیز به راحتی میشه به اشیا دسترسی داشت. اگه لازمه بعضی از جاهاش رو تغییر میدیم و در مجموع یه حس مطلوبی داریم و به طور مشابه چنین ویژگیهایی در کد خوانا وجود داره.
اما در مقابل یه اتاق کثیف و نامرتب رو تصور کنید. مثلا موقع راه رفتن تو اون اتاق ممکنه یه شی تیزی تو پاتون فرو بره. تصور کنید قراره یه کتاب از قفسه بردارین احتمال اینکه یه چیزی بیفته تو سرتون وجود داره و در مجموع این اتاق نامرتب حس خوبی به ما نمیده و به طور مشابه کدهای کثیف چینن ویژگیهایی دارند.
درسته هر دو شون یه شباهتی دارند و اونم اینه که به نحوی وسایل مورد نیاز داخل اش به یه ترتیبی قرار گرفته اند اما تفاوت شون حسی هستش که از اونا میگیریم.
اهمیت کدنویسی تمیز
کدنویسی تمیز اهمیت زیادی در توسعه و نگهداری نرمافزار داره. اجازه بدین که با یک نمودار اهمیت این مساله رو واضحتر کنم.

همونطور که در نمودار میبینید، منحنی آبی رنگ مربوط به نرخ رشد هزینه کدنویسی ناخوانا و منحنی سبز رنگ مرتبط با یه کد تمیز هستش.
در شروع زمان توسعه اگرچه کدنویسی کثیف هزینهی کمتری رو از ما میگیره و در مقابل کدنویسی خوانا هزینهی بیشتری صرف میکنه، اما در ادامه میزان هزینه بر اساس تغییرات در منحنی کد کثیف شتاب بیشتری میگیره و با گذشت زمان این مقدار به طور صعودی بیشتر میشه.
در مقابل کدنویسی تمیز اگرچه هزینهی ابتدایی اون زیاد هستش و علت اون هم برنامهریزی و بررسی برای پیادهسازی یک ساختار منظم هستش، اما تقریبا نرخ رشدش ثابت هستش و با گذر زمان میزان هزینههای پروژه تغییر چندانی نمیکنه.
و اینجا هستش که اهمیت کدنویسی تمیز مشخص میشه.
اون چیزی که در برنامهنویسی وجود داره میزان توسعه پذیری اون هستش و اینکه پروژه ما در آینده قابلیت اعمال تغییرات رو داشته باشه.
مزایای کدنویسی تمیز
در ادامه قصد دارم تا به بررسی سه مورد از مزایای کدنویسی خوانا بپردازم.
آسانبودن برای خواندن
در مقدماتیترین سطح، اون شخصی که داره کدهای ما رو میخوانه باید به راحتی بتونه متوجه منطق و روال کدها بشه و خوندن براش آسون بشه.
از ویژگیهای کدهای تمیز، واضح بودن و ابهامات کم در اون هستش.
آسان بودن برای تغییر
یکی دیگه از ویژگیهای کدهای تمیز، آسان بودن برای تغییر هستش. یکی از بخشهای جدایی ناپذیر فرآیند توسعه نرمافزار، اعمال تغییرات هستش. کدهای تمیز به گونهای نوشته میشن که خواننده به راحتی و با کمترین هزینه قادره که در صورت نیاز تغییراتی رو اعمال کنه بدون این که بخشهای دیگه آسیب پذیر بشند.
آسان بودن برای رفع عیب
از ویژگیهای دیگه کدهای خوانا، قابلیت رفع عیب آسان اونا هستش. در فرآیند توسعه نرمافزار گاهی اوقات مشکلاتی و عیبهایی به وجود میاد. در قدم اول برنامهنویس باید قادر به کشف اون باگها بشه و در مرحله بعد بتونه اونا رو تغییر بده. کدهای خوانا قابلیت پیمایش و دسترسی خوبی به بخشهای مختلف دارند و این امکان رو به ما میدن که سریعتر باگها رو کشف و رفع شون کنیم.
چرا کدهای ما کثیف میشه؟
خب در این بخش قصد داریم به این موضوع بپردازیم که چرا کدهای ما کثیف میشن. در ادامه به بررسی دو علت عمده در نامرتب شدن کدها پرداخته میشه.
عدم تجربهی کافی در برنامهنویسی
یکی از دلایلی که باعث ناخوانا شدن کدها میشه، عدم تجربهی کافی برنامهنویس هستش. مثلا فردی رو تصور کنید که به تازگی برنامهنویسی رو یاد گرفته و با سینتکس یه زبان آشنا شده، طبعیتا این فرد در ابتدای مسیر خودش با روشهای کدنویسی تمیز آشنا نیست. و تمرکزش بر اینه که یه کدی بنویسه که خروجی صحیحی داشته باشه. برای مثال ممکنه که کل برنامهی خودش رو داخل یه تابع طولانی تعریف کنه یا مثلا از نامگذاریهای مناسبی استفاده نکنه. که در مجموع این موارد باعث ناخوانا شدن کد میشن.
عجله در تحویل پروژه
عامل بعدی در نامرتب شدن کدها، عجله در تحویل پروژه هستش. گاهی اوقات برنامهنویس به واسطهی اجبار کارفرما مجبور میشه که پروژه رو توی یه بازهی زمانی خیلی فشردهای تحویل بده. در چنین شرایطی اگه حتی اون برنامهنویس یه برنامهنویس نسبتا حرفهای باشه و با اصول کدنویسی تمیز آشنا باشه ممکنه که اصول تمیزنویسی کد رو فدای زمان بکنه و صرفا یه کدی رو بنویسه و پروژه رو تحویل بده و بره. اما چه بسا که چنین کاری در آینده مشکلات و یا اصطلاحا بدهیهای فنی (Technical Debt) به وجود بیاره.
چه جوری کدهای تمیز بنویسیم؟
در پایان این مقاله قراره که چند راهکار کاربردی برای نوشتن کدهای خوانا رو معرفی کنیم.
استفاده از نامهای با معنا
یکی از مهمترین اصولی که باید در کدنویسی تمیز استفاده بشه، استفاده از نامگذاریهای صحیح هستش. نامگذاری به طور کلی شامل متغیرها، توابع، کلاس، آبجکتها، ثابتها و موارد دیگه میشه.
استفاده از نامهای بامعنا باعث درک بهتر کد توسط خواننده میشه. در ادامه چند نکته برای انتخاب نامهای مناسب ذکر شده:
- برای آبجکتها، کلاسها و متغیرها از اسامی (noun) ها استفاده کنید.
- برای توابع و متدها از افعال (verb) ها استفاده کنید.
- از انتخاب نامهای مبهم و دو پهلو تا حد امکان پرهیز کنید و حتی الامکان از نامهای دقیق استفاده کنید.
اصل DRY
یه اصل معروفی در مهندسی نرمافزار وجود داره به نام DRY که مخفف عبارت Don’t Repeat Yourself هستش که به معنای خودت رو تکرار نکن هستش. این اصل به ما میگه که تا حد امکان از تکثیرهای اضافی یا به عبارت ما کپی پیسهای مکرر بپرهیزید و به جای اون سعی کنید که کدها رو به گونهای بنویسید که یکبار تعریف بشن و بعدا به عنوان مرجع در جاهای مختلف برنامه ازش استفاده بشه. حالا چرا این کار اهمیت داره و اگه این اصل رو رعایت نکنیم چه اتفاقی میفته؟
جواب: اگه در آینده نیاز شد که یک بخشی از برنامه رو تغییر بدیم، در این صورت مجبور هستیم که محتوای تمامی اون تکه کدهایی که داخل پروژه تکثیر کردیم رو پیدا کنیم و تک تک تغییرشون بدیم و خب این کار هزینهی زیادی رو برای ما ایجاد میکنه.
برای این کار دو تا راهکار میشه انجام داد.
- اون بخش از کدهایی که قابل تکرار هستند رو شناسایی کنید و اونها را داخل یک تابع قرار بدین. اینجوری فقط کافیه که اون تابع رو فراخوانی کنید و بعدا اگه نیاز به تغییر شد فقط کافیه بدنه تابع رو تغییر بدیم.
- همچنین برای مقادیر ثابت و از پیش تعریف شده خودتون مثل نام ماههای سال متغیرهای ثابتی تعریف کنید و در طول برنامه فقط کافیه که از اون متغیرها استفاده کنید و اگه جایی نیاز به تغییر شد فقط مقادیر متغیرها رو تغییر بدیم و بقیه جاهایی که این متغیرها استفاده شدند بدون تغییر باقی میمونند.
یک وظیفه در هر لحظه
تا اونجایی که میشه سعی کنید که حجم توابع خودتون رو کوچک نگه دارین چون اینجوری مدیریت اون ها هم آسون تره. و اگه متوجه شدین که بخشهایی از یک تابع بزرگتر در حال انجام دادن یک تسک خاص هستند اونا را داخل توابع جداگانهای قرار بدین، اینجوری هم حجم توابع کاهش پیدا میکنه و هم درک کد سریعتر میشه.
استفاده از کامنتها
کامنتها بخشهایی از یک برنامه هستند که توسط کامپایلرها و مفسرها نادیده گرفته میشن و به نوعی توضیحاتی هستند که به درک بهتر کدها توسط برنامهنویسان کمک میکنه.
در قدم اول تا اونجایی که میشه تلاش کنید کدهاتون رو به گونهای بنویسید تا برای شفافسازی بیشتر نیازی به کامنت نباشه، اما اگه گاهی اوقات مجبور به استفاده از اونها میشین بهتره که کامنتهای معناداری رو استفاده کنید تا به بهتر درک شدن کد کمک کنه.
یکی دیگه از فواید کامنتها، مستندسازی پروژه هستش که این موضوع در نگهداری و توسعه نرمافزار یه عامل موثر محسوب میشه.
سخن پایانی
در پایان قصد دارم تا چند نکتهی کلی رو بگم.
خودتون رو جای خواننده بذارین!
همیشه و در هر لحظه سعی کنید که کدهاتون رو به گونهای بنویسید که برای یک شخص جدید نیز قابل فهم باشه و کمترین سوال و ابهام براش پیش بیاد. به عبارتی خودتون رو جای خواننده بذارین و از خودتون بپرسید که آیا مثلا فلان بخش قابل فهم برای طرف مقابل هستش؟ آیا ممکنه براش ابهامی پیش بیاد یا خیر.
کدهای خودتون رو به طور مرتب بازبینی کنید.
یکی از فعالیتهایی که در دورهی حیات یک برنامه باید صورت بگیره، ریفکتور کردن کدها هستش. ریفکتور کردن کدها، به بازبینی و ایجاد تغییر در کدها، بدون ایجاد تغییر در خروجی نهایی و به منظور بهینه کردن کیفیت پروژه انجام میشه.
توصیه میشه که به طور منظم کدهاتون رو بازبینی کنید و اگر جاهایی نیاز به تغییر داره اونها رو اصلاح کنید، چرا که این تغییرات هر چند جزیی در آینده میتونه تاثیر زیادی بر کیفیت نرمافزار بذاره و از مشکلات و بدهیهای فنی جلوگیری کنه.
کدنویسی تمیز یک عادت است.
از نظر من کدنویسی تمیز یک عادت هستش و تنها با دونستن یک سری نکات نمیشه به این موضوع تسلط داشت. باید سعی کنیم که همواره بابه کار بستن اصول اون، این عادت رو در خودمون نهادینه کنیم.
در پایان خوشحال میشم که پیشنهادات و نظرات خودتون رو درباره این مقاله بنویسید.
آشنایی با مفاهیم کدنویسی تمیز + راهکارهای کاربردی برای نوشتن کدهای خوانا

ممنون نکات خوبیه ، بکار بردنش کمی تمرین میخواد