آنچه در این صفحه می خوانید:
- معرفی کدنویسی تمیز (Clean Code)
- ویژگی های کدنویسی تمیز (Clean Code)
- اصول کدنویسی تمیز (Clean Code)
- اهمیت استفاده از کدنویسی تمیز (Clean Code)
- بهترین روش برای نوشتن کدنویسی تمیز (Clean Code)
معرفی کدنویسی تمیز (Clean Code)
کد تمیز (Clean Code)، کدی است که به راحتی قابل فهم و قابل تغییر باشد. این محبوب ترین تعریف از کد نویسی تمیز است. حتی کد بد هم می تواند کار کند. اما اگر کدنویسی تمیز نباشد، می تواند توسعه یک سازمان را به زانو درآورد. هر ساله ساعت های بی شماری و منابع قابل توجهی به دلیل کد نویسی ضعیف از بین می روند، اما لازم نیست اینگونه باشد. رابرت سی مارتین، متخصص نرم افزار، پارادایم انقلابی را با کد خالص در یک کتابچه راهنمای نرم افزار چابک (Agile) ارائه می دهد.
Clean Code به سه قسمت تقسیم می شود. اولین اصول، الگوها و شیوه های نوشتن کد تمیز را شرح می دهد. بخش دوم شامل چندین مطالعه موردی در مورد افزایش پیچیدگی است. هر مطالعه موردی، تمرینی در تمیز کردن کد است. تبدیل به کدی که برخی از مشکلات را به حالت سالم و کارآمد می کند. بخش سوم بازپرداخت است: یک فصل واحد شامل لیستی از اکتشاف ها و "smells" که در هنگام ایجاد مطالعات موردی جمع آوری شده است. نتیجه یک دانش بنیادی است که نحوه تفکر هنگام نوشتن، خواندن و تمیز کردن کد را توصیف می کند.
کدنویسی تمیز یک سبک توسعه متمرکز بر خواندن کد است که نرم افزاری را تولید می کند که برای نوشتن، خواندن و نگهداری آسان است. زمانیکه برنامه ای طبق انتظارات اجرا می شود غالبا توسعه دهندگان وسوسه می شوند تا کار خود را تکمیل کنند. اما ما صرفا برای مصارف کامپیوتری کدنویسی نمی کنیم. در مواردی کدنویسی تمیز در مورد شناسایی برخی افراد است که مخاطبان فقط یک کامپیوتر نیستند، بلکه آن ها انسان های واقعی هستند.
تا حد امکان کدنویسی باید به زبان انسان ها نزدیک باشد و این اصل باید در تمامی سطوح مانند سینتکس استفاده شده، نامگذاری کنوانسیون و هم ترازی با تمام الگوریتم های استفاده شده، کیفیت نظرات و پیچیدگی توزیع کد بین ماژول ها رعایت شود. کد نویسان تمیز با استفاده از ابزار ها پیچیدگی ها را مدیریت می کنند و یک موضوع را به طور واضحی توضیح می دهد. پیاده سازی اصول کدنویسی تمیز یک مهارت پایه ای است که به ویژه در هنگام بازنویسی کد یا تست کد، کاربرد دارد. اصول کدنویسی تمیز منجر به سورس کدی می شود که برای خواندن و تست آسان است.
ویژگی های کدنویسی تمیز (Clean Code)
هنگامی که شما شروع به تجزیه و تحلیل اصول کد تمیز می کنید، ممکن است از شخصی تا شخص دیگر متفاوت باشد. در اینجا چند راهنمایی وجود دارد که تقریباً به صورت جهانی پذیرفته شده اند.
تقریباً هر کلاس برنامه نویسی را در نظر بگیرید و مربی یا کارفرمای شما در بعضی مواقع به اهمیت نوشتن «کد تمیز» اشاره خواهد کرد. این ممکن است به اندازه کافی شهودی به نظر برسد. اما وقتی شروع به تجزیه اصول کد تمیز می کنید، به سرعت می فهمید که توضیح آن به عنوان کد تمیز بسیار دشوار است.
برای یک بار، از برنامه نویسان مختلف بخواهید که کد تمیز را تعریف کنند، و شما تقریباً پاسخ های متفاوتی خواهید گرفت. احتمالاً بیشترین استناد به تعریف کد تمیز (حداقل برای نسل فعلی برنامه نویسان) تعریفی است که رابرت مارتین در کتاب خود در سال 2008 با عنوان "Code Code" ارائه کرده است. اطمینان از اینکه دیگران می توانند کد شما را به راحتی تفسیر و اصلاح کنند، عموماً ایده خوبی است. اما اینکه آیا این امر در عمل اهمیت دارد می تواند متفاوت باشد. همه افراد کدی را نمی نویسند که افراد دیگر آن را درک کنند.
بعلاوه، در تعیین آنچه که کد را برای دیگران قابل فهم می کند و اینکه برای دستیابی قابل درک است، از ذهنیت بالایی برخوردار است. به عنوان مثال، بیشتر برنامه نویسان می دانند "++i" به چه معنی است، و ترجیح می دهند به جای نوشتن یک عبارت خسته کننده تر "i = i + 1" از آن برای اعداد صحیح استفاده کنید. اما "++i" یک عبارت کوتاه است و ابهام و عدم اطمینان را پرورش می دهند. اگر واقعاً نگران به حداکثر رساندن خوانایی کد خود هستید، آیا نباید به فرمول طولانی تر و خسته کننده تری ادامه دهید؟
- مدولار بودن و سادگی
مکتب فکری دیگری نشان می دهد که کد تمیز، کدی است که مدولار و ساده است. این منطق بیان شده برای مثال، استدلال می کند که کد تمیز "متمرکز شده است. هر تابع، هر کلاس، هر واحد دارای یک نگرش ذهنی است." این همان خط کلی فکری است که پشت علاقه فعلی به خدمات خرد است و این ایده که برنامه های "یکپارچه" باید به بخش های کوچکتر و ساده تری تقسیم شوند.قطعاً سادگی ارزش دارد. اما بعید است که هر برنامه نویس موافقت کند سادگی باید تمرکز اصلی در نوشتن کد باشد. سادگی اغلب دارای مبادلات تجاری است. به عنوان مثال، یک پایگاه کد که از بسیاری از توابع یا کلاس های کوچک، ساده تشکیل شده است، احتمالاً ادغام، ساخت و استقرار آن دشوارتر از مدلی است که از قطعات متحرک کمتری تشکیل شده است. این به این معنا نیست که تلاش اضافی ارزش آن را ندارد. شاید همینطور باشد. اما شما باید این مورد را به صورت موردی ارزیابی کنید.
- کد "ظریف"
اصطلاح دیگری که اغلب در مکالمات مربوط به کد تمیز مکرراً می شنوید "ظرافت" است. منظور از ظرافت دقیقاً در متن برنامه نویسی بستگی به این دارد که چه کسی از شما بخواهد. اما، به طور کلی، وقتی برنامه نویسان درباره کد ظریف صحبت می کنند، منظور از کد هایی هستند که به همان اندازه کوتاه، شیرین و باهوش هستند. برای اکثر برنامه نویسان، رشته ای طولانی از کد که دسته ای از اپراتورهای شرطی را به یک خط واحد منتقل می کند، بسیار ظریف نیست. یک بند شرطی، چند خطی شرطی اگر Else / If ظریف تر در نظر گرفته شود.
مشکلی که در مورد ایده ظرافت وجود دارد فقط این نیست که ظرافت سخت است، اما این کد ظریف اغلب با کد کارآمد مغایرت دارد. بند شرطی چند خطی شما برای نوشتن کلید بیشتر از یک جمله تک خطی است که به عملکرد یکسانی دست پیدا می کند. همچنین می تواند فایل های سورس شما را بزرگتر کند. به شکلی دور، این اشکالاتی با ایده ظرافت در تضاد است: هرچه کد شما در ظاهر ظریف تر باشد، روند نگارش و مدیریت آن ظریف تر خواهد بود.
اصول کدنویسی تمیز (Clean Code)
کد بد تا 2000 سال کار می کند. درک کد بد دشوار است، پیچیده تر از آنچه باید باشد ولی تست آن آسان نیست و باعث می شود سایر توسعه دهندگان با سرخوردگی همراه شوند. در حالی که نوشتن کد تمیز در کوتاه مدت ممکن است بیشتر طول بکشد، نوشتن کد تمیز باعث صرفه جویی در وقت، تلاش و نهایتا پول خواهد شد.
اصول کدنویسی تمیز
کد تمیز به قوانین خاص زبان متکی نیست. در عوض، آن را به اصول زبان آگنوستیک که توسط جامعه توسعه دهنده توافق شده است، تکیه می کند.
KISS: آن را ساده احمق نگه دارید. یک اصل طراحی منشاء نیروی دریایی ایالات متحده است که به سال 1960 باز می گردد. این اظهار می دارد که بیشتر سیستم ها باید تا حد امکان ساده نگه داشته شوند (همانطور که انیشتین گفته بود ساده تر نیست). از پیچیدگی های غیر ضروری باید جلوگیری کرد. سوالی که باید هنگام نوشتن کد بپرسید این است که "آیا می توان این کار را به روشی ساده تر نوشت؟"
DRY: خود را تکرار نکنید. ارتباط نزدیک با KISS و فلسفه طراحی مینیمالیستی دارد. بیان می کند که هر یک از دانش (کد، در این مورد) باید دارای یک نمایندگی واحد، بدون ابهام و معتبر در یک سیستم (پایگاه داده) باشد. نقض DRY به WET گفته می شود: از تایپ کردن لذت می بریم، همه چیز را دو بار بنویسید، وقت همه را هدر دهید.
YAGNI: شما به آن احتیاج ندارید. یک توسعه دهنده نباید تابعی را اضافه کند مگر اینکه لازم باشد. YAGNI بخشی از روش Extreme Programming (XP) است که می خواهد کیفیت نرم افزار را بهبود ببخشد و پاسخگویی به نیاز مشتری را افزایش دهد. YAGNI باید در رابطه با پالایش مداوم، تست واحد و تست ادغام مورد استفاده قرار گیرد.
فرمول روی وراثت (Composition over inheritance): این یک اصل است که در آن انواع خود را به جای آنچه که انجام می دهند طراحی می کنید. یکی از راه های اجرای این اصل با روش ()Object.assign در ES6 است. این ترکیب مورد علاقه وراثت توسط بسیاری از توسعه دهندگان است، زیرا ارث شما را وادار می کند تا در اوایل یک پروژه، یک طبقه بندی اشیاء را بسازید، و بعداً کد خود را برای تغییرات غیر انعطاف پذیر کنید.
خوانایی مطلوب: به این دلیل نیست که یک ماشین می تواند کد شما را که یک انسان دیگر می تواند بخواند. به خصوص هنگام کار با چندین نفر بر روی یک پروژه، همیشه خواندن را بخاطر موجز بودن موافقید. در صورتی که مردم آن را نفهمند، هیچ مفهوم مختصری وجود ندارد.
روش های زیادی برای خواندن کد شما وجود دارد. دو مثال عبارت است از قرار دادن اعداد معمولی در ثابت های به خوبی نامگذاری شده (به عنوان مثال const CACHE_TIME = 200؛) و ایجاد نام های طولانی به جای موارد کوتاهتر (به عنوان مثال userHasFormAccess از دسترسی به آن استفاده می کند، که چیز زیادی را نمی گوید).
تمرین ثبات: این مساله مسلماً اصلی ترین اصل کلیه اصول کد تمیز است. اگر تصمیم دارید کاری را به روش خاصی انجام دهید، در کل پروژه به آن بچسبید. اگر چاره ای جز فاصله گرفتن از انتخاب اصلی خود ندارید، علت آن را در کامنت توضیح دهید.
اهمیت استفاده از کدنویسی تمیز (Clean Code)
ممکن است از خود بپرسید چرا باید به نوشتن کد تمیز اهمیت دهیم؟ دلایل زیادی برای ورود به ذهنیت کد تمیز وجود دارد. برخی از مهمترین دلایل عبارتند از:
- استفاده بهتر از وقت شما
اولین نفع کد تمیز، خود برنامه نویس است. اگر ماه ها در حال کار روی یک پروژه هستید، کارهایی را که در کد انجام داده اید، فراموش می کنید، به ویژه هنگامی که مشتری شما با تغییراتی روبرو شود، آسان است. پاک کردن خطوط کد، ایجاد تغییرات را آسانتر می کند.
- پیاده سازی آسانتر برای اعضای جدید تیم
استفاده از اصول کد تمیز به شما کمک می کند تا یک برنامه نویس جدید وارد شوید. برای درک کد نیازی به مستندات نیست. برنامه نویس جدید می تواند مستقیماً وارد آن شود. این امر همچنین باعث صرفه جویی در زمان آموزش برنامه نویس جدید و همچنین زمان لازم برای تنظیم برنامه نویس جدید با پروژه می شود.
- اشکال زدایی آسان تر
چه کد بد و چه تمیز بنویسید، اشکالات اجتناب ناپذیر است. اما کد تمیز به شما کمک می کند تا بدون در نظر گرفتن تجربه یا تخصص شما، هر چه سریعتر اشکال بزنید و معمول نیست که همکاران یا مدیران شما برای حل مشکل به شما کمک کنند. اگر کد تمیز نوشته اید، مشکلی وجود ندارد: آنها می توانند به بیرون پرش کرده و به شما کمک کنند.
- تعمیر و نگهداری کارآمد تر
"البته کد بد را می توان تمیز کرد. اما بسیار گران است. " - روبرت سی مارتین.
تعمیر و نگهداری به رفع اشکال اطلاق نمی شود. با رشد هر پروژه، به ویژگی های جدید یا تغییر در ویژگی های موجود نیاز خواهید داشت. آیا می دانید هزینه اصلی هر پروژه نرم افزاری در نگهداری است؟ این شرکت همیشه نسخه اولیه یا حداقل محصول قابل استفاده (MVP) را در اسرع وقت منتشر می کند. با استفاده بیشتر از نرم افزار، ویژگی های اضافی یا جدید همیشه یک پس زمینه است. کد تمیز نگهداری را نسبتاً سریع و آسان می کند. این سه نکته اول توضیح می دهد که چگونه کد تمیز می تواند باعث صرفه جویی در وقت یک برنامه نویس شود. و صرفه جویی در وقت کم هر روز، تأثیر کاملی در زمان تحویل و هزینه نرم افزار خواهد داشت. این برای شرکت شما خوب است.
- احساس خوبی می کنید
آیا به شما کمک می کند در انجام کار خود با دیگران اعتماد به نفس داشته باشید؟ یا با مشتری خود؟ اگر در حال نوشتن کیفیت، کد تمیز هستید، باید اعتماد به نفس بالایی داشته باشید. شما نباید ترس از شکست داشته باشید. می توانید سریعتر نقص ها را برطرف کنید و این بدان معناست که شما نیز احتمالاً از برنامه نویسی لذت می برید.
بهترین روش برای نوشتن کدنویسی تمیز (Clean Code)
نکته اصلی در هر بحث درباره کد تمیز این است که کد تمیز در چشم بیننده است. و مشاهده کننده می تواند نویسنده اصلی باشد، یک نگهدارنده جدید که وقتی برنامه نویس اصلی خود کار جدیدی بدست می آورد، مسئولیت کد می شود یا یک نوجوان کنجکاو که مخزن گیت هاب (GitHub) شما را مرور می کند.
برای پیچیده تر کردن امور، بسیاری از تلاش ها برای تعریف کد تمیز شامل اصطلاحات یا ایده هایی هستند که خودشان بسیار مبهم هستند مانند سادگی و ظرافت. با این حال، حداقل چند روش اصلی خوب وجود دارد که می توانید دنبال کنید تا کدی را تهیه کنید که در نگاه اکثر مردم کاملاً تمیز باشد:
- تورفتگی: برخی از زبان های برنامه نویسی (مانند پایتون) در مورد مجبور کردن شما به یک روش تمیز بسیار سخت و حساس هستند. برخی دیگر به شما اجازه می دهند هرچه دلتان می خواهد را انجام دهید (به عنوان مثال کد اچ تی ام ال (HTML) ). اگر به کد تمیز اهمیت می دهید، یک سیاست اساسی را در مورد زمان و چقدر برای نوشتن کد خود ایجاد می کنید، و آن را برای هر خط کدی که می نویسید، دنبال خواهید کرد.
- نامگذاری: به عنوان بهترین روش، از متغیرها، کلاس ها و سایر مؤلفه های کد خود از اسامی استفاده کنید که معقول و قابل خواندن برای انسان ها باشد، از جمله افراد غیر بومی زبان شما. ممکن است برای نامگذاری متغیر database$ خود بیش از db$ یا فقط x$ نیاز به چند ضربه کلید بیشتر داشته باشد، اما نام معنی دار این امکان را برای خواندن کد شما برای سایر افراد فراهم می کند (و برای شما به خاطر می آورد که کد چیست).
- کامنت: استفاده از کامنت ها آزاد است و هیچ دلیلی برای استفاده قاطعانه از آنها برای کمک به خود و دیگران در درک کد شما وجود ندارد. چند اظهار نظر کوتاه می تواند مسیری طولانی را طی کند تا در غیر این صورت کد بیزانس قابل درک باشد. کامنت ها ممکن است کد شما را بسیار تمیز نکند، اما می تواند به کمبود تمیزی کمک کند.
- ثبات: مهم نیست که کدام روش های رمزگذاری را دنبال می کنید. بهتر است کد شما دارای ثبات باشد حتی اگر كد ناپسند را از بعضی جهات بنویسید مانند عدم انجام تورفتگی.
گذشته از این موارد اشاره شده، اکثر شیوه های برنامه نویسی تمیز ذهنی است، یا تا حد زیادی به متن بستگی دارد (مانند زبان شما از آن استفاده می کنید، یا اینکه کد شما یک پروژه شخصی یا شرکتی است). قبول همه در مورد آنچه که به عنوان کد تمیز حساب می شود، یک عمل اشتباه است.