Clean Code
مقدمه
آیا تا به حال فکر کردهاید که چند درصد وقت خود را مشغول نوشتن، و چند درصد آن را مشغول خواندن کد هستید؟ شاید تا به حال در توسعه پروژههای کوچک چندهزارخطی، اغلب وقت شما به نوشتن کد صرف شده باشد، اما واقعیت آن است که در پروژههای صنعتی و بزرگ، بیشتر وقت شما صرف خواندن و مطالعه کد خواهد شد! همین موضوع نشان میدهد که خوانایی و تمیز بودن کد از اهمیت بالایی برخوردار است.
در این فاز قرار است با مفاهیم و تکنیکهای افزایش کیفیت کد آشنا شویم و پروژه فاز قبل را به یک کد بسیار با کیفیت تبدیل کنیم. در نهایت نیز کد خود را با سایر کارآموزان به اشتراک میگذاریم و کد آنها را Review خواهیم کرد.
قبل از شروع اما یک برنچ جدید برای این منظور ایجاد کنید تا تمیزسازی را در آن انجام دهیم.
هنر کد تمیز!
در ابتدا در مورد دو سوال زیر فکر کنید و با همتیمی خود بحث کنید و پاسخ خود را در ایشو بنویسید:
- چرا تمیز بودن کد و داشتن معماری خوب مهم است؟ چرا باید وقت و انرژی زیادی صرف طراحی و نوشتن کد تمیز شود؟
- چرا این موضوع در ابعاد صنعتی اهمیت بسیار بیشتری پیدا میکند؟
تلاش کنید فقط با فکر خودتان و بحث با همتیمی به جواب سوالات بالا برسید تا ذهن شما برای مراحل بعد آماده شود.
لطفا قبل از فکر کردن به این سوالات به سراغ مراحل بعدی و خواندن مقالات نروید!
حال برای فهم دلایل اهمیت کد تمیز در صنعت، The Importance of Clean Code را در جواب سوال اول و Why software maintainability is crucial - TechHQ را در جواب سوال دوم مطالعه کنید.
احتمالا تا به حال نام کتاب clean code را شنیدهاید. خوب است برای فهم پاسخ سوال بالا، فصل اول این کتاب را در نیز مطالعه کنید. نویسنده این کتاب یعنی Robert C.Martin که به uncle bob مشهور است، دورهای نیز با همین عنوان دارد که در قالب ویدیو، فصول مختلف این کتاب را توضیح میدهد. لذا به جای مطالعه کتاب، میتوانید از این ویدیو نیز استفاده کنید.
همچنین توجه شود که ما در طول مسیر کاری خود به عنوان مهندس نرمافزار، حتما به قسمتهای دیگر این کتاب نیز مراجعه خواهیم کرد و مسیر رشد شما از این کتاب خواهد گذشت، اما در این بخش تنها به مطالعه همین فصل از کتاب بسنده میکنیم. در انتهای همین فاز نیز لینکی حاوی خلاصهای از فصول کتاب قرار داده شده است.
اصول S.O.L.I.D
تا به حال، به بررسی مواردی پرداختیم که صرفا به کوچک و بزرگی توابع و کلاسها، عدم استفاده از کد تکراری و مسائل سطحی در تمیزی کد اشاره میکردند. اما یکی از مهمترین نکات در کدنویسی تمیز، داشتن یک معماری تمیز است!
تصور کنید بخواهید پروژهتان را بزرگ و بزرگتر کنید و قابلیتهای متعدد دیگری را به آن اضافه کنید. امروز ممکن است بخواهید خروجی برنامه را در کنسول، و روز دیگر ممکن است بخواهید آن را در وبسایت مشاهده کنید. نکته بسیار مهم آنکه نیازمندیهای پروژهها و قابلیتهایی که دارند، در طول زمان دچار تغییر میشوند و باید دوباره به کد اصلی مراجعه کنیم و امکانات آن را بیشتر و بهتر کنیم. اما اگر معماری ما تمیز نباشد، این کار بسیار پرهزینه خواهد بود، به طوریکه شاید هزینه از اول نوشتن و ساختن آن پروژه کمتر باشد.
اصول پنجگانه SOLID یکی از مهمترین مجموعه اصول مهندسی نرمافزار است که به ما در طراحی و معماری صحیحتر یک سیستم کمک میکند. به گونهای که ایجاد تغییر و افزودن امکانات بیشتر به پروژه، سریعتر و راحتتر انجام شود. این اصول عبارتاند از:
- Single Responsibility
- Open for Extension/Closed for Modification
- Liskov Substitution
- Interface Segregation
- Dependency Inversion
برای آشنایی با اصول SOLID لینکهای زیر را مطالعه کنید:
برای مطالعه بیشتر میتوانیدA Solid Guide to SOLID Principles را مطالعه کنید. همچنین توصیه میشود در صورت نیاز، هر یک از اصلها را به طور مجزا مطالعه نموده تا مفهوم آن را به طور عمیقی درک کنید.
جستجوی کثیف!
هماکنون که مفاهیم مختلف مربوط به کد تمیز را یاد گرفتهاید، احتمالا ایدههای زیادی برای بهبود سرویس جستجویی که در فاز قبل پیاده کردهاید به ذهنتان رسیده است. اینکه چطور از اصول solid استفاده کنیم، چه code smell هایی در کدمان وجود دارد، و اینکه چطور میتوان معماری برنامه را به گونهای طراحی کرد تا توسعه قابلیت روی آن سادهتر شود.
به عنوان پروژه این بخش میخواهیم به سراغ پروژه جستجوی فاز قبل رفته و آن را تمیز کنیم. اما این بار با این فرض که میخواهیم، موتور جستجوی خودمان را در قالب یک کتابخانه به دنیا معرفی کنیم، یا به طور سادهتر، در گیتهاب به عنوان یک ابزار آن را ارائه کنیم.
در این صورت لازم است کتابخانه ما انعطاف مناسبی را در اختیار برنامهنویسانی که از آن استفاده میکند قرار بدهد، تا در صورت نیاز، آن فرد بتواند استفادههای خاصمنظوره خودش را نیز با کتابخانه ما برطرف کند. با این نگاه، لازم است نکات زیر را مد نظر قرار دهید و ببینید چگونه میتوانید آنها را برطرف کنید.
با مفهوم normalization در فاز قبل آشنا شدیم. تصور کنید بسته به نیاز، یک فرد بخواهد از روش خاصی برای این کار استفاده کند؛ مثلا بخواهد همه نقطهها و علائم نگارشی را حذف کند.
به عنوان یک گام مهم در ساخت inverted index، از مفهوم tokenizer استفاده کردیم تا کلمات را بر حسب
space
از هم جدا کنیم. اما اگر فردی بخواهد بر اساس معیارهای خودش (مثلا بر حسب،
(ویرگول) این کار را بکند) چطور؟
امکاناتی که در این فاز و فازهای بعد ذکر میشوند، مسیر جالبی را طی خواهند کرد تا در نهایت شما را به یک نسخه سادهشده از یکی از بزرگترین پروژههای متنباز دنیا در زمینه جستجو برسانند! شما هم میتوانید مشابه سادهشده این سرویس را پیادهسازی کرده و آن را با امکاناتی که خودتان طراحی کردهاید در دسترس برنامهنویسان جهان قرار دهید!
Code Review
بخش مهمی از یادگیری اصول کدنویسی تمیز، هنگام بررسی کدهای دیگران و یافتن نقاط قوت و ضعف آنها ایجاد میشود. همچنین با این کار، شما روشهای مختلف حل مسئله را توسط افراد دیگر خواهید داد و میتوانید از آنها ایده بگیرید.
در این قسمت، ابتدا یک Pull Request ایجاد کنید و از یک تیم دیگر بخواهید Pull Request شما که در مرحلهی قبل ساختهاید را Review کنند و بر اساس لیست Code Smellها به شما بازخورد بدهند (روی Pull Request کامنت بگذارند)، در این مرحله حتما از تیمهای دیگر هم سراغ شما میآیند و میخواهند کدشان را Review کنید، قبل از Review کد دیگران، راهنماهای زیر را مطالعه کنید و Review خود را بر اساس این راهنماها انجام دهید:
با توجه به این که در این فاز صحبتی در مورد انواع تست به خصوص Unit Test نکردیم قسمتهایی از لینکهای بالا که در مورد تست است را نادیده بگیرید.
معماری، طراحی و تمیزی پروژه شما در این فاز در نهاست توسط منتور شما به طور دقیق مورد بررسی قرار خواهد گرفت و کامنتهایی روی آن ارائه خواهد شد. بخش مهمی از محتوای آموزشی شما نیز در طول این code review ها که توسط منتورتان انجام میشود به شما ارائه خواهد شد. لذا در مطالعه این کامنتها دقت کافی را بخرج دهید.
مطالعه بیشتر:
در این فاز تلاش کردیم تا با اصلیترین اصول کدنویسی تمیز آشنا شویم، اما طبیعی است، جزییات و نکات بسیار زیادی در این زمینه وجود دارد، به طوریکه کتاب معروف clean code، به همین منظور نوشته شده است. پیشنهاد میشود برای یادگیری بیشتر، خلاصه کتاب clean code را مطالعه کنید.