نکات کلیدی
1. نوشتن کد تمیز که خوانا و قابل نگهداری باشد
تنها معیار معتبر برای کیفیت کد: WTFs/minute
خوانایی بسیار مهم است. کد تمیز باید به راحتی توسط سایر توسعهدهندگان قابل درک باشد. باید ساده، زیبا و بدون شلوغی باشد. تلاش کنید کدی بنویسید که هدف خود را به وضوح بیان کند بدون نیاز به توضیحات گسترده. از نامهای متغیر و تابع معنادار استفاده کنید، توابع را کوچک و متمرکز نگه دارید و کد را به صورت منطقی سازماندهی کنید.
قابلیت نگهداری امکان تکامل را فراهم میکند. کدی که تغییر آن دشوار است به یک بدهی تبدیل میشود. کد خود را به گونهای طراحی کنید که انعطافپذیر و ماژولار باشد تا بتواند با تغییرات نیازها سازگار شود. اصولی مانند DRY (خود را تکرار نکنید) و SOLID را دنبال کنید تا سیستمهایی با اتصال ضعیف و انسجام بالا ایجاد کنید. بدون ترس از تغییر رفتار، ساختار کد را بهبود دهید.
کد تمیز سودمند است. در حالی که نوشتن کد تمیز نیاز به تلاش بیشتری در ابتدا دارد، در درازمدت زمان و دردسرهای زیادی را صرفهجویی میکند. کد تمیز راحتتر اشکالزدایی، توسعه و نگهداری میشود. به توسعهدهندگان امکان میدهد کارآمدتر کار کنند و خطر ایجاد باگها در حین تغییرات را کاهش میدهد. کد تمیز را به عنوان بخش اصلی از تمرین توسعه خود قرار دهید.
2. پیروی از قراردادهای نامگذاری معنادار
نام یک متغیر، تابع یا کلاس باید به تمام سوالات بزرگ پاسخ دهد. باید بگوید چرا وجود دارد، چه کاری انجام میدهد و چگونه استفاده میشود.
از نامهای آشکارکننده نیت استفاده کنید. نامهایی را انتخاب کنید که به وضوح هدف و رفتار متغیرها، توابع و کلاسها را منتقل کنند. از نامهای تکحرفی یا اختصارات مبهم پرهیز کنید. از نامهای قابل تلفظ که به راحتی قابل جستجو هستند استفاده کنید. برای مثال:
- بد: d (زمان سپری شده به روز)
- خوب: elapsedTimeInDays
ثابت و دقیق باشید. از قراردادهای نامگذاری ثابت در سراسر کد خود استفاده کنید. برای جلوگیری از ابهام دقیق باشید - به عنوان مثال، از تمایزات معنادار مانند getActiveAccounts() و getActiveAccountInfo() استفاده کنید. از کدگذاریها یا پیشوندهایی که بدون ارزش نویز اضافه میکنند، اجتناب کنید. نام کلاسها باید اسم و نام متدها باید فعل باشند.
طول نام باید با دامنه مطابقت داشته باشد. از نامهای طولانیتر و توصیفیتر برای متغیرها و توابع با دامنههای بزرگتر استفاده کنید. نامهای کوتاه برای دامنههای کوچک و محلی قابل قبول هستند. طول یک نام باید متناسب با دامنه استفاده آن باشد. برای خوانایی و درک در زمینهای که نام استفاده میشود، بهینهسازی کنید.
3. توابع را کوچک و متمرکز نگه دارید
توابع باید یک کار انجام دهند. باید آن را به خوبی انجام دهند. باید فقط آن را انجام دهند.
کوچک زیباست. توابع باید کوچک باشند - معمولاً 5-10 خط طول دارند. باید در یک صفحه جا بگیرند و به سرعت قابل درک باشند. کد را به توابع کمکی با نام خوب استخراج کنید به جای نوشتن توابع طولانی و پیچیده. توابع کوچکتر راحتتر قابل درک، تست و نگهداری هستند.
یک کار را به خوبی انجام دهید. هر تابع باید یک هدف واضح و واحد داشته باشد. اگر یک تابع چندین کار انجام میدهد، آنها را به توابع جداگانه استخراج کنید. نشانههایی که یک تابع بیش از حد کار انجام میدهد شامل:
- سطوح مختلف انتزاع
- بخشها یا بلوکهای کد متعدد
- پارامترهای زیاد
یک سطح انتزاع را حفظ کنید. دستورات درون یک تابع باید همگی در یک سطح انتزاع باشند. منطق سطح بالا را با جزئیات سطح پایین مخلوط نکنید. عملیات سطح پایین را به توابع جداگانه استخراج کنید. این کار خوانایی را با نگه داشتن توابع متمرکز و ساده بهبود میبخشد.
4. تمرین قالببندی و سازماندهی صحیح
قالببندی کد درباره ارتباط است و ارتباط اولین وظیفه توسعهدهنده حرفهای است.
قالببندی ثابت مهم است. از تورفتگی، شکست خط و فاصلهگذاری ثابت در سراسر کد خود استفاده کنید. این کار خوانایی را بهبود میبخشد و بار شناختی را کاهش میدهد. بر روی استانداردهای قالببندی با تیم خود توافق کنید و از ابزارهای خودکار برای اعمال آنها استفاده کنید. راهنماییهای کلیدی قالببندی شامل:
- تورفتگی صحیح
- قرارگیری ثابت براکتها
- شکستهای خط منطقی
- فاصلهگذاری مناسب
کد را به صورت منطقی سازماندهی کنید. کد مرتبط را با هم گروهبندی کنید و کد غیرمرتبط را جدا کنید. از خطوط خالی برای ایجاد شکستهای "پاراگراف" بین بخشهای منطقی استفاده کنید. توابع مرتبط را نزدیک به هم قرار دهید. فایلها را بر روی یک مفهوم یا مؤلفه متمرکز نگه دارید. فایلهای بزرگ را به فایلهای کوچکتر و متمرکزتر تقسیم کنید در صورت لزوم.
از قراردادهای استاندارد پیروی کنید. به قراردادهای استاندارد برای زبان و جامعه خود پایبند باشید. این کار کد شما را برای سایر توسعهدهندگان آشنا و قابل دسترستر میکند. برای مثال، در جاوا:
- نام کلاسها از PascalCase استفاده میکنند
- نام متدها از camelCase استفاده میکنند
- ثابتها از ALL_CAPS استفاده میکنند
5. مدیریت وابستگیها و اجتناب از تکرار
تکرار ممکن است ریشه همه شرارتها در نرمافزار باشد.
تکرار را حذف کنید. کد تکراری یک فرصت از دست رفته برای انتزاع است. وقتی تکرار را میبینید، کد مشترک را به یک تابع یا کلاس قابل استفاده مجدد استخراج کنید. این کار قابلیت نگهداری را با متمرکز کردن منطق و کاهش خطر تغییرات ناسازگار بهبود میبخشد. انواع تکرارهایی که باید مراقب آنها باشید:
- بلوکهای کد یکسان
- الگوریتمهای مشابه با تغییرات جزئی
- زنجیرههای switch/case یا if/else تکراری
وابستگیها را با دقت مدیریت کنید. وابستگیها بین ماژولها را به حداقل برسانید تا اتصال کاهش یابد. از تزریق وابستگی و وارونگی کنترل برای ماژولار و قابل تست کردن کد استفاده کنید. از اصل وارونگی وابستگی پیروی کنید - به انتزاعات وابسته باشید، نه به پیادهسازیها. این کار کد شما را انعطافپذیرتر و تغییرپذیرتر میکند.
از اصل کمترین دانش استفاده کنید. یک ماژول نباید درباره جزئیات داخلی اشیایی که دستکاری میکند بداند. این کار اتصال بین ماژولها را کاهش میدهد. برای مثال، از قانون دیمتر استفاده کنید - یک متد باید فقط متدهایی را فراخوانی کند که:
- متعلق به شیء خود آن است
- به عنوان پارامترها ارسال شدهاند
- آنها را ایجاد میکند
- اشیاء مؤلفه مستقیم آن هستند
6. خطاها را به صورت مؤثر مدیریت کنید
مدیریت خطا مهم است، اما اگر منطق را مبهم کند، اشتباه است.
از استثناها به جای کدهای خطا استفاده کنید. استثناها تمیزتر هستند و منطق اصلی کد شما را شلوغ نمیکنند. آنها اجازه میدهند مدیریت خطا از مسیر اصلی جدا شود. هنگام استفاده از استثناها:
- پیامهای خطای آموزنده ایجاد کنید
- با استثناها زمینه فراهم کنید
- کلاسهای استثنا را بر اساس نیازهای فراخواننده تعریف کنید
null را برنگردانید. برگرداندن null منجر به استثناهای اشارهگر null میشود و کد را با بررسیهای null شلوغ میکند. به جای آن:
- مجموعههای خالی را به جای null برای لیستها برگردانید
- از الگوی شیء Null استفاده کنید
- از Optional در جاوا یا Maybe در زبانهای تابعی استفاده کنید
ابتدا عبارات try-catch-finally را بنویسید. با try-catch-finally شروع کنید وقتی کدی مینویسید که ممکن است استثناها را پرتاب کند. این کار به تعریف دامنه و انتظارات برای کد فراخوان کمک میکند. اطمینان حاصل میکند که منابع به درستی مدیریت و آزاد میشوند، حتی در سناریوهای خطا.
7. تستهای واحد جامع بنویسید
کد تست به اندازه کد تولید مهم است.
از سه قانون TDD پیروی کنید. توسعه مبتنی بر تست (TDD) کیفیت و طراحی کد را بهبود میبخشد:
- قبل از نوشتن هر کد تولیدی، یک تست شکستخورده بنویسید
- فقط به اندازه کافی از یک تست بنویسید تا یک شکست را نشان دهد
- فقط به اندازه کافی کد تولیدی بنویسید تا تست را پاس کند
تستها را تمیز و قابل نگهداری نگه دارید. همان استانداردهای کیفیت کد را برای تستهای خود اعمال کنید که برای کد تولیدی خود اعمال میکنید. کد تست را به طور منظم بازسازی و بهبود دهید. تستهای ساختاریافته به عنوان مستندات عمل میکنند و امکان بازسازی بدون ترس از کد تولیدی را فراهم میکنند.
به پوشش تست جامع هدف بگیرید. تستهایی بنویسید که موارد لبه، شرایط مرزی و سناریوهای خطا را پوشش دهند - نه فقط مسیر خوشحال. از ابزارهای پوشش کد برای شناسایی شکافهای پوشش تست استفاده کنید. به یاد داشته باشید که پوشش 100% تضمین نمیکند که کد بدون باگ است، اما اعتماد به نفس در بازسازی و تغییرات را فراهم میکند.
8. کد را به طور مداوم بازسازی کنید
کمپینگ را تمیزتر از آنچه پیدا کردید ترک کنید.
به صورت فرصتطلبانه بازسازی کنید. هر زمان که روی یک قطعه کد کار میکنید، ساختار کد را بهبود دهید. از قانون پیشاهنگی پیروی کنید: کد را بهتر از آنچه پیدا کردید ترک کنید. بهبودهای کوچک و تدریجی در طول زمان جمع میشوند و از پوسیدگی کد جلوگیری میکنند. تکنیکهای رایج بازسازی شامل:
- استخراج متدها یا کلاسها
- تغییر نام برای وضوح
- سادهسازی شرطهای پیچیده
- حذف تکرار
با تستها به صورت ایمن بازسازی کنید. همیشه قبل از بازسازی یک مجموعه تست قوی داشته باشید. تغییرات کوچک و تدریجی انجام دهید و تستها را به طور مکرر اجرا کنید. این کار به شما اطمینان میدهد که تغییرات شما عملکرد موجود را خراب نمیکند. از ابزارهای بازسازی خودکار در صورت موجود بودن استفاده کنید تا خطر معرفی خطاها کاهش یابد.
تعادل بازسازی با ارائه ارزش. در حالی که بازسازی مداوم مهم است، اجازه ندهید که پیشرفت را فلج کند. به جای کمال، به "به اندازه کافی خوب" هدف بگیرید. تلاشهای بازسازی را بر روی مناطق مشکلساز یا به طور مکرر تغییر یافته کد متمرکز کنید. ارزش بازسازی را به ذینفعان منتقل کنید تا از پشتیبانی برای بهبود مداوم کد اطمینان حاصل کنید.
9. اصول برنامهنویسی شیءگرا و تابعی را اعمال کنید
اشیاء دادههای خود را پشت انتزاعات پنهان میکنند و توابعی را که بر روی آن دادهها عمل میکنند، آشکار میکنند. ساختارهای داده دادههای خود را آشکار میکنند و توابع معناداری ندارند.
از اصول شیءگرا به درستی استفاده کنید. اصولی مانند کپسولهسازی، وراثت و چندریختی را برای ایجاد طراحیهای انعطافپذیر و ماژولار اعمال کنید. از اصول SOLID پیروی کنید:
- اصل مسئولیت واحد
- اصل باز-بسته
- اصل جایگزینی لیسکوف
- اصل جداسازی رابط
- اصل وارونگی وابستگی
از مفاهیم برنامهنویسی تابعی بهره ببرید. حتی در زبانهای شیءگرا، تکنیکهای برنامهنویسی تابعی میتوانند به کد تمیزتر منجر شوند:
- توابع خالص بدون اثرات جانبی
- دادههای تغییرناپذیر
- توابع مرتبه بالا
- ترکیب توابع
رویکرد مناسب برای مسئله را انتخاب کنید. پارادایمهای شیءگرا و تابعی هر کدام نقاط قوت و ضعف خود را دارند. از طراحی شیءگرا زمانی استفاده کنید که نیاز به مدلسازی دامنههای پیچیده با رفتار دارید. از رویکردهای تابعی برای تبدیل دادهها و پردازش خطوط استفاده کنید. بسیاری از زبانهای مدرن از یک رویکرد ترکیبی پشتیبانی میکنند، که به شما اجازه میدهد بهترین ابزار را برای هر بخش از سیستم خود استفاده کنید.
10. همزمانی را با دقت در نظر بگیرید
همزمانی یک استراتژی جداسازی است. به ما کمک میکند آنچه انجام میشود را از زمانی که انجام میشود جدا کنیم.
چالشهای همزمانی را درک کنید. برنامهنویسی همزمان پیچیدگی و پتانسیل برای باگهای ظریف را معرفی میکند. مسائل رایج شامل:
- شرایط مسابقه
- بنبستها
- سیگنالهای از دست رفته
- مشکلات دید حافظه
نگرانیهای همزمانی را جدا کنید. کد مربوط به همزمانی را از کد دیگر جدا نگه دارید. این کار باعث میشود که راحتتر قابل درک و تست باشد. از انتزاعاتی مانند Executors، Futures و Actors برای مدیریت همزمانی استفاده کنید به جای کار با رشتههای خام.
تغییرناپذیری و توابع خالص را ترجیح دهید. اشیاء تغییرناپذیر و توابع خالص به طور ذاتی ایمن در برابر رشته هستند. آنها بسیاری از مسائل همزمانی را با اجتناب از حالت مشترک قابل تغییر حذف میکنند. هنگامی که حالت قابل تغییر ضروری است، از تکنیکهای همگامسازی مناسب استفاده کنید و در نظر بگیرید که از متغیرهای اتمی یا مجموعههای همزمان استفاده کنید.
آخرین بهروزرسانی::
نقد و بررسی
کتاب کد تمیز به دلیل اصول خود در نوشتن کدی خوانا و قابل نگهداری، عمدتاً نقدهای مثبتی دریافت میکند. خوانندگان از توصیههای عملی در مورد نامگذاری، توابع و تست قدردانی میکنند. تمرکز کتاب بر جاوا و برخی راهنماییهای بیش از حد سختگیرانه از جمله انتقادات رایج است. بسیاری آن را مطالعهای ضروری برای توسعهدهندگان میدانند، اگرچه برخی آن را برای برنامهنویسان با تجربه کمتر مفید میدانند. مطالعات موردی و مثالهای بازسازی کد توسط برخی تحسین و توسط دیگران به عنوان بیش از حد انجام شده نقد میشود. به طور کلی، منتقدان توافق دارند که کتاب بینشهای ارزشمندی در مورد کیفیت کد ارائه میدهد، حتی اگر همه پیشنهادات به طور جهانی قابل اجرا نباشند.