کد تمیز چیست؟ – آموزش اصول کلین کد به زبان ساده

۱۷۰۷ بازدید
آخرین به‌روزرسانی: ۲۴ اردیبهشت ۱۴۰۲
زمان مطالعه: ۲۸ دقیقه
کد تمیز چیست؟ – آموزش اصول کلین کد به زبان ساده

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

فهرست مطالب این نوشته

کد تمیز چیست ؟

«کد تمیز» (کلین کد | Clean Code) اصطلاحی است که در حوزه توسعه نرم افزار مطرح می‌شود. کد تمیز به معنی پیاده‌سازی واضح، قابل فهم، قابل ردیابی، منطقی و اصولی کدهای برنامه نویسی است.

هدف در کلین کد، تولید نرم افزار به گونه‌ای بهینه و موثر و طراحی کدها به ‌نحوی است که قابلیت‌های زیر به راحتی فراهم شوند.

  • کدها به آسانی قابل خواندن باشند و بهبود خوانایی کد انجام شده باشد.
  • بتوان به سادگی تغییرات لازم را در کدها پدید آورد.
  • قابلیت گسترش و بسط کدها به راحتی وجود داشته باشد،
  • و بتوان نگهداری کدها را نیز به آسانی انجام داد.
کلین کد چیست

چیستی کد تمیز از دیدگاه خالق زبان C++‎

این گفته از «بیان استراواستراپ» (Bjarne Stroustrup) خالق زبان برنامه نویسی C++‎ به وضوح مشخص می‌کند که دقیقاً‌ کد تمیز چیست.

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

Bjarne Stroustrup سازنده زبان سی پلاس پلاس
«بیان استراواستراپ» (Bjarne Stroustrup) خالق زبان برنامه نویسی C++‎

از سخنان خالق C++‎ می‌توان برخی از خصوصیت‌ها و ویژگی‌های مهم کد تمیز را متوجه شد.

  • کد تمیز متمرکز است. هر تابع، کلاس یا ماژول باید یک کار انجام دهد و آن یک کار باید به خوبی انجام شود.
  • خواندن و درک کلین کد آسان است. به گفته «گَری بوچ» (Gary Booch) نویسنده کتاب «تحلیل و طراحی شی‌گرا و کاربردهای آن»، کد تمیز درست مثل نثر و نوشته خوب و باکیفیت است.
  • دیباگ کردن کلین کد آسان است.
  • نگهداری از کد تمیز آسان است. یعنی به راحتی می‌توان کد تمیز را خواند و به وسیله دیگر برنامه‌نویسان بهبود داد.
  • کد تمیز به میزان زیادی کارامد و موثر است.
تعریف کد تمیز Bjarne Stroustrup

رویکرد کلین کد در مدرسه توسعه دهنده کد تمیز

در خط مشی‌های امروزی توسعه نرم افزار، این مسئله چندان غیرعادی نیست که کدهایی که کار می‌کنند، لزوماً «تمیز» (Clean) نباشند. این تمیز نبودن کدها در طول ایجاد سازگاری‌های لازم یا مشکلات مربوط به گسترش، خیلی سریع به بروز خطا و باگ منجر می‌شود.

مثلاً این بروز خطا در اثر تمیز نبودن کدها می‌تواند زمانی اتفاق بیوفتد که تغییری کوچک به آبشاری از تغییرات پشت سر هم می‌انجامد و آنگاه نگهداری و توسعه بیشتر نرم افزار هم بی‌دلیل پیچیده می‌شود. رویکردی که در «مدرسه توسعه دهنده کد تمیز» (Clean Code Developer School) [+] اشاعه داده می‌شود، در ادامه آمده است.

  • تجزیه و تحلیلی در ابتدا انجام می‌شود و به دنبال آن نیز طراحی و معماری خاصی می‌آید، در کل به آن «تجزیه و تحلیل تمیز و طراحی تمیز» (Clean Analysis and Clean Design) می‌گویند. این تجزیه و تحلیل تمیز و طراحی تمیز مستقل از نوع پروژه یعنی «پروژه دست نخورده» (Greenfield) یا «در حال توسعه» (Brownfield) انجام می‌شود.
  • توسعه تدریجی به وسیله همکاری نزدیک با مشتری در حالی که همزمان یادگیری و واکنش‌پذیری لازم اتفاق بیوفتد؛ یعنی در یک کلمه «چابک» (Agile) باشیم.
  • تعریف مفاهیم، ارزش‌ها، اصول و روش‌های هدایت‌کننده‌ای که برای توسعه، بسیار اساسی و بنیادین به حساب می‌آیند و لازم است متناسب با آن‌ها اقدامات لازم در نظر گرفته شوند.
مدرسه توسعه دهنده کلین کد

این رویکرد از ایجاد «بدهی فنی» (Technical Debt) جلوگیری می‌کند، یا حداقل آن را در کم‌ترین میزان ممکن نگه می‌دارد. اگرچه برای پیاده‌سازی کد تمیز در ابتدا نسبتاً نیاز به تلاش‌های بیشتری وجود دارد، اما در طول چرخه حیات توسعه نرم افزار، این تلاش‌ها به سرعت به بار خواهند نشست و بسیار نتیجه‌بخش خواهند بود. بنابراین، کد تمیز نه تنها از منظر فناوری بهینه و پایدار به حساب می‌آید، بلکه همچنین به لحاظ اقتصادی هم معقول است.

ارزش ها ، اصول و روش های کد تمیز چیست

کد نویسی و توسعه کد تمیز

در حالی که کارهای اولیه «رابرت مارتین» (Robert C. Martin) در کتاب کد تمیز و «داستین بازول» (Dustin Boswell) در «هنر کدهای خوانا» اساساً روی شکل ساده متنی کدها تمرکز داشته‌اند، مدرسه توسعه دهنده کدهای تمیز رویکرد وسیع‌تری را در پیش می‌گیرد. این نهاد، به فرایند توسعه می‌نگرد و ارزش‌ها، اصول و روش‌های متعددی را تعریف و تعیین کرده است.

اگرچه، از همه مهم‌تر، این گروه اهمیت رویکرد چابُک و ملاحظات ساختاری پیش از پیاده‌سازی یعنی تجزیه و تحلیل و طراحی را نیز به رسمیت می‌شناسد. بدون ساختاری مناسب، پیاده‌سازی نیازمندی‌های غیرعملکردی بسیار دشوار و نزدیک به غیرممکن است.

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

اول تجزیه-تحلیل و طراحی، بعد پیاده‌سازی

یا به بیان دیگر:

ابتدا تفکر تمیز و بعد پیاده‌سازی کد تمیز

زیربنا و اساس کد تمیز یا کلین کد را ارزش‌های آن تشکیل می‌دهند، بنابراین در ادامه این مطلب به این پرسش پاسخ می‌دهیم که ارزش‌های کد تمیز چیست و آن‌ها را شرح خواهیم داد.

کد تمیز ماشین

ارزش های کد تمیز چیست ؟

رویکرد پیاده‌سازی کد تمیز مبتنی بر ۴ ارزش اساسی و زیربنایی است که در ادامه فهرست شده‌اند:

  • «تغییرپذیری» (Changeability)
  • «صحت و درستی» (Correctness)
  • «بهینگی تولید» (Production Efficiency)
  • «بهبود مداوم» (Continuous Improvement)

حالا در ادامه هر یک از این ۴ ارزش بنیادی در زیربخش‌هایی به طور جداگانه شرح داده می‌شوند.

ارزش تغییرپذیری در کد تمیز چیست ؟

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

این تحول‌پذیری را می‌توان به وسیله استفاده از اصول طراحی مختلفی افزایش داد که معماری نرم افزار را تحت تاثیر قرار می‌دهند. برخی از اصول ارزش تغییر پذیری در کد تمیز در ادامه فهرست شده‌اند.

  • انتزاع اطلاعات (Abstraction of Information)
  • تفکیک مسئولیت‌ها (Separation of Responsibilities)
  • استفاده از واسط‌ها (Use of Interfaces)
  • پیوند قطعات (Coupling of Components)

به طور ایده‌آل، لازم است تغییرپذیری را از همان ابتدای توسعه نرم افزار در نظر بگیریم، زیرا هرچه دیرتر به آن توجه شود، وفق دادن آن و ایجاد سازگاری پیچیده‌تر، پرهزینه‌تر و دشوارتر خواهد شد.

Changeability نرم افزار

ارزش صحت و درستی در کد تمیز

صحت و درستی به عنوان ارزش، ممکن است در ابتدا پیش پا افتاده و کلیشه‌ای به نظر برسد. اما صحت و درستی تنها به اجرای صحیح توابع، استفاده درست از کلاس‌ها و متُدها یا کاربرد اصول و روش‌های توسعه نرم افزار محدود نمی‌شود.

صحت و درستی همچنین به مدیریت نیازمند‌ی‌ها هم مرتبط است. اغلب توسعه‌دهندگان حتی نیازمندی‌های مشتریان را هم نمی‌دانند. آن‌ها هیچ اطلاعی از ملاک پذیرش ندارند.

آن‌ها هیچ یک از شرایط چارچوب‌ها و بستر سیستم را نمی‌شناسند و راجع به سناریوهای اپلیکیشن و هیچ یک از نیازمندی‌های غیرعملکردی اطلاعی ندارند.

چگونه فردی می‌تواند در توجه به صحت و درستی به موفقیت دست یابد؟ به جای اعتماد کردن یا امید داشتن به اینکه بخش تست و ارزیابی خطاهای احتمالی را پیدا خواهد کرد، توسعه‌دهندگان و برنامه‌نویسان باید پیش از پیاده‌سازی درک کنند مشتریان واقعاً چه می‌خواهند. توسعه‌دهندگان تنها زمانی می‌توانند کاربردها را به درستی پیاده‌سازی کنند که خواسته و نیاز مشتری را بدانند.

ارزش بهینگی تولید در کد تمیز

در بهینگی تولید به عنوان یکی از ارزش‌های اساسی کلین کد، دو جنبه اساسی توسعه نرم افزار مد نظر قرار داده می‌شود.

  1. توسعه نرم افزار نیازمند تلاش و صرفه هزینه است. کدهایی که خواندن، ویرایش، گسترش یا نگهداری از آن‌ها سخت است، باعث می‌شوند زمان توسعه افزایش پیدا کند و چنین کدهایی بهینه نیستند. هر چه نرم افزاری گسترده‌تر شود و توسعه آن بیشتر ادامه پیدا کند، این مشکلات عمیق‌تر می‌شوند. بهینگی تولید یعنی توسعه نرم افزار می‌تواند برای سال‌ها ادامه داشته باشد، چون تاکید بر کد تمیز وجود دارد. جایگزین ممکن است به جای بهبود، توسعه مجدد باشد و این اغلب جایگزین جذاب و مطلوبی نخواهد بود.
  2. بهینگی تولید تخمینی از سایر ارزش‌ها به حساب می‌آید. از یک طرف، بهینگی تولید مثلاً برای جلوگیری از این مسئله اهمیت دارد که از سعی و تلاش دائم برای اطمینان از عملکرد صحیح نرم افزار جلوگیری شود. از طرف دیگر هم بهینگی تولید برای کنترل جنبه‌هایی مثل انجام کار اضافی یا به اصطلاح «آبکاری طلا» (Gold Plating) ضروری است که در آن با نیت مثبت، نسبت به آنچه با مشتری توافق شده است، قابلیت‌ها و ویژگی‌های بیشتری توسعه داده می‌شوند. همچنین یک مورد دیگر هم بیش از حد پیچیده کردن یا به اصطلاح «Over Engineering» است که در آن نرم افزار با کیفیت بیشتری نسبت به نیاز مشتری توسعه و عرضه می‌شود.
کلین کد چیست

ارزش بهبود مداوم در کد تمیز

ارزش «بهبود مداوم» (Continuous Improvement)، بهبود پیاده‌سازی را به معنای واقعی کلمه خطاب قرار نمی‌دهد، زیرا این جنبه خودش از قبل بخشی از قابلیت تکامل هست. بهبود مداوم نیازمند این است که برنامه‌نویسان به شیوه‌های کاری خودشان رسیدگی کنند. برای مثال، می‌توان پرسش‌های زیر را مد نظر قرار داد.

  • چه تجربیاتی در «برنامه نویسی ۲ نفره» (Pair Programming) یا «برنامه نویسی تیمی» (Mob Programming) بدست آمده است؟
  • دلایل بُروز «نابه‌سامانی کُدها» (Code Smell) چیست؟
  • چطور می‌توان همکاری داخل تیم و همکاری با مشتریان را بهبود داد؟
  • از جلسه‌های ‌«مرور و بررسی کدها» (Code Review) چه چیزهایی را آموخته‌ایم؟
  • در «باز نویسی» (Iteration) بعدی چه چیزی را باید بهبود دهیم؟
  • تمرین یادگیری مهارت‌های جدید در کدنویسی را که اصطلاحاً به آن «Code Kata» می‌گویند چگونه می‌تواند بهینه‌سازی شود؟

بنابراین بهبود مداوم ارزشی است که به بازتاب عملکرد تیم برنامه نویسی مربوط می‌شود و مبتنی بر تیم است.

ارزش های کد تمیز چیست

کدام ارزش های کلین کد مهم تر هستند؟

حالا این سوال به وجود می‌آید که برنامه‌نویسان و توسعه‌دهندگان ابتدا باید به دنبال کدام یک از این ارزش‌ها باشند؟ در درجه اول باید گفت که نمی‌توان این ارزش‌ها را در یک ترتیب صریح و مشخص قرار داد تا افراد از آن‌ها تبعیت کنند. در واقع اینطور نیست که یک ارزش نسبت به دیگری مهم‌تر باشد.

با این حال، تغییرپذیری به صورت آگاهانه اولین اولویت به حساب می‌آید. تغییرپذیری بر پایه نگرشی اساسی استوار است، آغوش باز برای نیازمندی‌های آتی و تحولات، حتی وقتی که این تغییر و تحولات و ملزومات هنوز شناسایی هم نشده‌اند.

درست مثل اینکه شعار «اول ایمنی» در صنعت هوانوردی اعمال می‌شود، تغییرپذیری هم باید اولین ارزشی باشد که در صنعت توسعه نرم افزار اعمال می‌شود. ارزش‌های کد تمیز از طریق اصول و روش‌های منسجم و ملموس کلین کد پشتیبانی می‌شوند. بنابراین در ادامه این مطلب به این موضوع پرداخته‌ایم که اصول و روش‌های کد تمیز چیست.

معرفی فیلم های آموزش برنامه نویسی

آموزش برنامه نویسی فرادرس

فرادرس یکی از بزرگ‌ترین پلتفرم‌های آموزش آنلاین در ایران و سایر کشورهای فارسی‌زبان به حساب می‌آید. در پلتفرم فرادرس تعداد بسیار زیادی دوره آموزشی در حوزه‌های تخصصصی مختلف به زبان فارسی وجود دارد. بسیاری از این دوره‌های آموزشی مناسب دانش‌آموزان و دانشجویان هستند و علاوه بر آن، فرای درس و دانشگاه، دوره‌های متعددی هم برای مهارت‌هایی تهیه شده است که به منظور ورود به بازار کار و تقویت مهارت‌های تخصصی مختلف افراد مناسب هستند. یکی از اصلی‌ترین حوزه‌هایی که فرادرس به صورت اختصاصی تعداد زیادی دوره آموزشی برای آن تهیه کرده است، همین حوزه برنامه نویسی به حساب می‌آید. در فرادرس برای موضوعات و حوزه‌های تخصصی مختلف مجموعه‌هایی ایجاد شده است و در این صفحات تقریباً تمام دوره‌های مرتبط با آن موضوع خاص گردآوری شده‌اند تا مخاطبان بتوانند دوره آموزشی مورد نظر خود را راحت‌تر پیدا کنند.

یکی از بزرگ‌ترین مجموعه‌های آموزشی در پلتفرم فرادرس، مجموعه دوره‌های آموزش برنامه نویسی است که تعداد بسیار زیادی دوره آموزشی برای زبان‌های برنامه نویسی مختلف و انواع برنامه نویسی یا شاخه‌های مختلف برنامه نویسی در آن قابل دسترسی هستند. به طور کلی تقریباً برای کلیه مهارت‌های لازم در خصوص یادگیری برنامه نویسی و انواع زبان‌ها، چارچوب‌ها و ابزارها از جمله کد تمیز یا همان کدنویسی تمیز دوره‌های آموزشی در صفحه مجموعه آموزش برنامه نویسی در دسترس علاقه‌مندان قرار دارد. در تصویر فوق تنها تعداد کمی از این دوره‌ها به عنوان نمونه آمده است.

اصول و روش های کلین کد چیست ؟

حتی اگر ارزش‌ها برای توسعه‌دهندگان نرم افزار جهت‌دهی را فراهم کرده باشند، در هر صورت این ارزش‌ها برای پیاده‌سازی ملموس بسیار انتزاعی هستند. به همین دلیل است که «اصول و روش‌هایی» (Principles and Practices) وجود دارند که می‌توان از آن‌ها استفاده کرد.

  • «اصول» (Principles) کد تمیز معیارهایی برای ساختاردهی به نرم افزار هستند. این اصول متمم یکدیگر به حساب می‌آیند. به طور ایده‌آل، همیشه حداکثر اصول رعایت می‌شوند. اگر نرم افزار بر خلاف این اصول توسعه داده شود، اثرات آن حداکثر در میان مدت مثلاً از طریق افزایش هزینه‌های اصلاحات و تنظیم سازگاری آشکار خواهد شد. هر پیاده‌سازی و اجرایی خودش آشکار می‌کند که آیا اصلی از کد تمیز رعایت شده است یا خیر.
  • «روش‌ها» (Practices) دستورالعمل‌هایی برای اقدام عملی هستند. این‌ها در واقع متُدها و تکنیک‌هایی هستند که برای رعایت کلین کد به طور مداوم مورد استفاده قرار می‌گیرند. برخی از روش‌ها نیازمند استفاده از بعضی ابزارها هستند. همیشه نمی‌توان از اجرا و پیاده‌سازی تشخیص داد که آیا روشی انجام شده است یا خیر.

حال در ادامه به شرح اصول کد تمیز پرداخته می‌شود.

اصول کدنویسی تمیز

اصول کد تمیز چیست ؟

در این بخش به معرفی و شرح اصول کد تمیز پرداخته شده است. ابتدا در ادامه همه اصول کلین کد را فهرست کرده‌ایم و سپس هر کدام را در زیربخش‌هایی جداگانه شرح خواهیم داد.

  • «کار تکراری انجام نده» (Don't Repeat Yourself | DRY)
  • «کارها را ساده و احمقانه انجام بده» (Keep It Simple and Stupid | KISS)
  • «حواست به بهینه‌سازی باشد» (Beware of Optimizations)
  • «ترکیب را بر ارث‌بری ترجیح بده» (Favor Composition over Inheritance | FCoI)
  • «اصل مسئولیت واحد» (Single Responsibility Principle | SRP)
  • «سطح انتزاع یگانه» (Single Level of Abstraction | SLA)
  • «قراردادهای کد منبع» (Source Code Conventions)
  • «تفکیک بخش‌های نرم افزار» (Separation of Concerns | SoC)
  • «اصل وارونگی وابستگی» (Dependency Inversion Principle | DIP)
  • «اصل جداسازی واسط» (Interface Segregation Principle | ISP)
  • «اصل کم‌ترین غافل‌گیری» (Principle of Least Astonishment | POLA)
  • «اصل جایگزینی لیسکوف» (Liskov Substitution Principle | LSP)
  • «اصل باز و بسته» (Open Closed Principle | OCP)
  • «اصل پنهان‌سازی اطلاعات» (Information Hiding Principle)
  • «قانون دمتر» (Law of Demeter |‌ LoD)
  • «اصل بگو ولی نپرس» (Tell, Don’t Ask Principle | TDA)
  • «عدم ایجاد همپوشانی در طراحی و پیاده‌سازی»
  • «پیاده‌سازی بازتاب‌دهنده طراحی» (Implementation Reflects Design)
  • «نیازی به آن نخواهی داشت» (You Ain’t Gonna Need It | YAGNI)

 

اصل DRY عدم تکرار در کد تمیز چیست ؟

هدف اصل DRY کاستن تکرار الگوهای نرم افزاری، جایگزینی آن‌ها با انتزاعات یا استفاده از روش‌های نرمال‌سازی و استانداردسازی داده‌ها برای جلوگیری از رخداد افزونگی است.

اصل KISS رعایت سادگی در کلین کد چیست ؟

طبق اصل KISS تا حد امکان باید سادگی را رعایت کرد. بر اساس این اصل، نباید موارد را خیلی پیچیده انگاشت یا به کونه‌ای پیچیده آن‌ها را اجرا و پیاده‌سازی کرد. همیشه باید به دنبال ساده‌ترین راه‌حل برای یک مسئله باشیم و آسان‌ترین روش را به کار بگیریم.

کلین کد چیست

توجه به بهینه سازی در کد تمیز

بهینه‌سازی‌ها معمولاً هزینه‌های زیادی را در پی دارند. انجام بهینه‌سازی‌ها اغلب نه کاربردی و نه الزام‌آور است. بنابراین، قانونی ساده این است که حواسمان به بهینه‌سازی باشد. همچنین اگر هم بهینه‌سازی انجام می‌دهیم، باید آن را تنها پس از یک تجزیه و تحلیل تمام و کمال انجام دهیم.

ارجح دانستن ترکیب بر ارث بری

اصل FCoI استفاده از ترکیب به جای ارث‌بری را رواج می‌دهد تا کلاس‌ها از الگوریتم‌ها و جزئیاتشان جداسازی شوند و بتوان رفتار کلاس را در زمان اجرا تغییر داد.

 

اصل مسئولیت یگانه در کلین کد چیست ؟

اصل SRP نوعی از طراحی نرم افزار را خطاب قرار می‌دهد که بر اساس آن یک ماژول به همراه کلاس‌ها، توابع، متغیرها و ساختمان داده خود باید تنها به یک ایفا کننده نقش پاسخگو باشد.

کد نویسی تمیز چیست

رعایت سطح انتزاع یگانه در کد تمیز

اصل SLA بیان می‌دارد سطوح مختلف انتزاع توابع برای افزایش خوانایی، درک و نگهداری کدها نباید با هم ترکیب شوند.

 

قراردادهای کد منبع

در قراردادهای کد منبع دستورالعمل‌هایی تعریف شده‌اند که به بهبود کیفیت نرم افزار به لحاظ ساختاری کمک می‌کنند. این قراردادها شامل قوانین نام‌گذاری، کامنت‌ها، اعلان‌ها، گزاره‌ها، فضاهای خالی و سایر موارد می‌شود.

تفکیک بخش ها در کلین کد چیست ؟

اصل SoC بر این مسئله تاکید دارد که یک کلاس بر جنبه مشخصی متمرکز است تا بتوان بخش‌ها (قطعات نرم افزار) را جداگانه تست و ارزیابی کرد و تنظیمات را به گونه‌ای قابل مدیریت انجام داد.

اصل تفکیک بخش ها در کلین کد

اصل وارونگی وابستگی DIP

اصل DIP بیان می‌دارد که ماژول‌های سطح بالاتر به ماژول‌های سطح پایین‌تر وابسته نیستند، ماژول‌ها به انتزاعات وابسته هستند و انتزاع‌ها نباید به جزئیات وابسته باشند بلکه جزئیات باید به انتزاع‌ها وابسته باشند.

اصل جداسازی واسط ISP

اصل ISP بیان می‌دارد که واسط‌ها دارای میزان زیادی از انسجام هستند و تنها باید حاوی عناصری باشند که به یکدیگر تعلق دارند. هدف این است که «وابستگی» (Coupling) میان اجزا را تا حد امکان کمینه و واضح سازیم.

اصل کم ترین غافل گیری یا POLA در کد تمیز چیست ؟

به اصل کم‌ترین شگفتی گاهی علاوه بر POLA به آن POLS یا «Principle of Least Surprise» (اصل کم ترین تعجب) هم می‌گویند. این اصل بیان می‌دارد که واسط کاربری باید همیشه به گونه‌ای طراحی شود که کاربر کم‌ترین غافل‌گیری ممکن را تحمل کند.

 

اصل جایگزینی لیسکوف LSP

به بیان ساده، اصل لیسکوف بیان می‌دارد که اشیای یک «ابَرکلاس» (سوپر کلاس) باید با اشیای زیرکلاس‌های خود بدون آسیب زدن به اپلیکیشن قابل جایگزینی باشد. به بیان دیگر، آنچه می‌خواهیم این است که اشیای زیرکلاس‌های ما به همان شکل اشیای سوپرکلاس رفتار کنند.

اصل CSP

اصل CSP بیان می‌دارد که زیرنوع‌های مشتق شده باید مشابه انواع اساسی آن‌ها رفتار کنند که به موجب آن، ممکن است زیرنوع‌ها قابلیت‌های نوع داده‌های اساسی را بسط و گسترش دهند، اما آن‌ها را محدود نسازند.

اصل باز بسته OCP در کد تمیز چیست ؟

اصل OCP به گسترش‌پذیری ماژول‌ها، کلاس‌ها، متدها و سایر موارد مربوط می‌شود که بر اساس آن، این اجزا باید قابل بسط و گسترش باشند اما برای تغییرات و ویرایش‌ها بسته باشند. یعنی باید به‌گونه‌ای نوشته شوند که نیاز به تغییر آن‌ها در آینده وجود نداشته باشد، اما در صورت نیاز بتوان قابلیت‌های آن‌ها را گسترش داد.

اصل پنهان سازی اطلاعات در کلین کد

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

قانون دمیتر Demeter یا LoD

قانون دمیتر که همچنین آن را با عنوان قانون «کم‌ترین آگاهی» (Least Knowledge) هم می‌شناسند، بیان می‌دارد که برای کاهش وابستگی اشیا تنها باید با اشیای حاضر در محیط بلافصل‌شان ارتباط داشته باشند.

قانون دمیتر در کلین کد

اصل بگو اما نپرس TDA

اصل TDA راجع به بسته‌بندی کردن داده‌ها به وسیله کارکردهایی است که با این داده‌ها کار می‌کنند. به جای اینکه از یک شی درخواست داده شود، به منظور کار با این داده‌، باید کاری که لازم است انجام شود را از شی بخواهیم.

اصل عدم تداخل طراحی و پیاده سازی نرم افزار

در عمل، بین طراحی و اجرا یا همان پیاده‌سازی واگرایی اتفاق می‌افتد. در شرایط ایده‌آل، ناسازگاری‌ها باید کمینه شوند و وظایف بین طراحی یا همان معماری و پیاده‌سازی یا همان اجرا باید از هم تفکیک و جدا شوند.

انعکاس طراحی در اجرا

اجرا نباید به طور مستقل از طراحی یا معماری اتفاق بیوفتد. برای مثال، اجزا و قطعاتی که در معماری تعریف شده‌اند، باید در کدها هم به صورت فیزیکی از هم جدا باشند.

پرهیز از کار غیر ضروری

اصل YAGNI بیان می‌کند که قابلیت‌های عملکردی تنها زمانی پیاده‌سازی می‌شوند که واقعاً به آن‌ها نیاز داشته باشیم. اغلب نیاز به ویژگی‌ها و قابلیت‌ها هنوز خیلی نادقیق هستند یا بعداً مشخص می‌شود که غیرضروری بوده‌اند. بنابراین در صورت وجود شک و تردید باید از تلاش‌های نابالغ و غیرضروری در این خصوص پرهیز شود.

اصل YAGNI در کد تمیز چیست

اصل SOLID چیست ؟

اصل مسئولیت واحد، اصل باز و بسته، اصل جایگزینی لیسکوف و اصل وارونگی وابستگی را به همراه یکدیگر «اصل SOLID» می‌نامند. رابرت مارتین در کتاب «توسعه چابُک نرم افزار» این اصول (SOLID) را برای توسعه کد تمیز بسیار ضروری می‌داند.

روش های کد تمیز چیست ؟

اکنون پس از شرح اصول کد تمیز در این بخش مروری بر روش‌های کلین کد خواهیم داشت. در این بخش نیز ابتدا هر یک از روش‌های عملی کد تمیز را فهرست کرده‌ایم و سپس هر یک را در بخش‌های جداگانه شرح می‌دهیم.

  • رعایت قانون پیشاهنگی (Boy Scout Rule)
  • انجام «تحلیل علت ریشه‌ای» (Root Cause Analysis)
  • استفاده از سیستم‌های کنترل نسخه
  • اعمال الگوهای ساده بازسازی و بهبود پیوسته
  • بازاندیشی روزانه
  • ردیابی مشکلات
  • استفاده از «تست‌های یکپارچگی خودکار» (Automated Integration Tests)
  • انجام نقد و بررسی و بازنگری‌های مداوم
  • مطالعه و ارتقای دانش
  • استفاده از «تست واحد خودکار» (Automated Unit Tests)
  • استفاده از «ماکت‌ها» (Mockups)
  • تجزیه و تحلیل «پوشش کد» (Code Coverage)
  • انجام «بازسازی پیچیده» (Complex Refactoring)
  • شرکت در رویدادهای حرفه‌ای
  • به دنبال ادغام مستمر بودن
  • جمع‌آوری «سنجه‌ها» (Metrics)
  • استفاده از «وارونگی نگهدارنده کنترل» (Inversion of Control Container)
  • انتقال تجربیات
  • خطاها در تخمین
  • به دنبال تحویل مستمر بودن
  • انجام توسعه تکرارشونده
  • توسعه با شیوه قطعه‌محور Component Oriented
  • «اول از همه تست» (Test First)

 

رعایت قانون پیشاهنگی

قانون پیشاهنگی بیان می‌دارد:

  • همیشه یک محل را در شرایط بهتری نسبت به شرایط ابتدای حضورتان ترک کنید.
Boy Scout Rule در کد تمیز
قانون پسر پیشاهنگ (Boy Scout Rule)

بنابراین، موارد کوچک در کدها باید بهبود داده شوند و باگ‌ها باید پیش از تبدیل شدن به مشکلات بزرگ‌تر رفع شوند.

انجام تحلیل علت ریشه ای Root Cause Analysis

تجزیه و تحلیل علت ریشه‌ای وقوع، به جای حذف علائم، بر حذف علت‌ها تمرکز دارد. این شیوه در میان مدت بسیار کارامدتر است.

استفاده از سیستم های کنترل نسخه

در کنترل نسخه با مدیریت فایل‌ها شامل آرشیو کردن، واقعه‌نگاری، بهبود و هماهنگی دسترسی سر و کار داریم. محقق شدن توسعه نرم افزار بدون کنترل نسخه غیر قابل تصور است.

اعمال الگوهای ساده بازسازی و بهبود پیوسته

اصطلاح «Refactoring» (بازسازی و بهبود پیوسته) به این مسئله اشاره دارد که ساختار نرم افزار تغییر کند، در حالی که محدوده توابع و عملکردها حفظ شود. روش‌های استخراج یا تغییر نام‌های غیر قابل درک، الگوهای ساده بازسازی و بهبود به حساب می‌آیند.

 

باز اندیشی روزانه

«باز اندیشی» (Reflect) پیش‌نیاز یادگیری فعالانه است. البته تجربه نشان می‌دهد که این مهم تنها در صورتی به صورت روزانه اتفاق می‌افتد که با جدیت در تقویم زمان‌بندی شده باشد، در غیر اینصورت،‌ باز اندیشی قربانی امور و کارهای روزمره خواهد شد.

ردیابی مشکلات

«ردیبای مشکلات» (Issue Tracking) که با عنوان «ردیابی باگ» (Bug Tracking) هم شناخته می‌شود، فرایند ثبت تا از بین بردن باگ‌ها، مسائل باز، درخواست‌ها و سایر موارد را توصیف می‌کند.

 

استفاده از تست های یکپارچگی خودکار Automated Integration Tests

در تست های یکپارچگی خودکار، همکاری اجزای مختلف، مثلاً بعد از بازسازی یا انشعاب و پیوست، مورد بررسی قرار می‌گیرد. خودکارسازی، بهینگی مورد نیاز را در طول تست فراهم می‌سازد.

انجام نقد و بررسی و بازنگری های مداوم

چه در حین انجام برنامه نویسی دو نفره، «بازنگری‌های دقیق» (Peer Review) یا بررسی و بازنگری کدها، نقد و بررسی و بازنگری‌های مداوم باعث می‌شود کیفیت کدها افزایش پیدا کند. هدف، بهبود مداوم کیفیت کدها است.

بازنگری دقیق Peer Review
«بازنگری‌های دقیق» (Peer Review)

مطالعه و ارتقای دانش

تکنیک‌ها، روش‌ها، چارچوب‌ها، ابزارهای نرم افزاری، همه چیز در بافت توسعه نرم افزار متحول می‌شوند. در چنین شرایطی توصیه می‌شود مطالعه را بسیار افزایش دهید. وبلاگ‌ها، مقاله‌ها و کتاب‌های مرتبط با توسعه نرم افزار را دائماً مطالعه کنید تا دانش شما به‌روزرسانی شود و همگام با روندها و تحولات جدید پیش بروید.

استفاده از تست واحد خودکار Automated Unit Tests

در تست‌های واحد بررسی می‌شود آیا اجزای توسعه داده شده مطابق انتظار کار می‌کنند یا خیر. برای مثال، تک تک کلاس‌ها یا متدها تست و ارزیابی می‌شوند. خودکارسازی تست‌ها، زحمت‌های مربوط به تست نرم افزار را کاهش می‌دهند.

استفاده از ماکت ها Mockups

برای تست ایزوله شده هر یک از اجزاء و قطعات نرم افزار، لازم است وابستگی‌ها حذف شوند. ماکت‌ها (Mockup) یا «شی‌های آزمایشی» (Mock Object) موجودیت‌هایی ساختگی هستند که با قطعه‌ای که قرار است آزمایش شود، مثلاً برای اینکه شی مربوطه هنوز در دسترس نیست، تعامل برقرار می‌کنند.

تجزیه و تحلیل پوشش کد Code Coverage

«پوشش کد» (Code Coverage) بیان می‌کند که چه بخشی از کدهای منبع، گزاره‌ها، شاخه‌ها، مسیرها و شرط‌ها به وسیله «موارد آزمون» (Test Case) اجرا شده‌اند. هدف پیدا کردن بخش‌هایی است که هنوز تست نشده‌اند.

 

انجام بازسازی پیچیده Complex Refactoring

پیاده‌سازی کدها به طور مستقیم به گونه‌ای بهینه غیرممکن است. علاوه‌بر روش‌های ساده، همچنین روش‌های بازسازی و بهبود پیچیده‌تری هم وجود دارد که تاثیر آن‌ها تنها به وسیله تست‌های خودکار امکان‌پذیر است.

 

شرکت در رویدادهای حرفه ای

برای اینکه خودمان را در حوزه توسعه نرم افزار آموزش دهیم، علاوه بر مطالعه منابع و مقالات فنی، تبادل ایده با دیگر برنامه‌نویسان و توسعه‌دهنده‌ها هم مهم است. مثلاً در ملاقات‌های گروه‌های کاربران یا در همایش‌ها، فرصت خوبی برای تبادل نظر و بحث گفت و گو برای ارتقای دانش به حساب می‌آید.

ملاقات برنامه نویسان

به دنبال ادغام مستمر بودن

ادغام پیوسته اجزا و قطعات در قالب یک اپلیکیشن، مثلاً در قالب بیلدهای روزانه، مزیت شناسایی ناسازگاری و مشکلات مربوط به ادغام را به سرعت و نه فقط در انتهای هر نسخه بازنویسی به همراه دارد.

جمع آوری سنجه ها Metrics

تجزیه و تحلیل ایستای کدها برای مثال به بررسی درستی به وسیله تست‌های خودکار یا برای مشخص کردن انطباق با نیازمند‌ی‌ها کمک می‌کند. تغییرپذیری نرم افزار را نیز می‌توان به وسیله سنجه‌ها مشخص کرد.

استفاده از وارونگی نگهدارنده کنترل Inversion of Control Container

نگهدارنده یا همان کانتینر IoC به نمونه‌سازی و اتصال بسیاری از اشیای کوچکی کمک می‌کند که در نتیجه اصل SoC ایجاد شده‌اند. همچنین IoC Container به پیکربندی مجدد کلاس‌ها برای موارد آزمون هم کمک می‌کند.

انتقال تجربیات

دانش و آگاهی داشتن خوب است، انتقال دانش و معلومات اما بسیار خوب است.

ایده نهفته در این جمله این است که:

  • تنها از طریق انتقال دانش بازتاب واقعی و نفوذ به مباحث تخصصی اتفاق می‌افتد و همه افراد ذینفع از مزایای آن بهره‌مند می‌شوند.
انتقال تجربیات برنامه نویسی

خطاها در تخمین

یکی از اهداف توسعه نرم افزار، کمینه‌سازی تعداد خطاهای گزارش شده به وسیله مشتریان پس از انتشار نسخه‌ای جدید است. در این خصوص، قابل مقایسه بودن تخمین‌ها نسبت به میزان دقت آن‌ها مهم‌تر است.

به دنبال تحویل مستمر بودن

منظور از «تحویل مستمر» فرایند تحویل به‌روزرسانی‌های آزمایش شده است که در آن‌ها راه‌اندازی و استقرار خودکارسازی شده است. تحویل مستمر به دنبال ادغام مستمر انجام می‌شود.

انجام توسعه تکرار شونده

توسعه به صورت تکرارهای مختلف و همچنین چرخه‌های بازخورد کوتاه، امروزه ۲ عامل موفقیت ضروری در توسعه نرم افزار به حساب می‌آیند. در نتیجه، خطر توسعه‌های دارای خطا کاهش پیدا می‌کند و کیفیت نرم افزار بهبود می‌یابد.

توسعه با شیوه قطعه محور Component Oriented

شیوه توسعه قطعه‌محور بهره‌وری را از طریق پیاده‌سازی موازی تقویت می‌کند، شفافیت اپلیکیشن را بهبود می‌دهد و تست هر کامپوننت یا همان قطعه را آسان‌تر می‌کند.

 

اول از همه تست Test First

منِش Test First این مسئله را اشاعه می‌دهد که واسط‌ها و رفتارهای متقابل مورد انتظار به وسیله تست‌ها توصیف می‌شوند. در این رویکرد، مستندات مشخصه‌ها در قالب کدهای اجرایی تولید می‌شوند که به صورت خودکار مورد بررسی قرار می‌گیرند.

کد تمیز در فعالیت های روزانه: نکاتی برای استفاده از کلین کد

ارزش‌ها، اصول و روش‌های کد تمیز چگونه به هم می‌پیوندند؟ نکات و ترفندهای پیاده‌سازی کلین کد چه هستند؟ در این بخش به این پرسش‌ها پاسخ می‌دهیم.

نکات و ترفندهای کلی برای رعایت کد تمیز

در این بخش فهرستی از نکات و ترفندهای کلی در خصوص کد تمیز ارائه شده است.

  • از کنوانسیون‌ها تبعیت کنید.
  • تا حد امکان پیچیدگی را کاهش دهید.
  • هر چه کدها ساده‌تر باشند، بهتر است.
  • مثل یک گروه پیشاهنگی عمل کنید و در اتمام کار، کدها را بهتر از آنچه قبلاً بودند تحویل دهید.
  • همیشه در جستجوی علائم مشکل نباشید، بلکه به دنبال علت بگردید.

نکات و ترفندهای کد تمیز در طراحی و معماری نرم افزار

نکات ترفندهای مربوط به فاز طراحی و معماری نرم افزار برای رعایت کلین کد در ادامه فهرست شده‌اند.

  • داده‌های قابل پیکربندی را در سطح بالایی نگه دارید.
  • به جای if/else یا switch/case از «پُلی‌مورفیسم» (چندریختی) استفاده کنید.
  • از کدهای چندنخی مجزا استفاده کنید.
  • از قابلیت پیکربندی بیش از حد جلوگیری و از «تزریق وابستگی» (Dependency Injection) استفاده کنید.
  • از قانون دمیتر تبعیت کنید.

نکات و ترفندهای مربوط به قابل درک بودن

ترفندها و نکته‌های مرتبط با قابل فهم بودن در ادامه آمده است.

  • منسجم عمل کنید و موارد مشابهی را به گونه‌ای یکسان پیاده‌سازی کنید.
  • از متغیرهای گویا و خود توصیف کننده استفاده کنید.
  • شرایط مرزی را کپسوله‌سازی کنید، چون اغلب درک آن‌ها دشوار است.
  • اشیای با ارزش اختصاصی را نسبت به نوع داده‌های اولیه در اولویت قرار دهید.
  • از وابستگی‌های منطقی دوری کنید. مثلاً متُدهایی ننویسید که در وابستگی با چیز دیگری در همان کلاس درست کار می‌کنند. همچنین از استفاده از شرط‌های منفی هم خودداری کنید.

نکات و ترفندهای مربوط به نام گذاری در برنامه نویسی برای رعایت کد تمیز

از نام‌های توصیف‌گرانه، بدون ابهام، دارای مفهوم، قابل تلفظ و قابل جستجو استفاده کنید و اعداد جادویی را با ثابت‌های نام‌گذاری شده جایگزین کنید و از رمزگذاری‌ها هم اجتناب شود.

نکات و ترفندهایی برای توابع برای رعایت کلین کد

با پیاده‌سازی تنها یک عملکرد، توابع را کوچک نگه دارید. از نام‌های توصیف‌گرانه برای توابع استفاده کنید و کم‌ترین تعداد آرگومان ممکن را در توابع برنامه نویسی به کار بگیرید. از وقوع «عوارض جانبی» (Side Effect) اجتناب شود. در برنامه نویسی تابعی عارضه جانبی زمان رخ می‌دهد که تابعی به چیزی خارج از پارامترهای خودش برای انجام کاری متکی باشد یا نیاز به تغییر آن داشته باشد.

نکات و ترفندهای کامنت گذاری در کلین کد

سعی کنید به‌گونه‌ای برنامه نویسی کنید که کدها بسیار واضح باشند و تنها با خواندن کدها بتوان متوجه شد که چه کاری انجام شده است. در کدهایتان کامنت‌گذاری نکنید، مگر آنکه آن را برای توضیح دادن قصد و غرض خود نوشته‌اید یا می‌خواهید عوارض جانبی احتمالی را مشخص کنید.

نکات و ترفندهای کد تمیز در خصوص ساختار کدهای منبع

نکات و ترفندهای مربوط به ساختار کدهای منبع برای اجرایی کردن کلین کد در ادامه فهرست شده‌اند.

  • متغیرها را نزدیک به محل استفاده از آن‌ها تعریف کنید.
  • توابع وابسته و مشابه باید نزدیک به هم باشند.
  • توابع را در جهت رو به پایین قرار دهید و از تنظیم و هم‌ترازی افقی بپرهیزید.
  • خطوط کدها را کوتاه نگه دارید.
  • از فاصله‌های خالی برای مرتب کردن یا جداسازی جنبه‌ها استفاده کنید و «دندانه‌گذاری» (تورفتگی | Indentation) را هم به کار بگیرید.

نکات و ترفندهای مربوط به تست و ارزیابی نرم افزار برای رعایت کد تمیز

تست‌ها را طوری پیاده‌سازی کنید که خوانا، سریع، مستقل و قابل تکرار باشند و خودکارسازی شوند. برای هر تست هم فقط یک جنبه را مورد آزمایش قرار دهید.

حالا می‌دانیم کد تمیز چیست، اما باید به طور مداوم آن را در ذهن داشته باشیم و اجرا کنیم. در ادامه به دغدغه همیشگی رعایت کد تمیز پرداخته شده است و ترفندهایی‌ را در این خصوص ارائه داده‌ایم.

دل مشغولی مستمر برای کد تمیز

تغییرپذیری، صحت و درستی، بهینگی تولید و بهبود مستمر ۴ ارزش کد تمیز به حساب می‌آیند. مسلم فرض کردن آن‌ها به عنوان مزیت‌ها یا هدف به نظر منطقی و معقول می‌رسد، اما در واقعیت توسعه نرم افزار، پیاده‌سازی کد تمیز اصلاً آسان نیست. به راحتی نمی‌توان کد تمیز را اندازه‌گیری کرد و بنابراین به صورت گذرا و به راحتی نمی‌توان کلین کد را اجرایی کرد. در این مرحله است که اصول و روش‌های کد تمیز وارد بازی می‌شوند.

اگرچه، این اصول و روش‌ها باید به طور مستمر با تمایل به استفاده از کد تمیز، معنا و مفهوم آن و پیاده‌سازی دقیق کلین کد همراه باشند. تنها در صورتی که تمرکز بر پیاده‌سازی طبق فلسفه کلین کد وجود داشته باشد، در طولانی مدت موفقیت حاصل خواهد شد. در چنین شرایطی است که کمتر واقعاً کمتر و بیشتر واقعاً بیشتر خواهد بود. می‌توان یکی از اصول کلین کد را این مسئله دانست که کد تمیز واقعاً ضروری و مورد نیاز است.

کتاب کد تمیز یکی از محبوب‌ترین منابع برای یادگیری کدنویسی تمیز به حساب می‌آید، بنابراین در بخش بعدی این مطلب به این پرسش پرداخته‌ایم که بهترین کتاب کد تمیز چیست و چند مورد را معرفی کرده‌ایم.

بهترین کتاب کد تمیز چیست ؟

کتاب «کد تمیز: راهنمایی برای حرفه‌ای شدن در نرم افزار چابُک» (Clean Code: A Handbook of Agile Software Craftsmanship) نوشته «رابرت مارتین» (Robert C. Martin) ملغب به «عمو باب» (Uncle Bob) محبوب‌ترین و برترین کتاب کد تمیز به حساب می‌آید.

مطالعه این کتاب توسط بسیاری از برنامه‌نویسان و توسعه‌دهندگان نامی توصیه شده است.

در این کتاب اصول، الگوها و بهترین روش‌های نوشتن کد تمیز پوشش داده شده است. در این کتاب بسیاری از مطالعات موردی که طبیعتی پیچیده دارند مورد بحث قرار گرفته است.

هر مطالعه موردی در این کتاب روی روش‌های مختلف پاکسازی کدها تمرکز دارد. در کتاب کد تمیز همچنین فهرستی از ابتکاراتی ارائه شده است که در حین انجام هر مطالعه موردی گردآوری شده‌اند.

کتاب کد تمیز عمو باب به فارسی هم ترجمه شده است و می‌توان آن را با جستجو در اینترنت خریداری کرد.

همچنین کتاب خلاصه‌تری هم به زبان فارسی به رایگان در اینترنت در دسترس است که در ۳۶ صفحه در آن به کدنویسی تمیز پرداخته می‌شود و می‌توان آن را دانلود و مطالعه کرد.

کتاب کلین کد

در ادامه تعدادی دیگر از بهترین کتاب‌های کد تمیز معرفی شده‌اند.

بهترین کتاب های کلین کد کدامند؟

در این بخش علاوه بر کتاب کد تمیز عمو باب، ۵ تا از بهترین کتاب‌هایی معرفی شده‌اند که به شما کمک می‌کنند تا بهترین شیو‌ه‌های کدنویسی تمیز را بشناسید، بیاموزید و آن‌ها را در کدهایتان به کار بگیرید.

  1. کتاب «برنامه‌نویس عملگرا» (Pragmatic Programmer) نوشته «اندرو هانت» (Andrew Hunt) و «توماس دیوید» (Thomas David)
  2. کتاب «آموزش کد کامل» (Code Complete) نوشته «استیو مک‌کانِل» (Steve McConnell)
  3. کتاب «کلین کد در پایتون» (Clean Code in Python) نوشته «ماریانو آنایا» (Mariano Anaya)
  4. کتاب «برنامه نویس تمیز» (The Clean Coder) نوشته رابرت سی مارتین (عمو باب)

اکنون در آخرین بخش این مقاله به این بحث پرداخته‌ایم که کد تمیز در پایتون چیست و چطور می‌توان آن را در این زبان رعایت کرد.

کد تمیز در پایتون

پایتون یکی از زبان‌های برنامه نویسی فاخر و تمیز (از لحاظ کدنویسی) به حساب می‌آید، اما به هر حال وجود سینتکسی زیبا و تمیز با پیاده‌سازی اصول کد تمیز متفاوت است. با وجود مناسب بودن سینتکس پایتون، برنامه‌نویسان همچنان باید بهترین روش‌های کد نویسی پایتون را بیاموزند و الگوهای طراحی با پایتون را یاد بگیرند تا بتوانند کد تمیز بنویسند.

در این بخش به برخی از الگوهای طراحی اشاره شده است که به نوشتن کد تمیز در پایتون کمک می‌کند.

کد تمیز در پایتون

الگوهای نوشتن کد تمیز در پایتون چیست ؟

الگو‌های کد تمیز در پایتون را می‌توان به صورت زیر دسته‌بندی کرد.

  • الگوهای کد تمیز در پایتون برای نام‌گذاری
  • الگوهای مربوط به توابع برای نوشتن کد تمیز در پایتون
  • چارچوب‌های کد تمیز مربوط به کلاس‌ها در پایتون

در ادامه هر یک از این موارد به همراه مثال شرح داده شده‌اند.

قراردادهای نام گذاری برای نوشتن کد تمیز در پایتون

قراردادهای نام‌گذاری یکی از کاربردی‌ترین و مهم‌ترین جنبه‌های نوشتن کد تمیز به حساب می‌آید. زمان نام‌گذاری متغیرها، توابع، کلاسس‌ها و سایر موارد، باید از نام‌های معنی‌داری استفاده کرد که قصد و قرض ما را نشان دهند. این یعنی اسامی بلندتر توصیف‌گر به اسامی کوتاه مبهم ترجیح داده می‌شوند.

در ادامه چند مثال برای درک بهتر اصول و توافق‌های نام‌گذاری اجزای برنامه در پایتون بر پایه کد تمیز ارائه شده است.

مثال استفاده از نام های طولانی و توصیفی خوانا

مشابه مثال زیر، با استفاده از اسامی تفصیلی که خواندن آن‌ها آسان است، نیاز به نوشتن کامنت‌های غیرضروری از بین می‌رود.

1# Not recommended
2# The au variable is the number of active users
3au = 105
4
5# Recommended 
6total_active_users = 105

مثال استفاده از اسامی تفضیلی نشان دهنده قصد و نیت

دیگر برنامه‌نویسان هم باید بتوانند از روی نام انتخاب شده بفهمند متغیرهای شما چه چیزی را ذخیره کرده‌اند. به طور خلاصه، خواندن کدهای شما باید آسان باشد و به راحتی بتوان آن‌ها را درک کرد.

1# Not recommended
2c = [“UK”, “USA”, “UAE”]
3
4for x in c:
5print(x)
6
7# Recommended
8cities = [“UK”, “USA”, “UAE”]
9    for city in cities:
10        print(city)

مثالی برای اجتناب از نام گذاری خلاصه و مبهم در پایتون

نام متغیرها نباید کوتاه و گیج‌کننده باشد. لازم است نام‌هایی توصیف کننده و طولانی‌تر انتخاب کنیم. در این خصوص مثالی در ادامه آمده است.

1# Not recommended
2fn = 'John'
3Ln = ‘Doe’
4cre_tmstp = 1621535852
5
6# Recommended
7first_name = ‘JOhn’
8Las_name = ‘Doe’
9creation_timestamp = 1621535852

مثالی برای انسجام در دایره واژگان برای نام گذاری در پایتون

در خصوص قراردادها و توافق‌های نام‌گذاری خود یکپارچه، استوار و هماهنگ عمل کنید. حفظ یک رویکرد توافقی نام‌گذاری برای از بین بردن سردرگمی وقتی دیگر برنامه‌نویسان روی کدهای شما کار می‌کنند بسیار اهمیت دارد.

این کار را باید برای نام‌گذاری متغیرها، فایل‌ها، توابع و حتی ساختار دایرکتوری‌ها اجرایی کنیم. در ادامه مثالی برای درک بهتر نحوه انجام این کار ارائه شده است.

1# Not recommended
2client_first_name = ‘John’
3customer_last_name = ‘Doe;
4
5# Recommended
6client_first_name = ‘John’
7client_last_name = ‘Doe’
8
9Also, consider this example:
10#bad code
11def fetch_clients(response, variable):
12    # do something
13    pass
14
15def fetch_posts(res, var):
16    # do something
17    pass
18
19# Recommended
20def fetch_clients(response, variable):
21    # do something
22    pass
23
24def fetch_posts(response, variable):
25    # do something
26    pass

مثالی برای شروع به ردیابی مشکلات پایگاه کد در کد ادیتور

یکی از اجزای اصلی در خصوص تمیز نگه داشتن پایگاه کد نوشته شده به زبان پایتون این است که کار ردیابی و بررسی مشکلات را در کدها برای دیگر مهندسان تسهیل کنیم. ردیابی اشکالات پایگاه کد در ویرایشگر کد به مهندسان اجازه می‌دهد تا بتوانند موارد زیر را انجام دهند.

  • بدست آوردن دید کامل نسبت به بدهی فنی
  • مشاهده زمینه و بافت مربوطه برای هر مشکل موجود در پایگاه کد
  • کاهش «تغییر زمینه» (Context Switching)
  • رفع مداوم بدهی فنی

می‌توان از ابزارهای متعددی برای ردیابی بدهی فنی استفاده کرد، اما ساده‌ترین و سریع‌ترین راه برای شروع استفاده از افزونه رایگان Stepsize در VSCode یا JetBrains است که می‌توان آن را با جیرا، Linear، آسانا و دیگر ابزارهای مدیریت پروژه قابل ادغام کرد.

مثالی در خصوص عدم استفاده از اعداد جادویی Magic Numbers

اعداد جادویی عددهایی هستند با معنایی خاص و رمزگذاری شده که کدها ظاهر می‌شوند، اما دارای هیچ مفهوم یا توضیحی نیستند. معمولاً این عددها به عنوان لیترال‌هایی در بیش از یک محل در کدهایمان ظاهر می‌شوند. بر اساس قواعد کد تمیز باید از به کارگیری Magic Numberها در کدها اجتناب کنیم. برای درک بهتر این موضوع، مثالی در ادامه ارائه شده است.

1import random
2
3# Not recommended
4def roll_dice():
5    return random.randint(0, 4)  # what is 4 supposed to represent?
6
7# Recommended
8DICE_SIDES = 4
9
10def roll_dice():
11    return random.randint(0, DICE_SIDES)

نوشتن کد تمیز در پایتون برای توابع

در خصوص توابع در پایتون نیز اصول، قواعد و روش‌هایی برای نوشتن کد تمیز یا همان کلین کد وجود دارد که در ادامه به شرح آن‌ها پرداخته‌ایم و مثال‌هایی هم برای هر مورد ارائه کرده‌ایم.

مثالی برای ثابت قدم بودن در قبال رعایت قراردادهای نام گذاری توابع در پایتون

همان‌طور که در خصوص متغیرها قراردادها و توافقات نام‌گذاری را رعایت می‌کنیم، لازم است این قواعد نام‌گذاری را در خصوص توابع پایتون هم رعایت کنیم. استفاده از قراردادهای نام‌گذاری مختلف ممکن است باعث سردرگمی سایر برنامه‌نویسان و توسعه‌دهندگان شود. به منظور درک بهتر این مهم، در ادامه مثالی آمده است.

1# Not recommended
2def get_users(): 
3    # do something
4    Pass
5
6def fetch_user(id): 
7    # do something
8    Pass
9
10def get_posts(): 
11    # do something
12    Pass
13
14def fetch_post(id):
15    # do something
16    pass
17
18# Recommended
19def fetch_users(): 
20    # do something
21    Pass
22
23def fetch_user(id): 
24    # do something
25    Pass
26
27def fetch_posts(): 
28    # do something
29    Pass
30
31def fetch_post(id):
32    # do something
33    pass

مثالی برای حفظ سادگی و اجرای تنها یک عملکرد در توابع

هر تابع باید تنها یک کار را انجام دهد، اما همان یک کار را به درستی انجام دهد. باید توابعی کوتاه و ساده بنویسیم که تنها یک وظیفه را اجرا می‌کنند. یک روش تجربی خوب در این خصوص این است که وقتی نام تابع شما مثلاً حاوی کلمه «and» باشد، آنگاه به احتمال زیاد بهتر است تابع خود را به ۲ تابع مختلف تبدیل و تقسیم کنید. در ادامه مثالی در خصوص حفظ اصل سادگی توابع در پایتون ارائه شده است.

1# Not recommended
2def fetch_and_display_users():
3users = [] # result from some api call
4
5    for user in users:
6        print(user)
7
8
9# Recommended
10def fetch_usersl():
11    users = [] # result from some api call
12        return users
13
14def display_users(users):
15for user in users:
16        print(user)

چارچوب های کد تمیز در پایتون برای کلاس ها

در خصوص کلاس در پایتون، نباید زمینه مازاد اضافه کنیم. این مسئله می‌تواند به وسیله اضافه کردن غیرضروری برخی کلمات به نام متغیرها در هنگام کار با کلاس‌ها رخ دهد. در ادامه برای درک بهتر این موضوع مثالی ارائه شده است.

1# Not recommended
2class Person:
3    def __init__(self, person_username, person_email, person_phone, person_address):
4        self.person_username = person_username
5        self.person_email = person_email
6        self.person_phone = person_phone
7        self.person_address = person_address
8
9# Recommended
10class Person:
11    def __init__(self, username, email, phone, address):
12
13        self.username = username
14        self.email = email
15        self.phone = phone
16        self.address = address

در مثال بالا، چون ما همین حالا در داخل کلاس Person هستیم، نیازی به اضافه کردن پیشوند Person به هر یک از متغیرهای کلاس وجود ندارد و کاری اضافه به حساب می‌آید.

ماژول بندی کردن کدها برای نوشتن کد تمیز در پایتون

برای اینکه کدها سازماندهی بهتری داشته باشند و نگهداری کدها آسان‌تر شود، در پایتون می‌توان منطق برنامه را در قالب چند فایل یا کلاس به نام ماژول بخش‌بندی کرد. ماژول در پایتون به بیان ساده فایلی است که نام آن به پسوند «.py» ختم می‌شود.

هر ماژول باید روی انجام یک کار متمرکز شود که البته آن یک کار را باید به خوبی انجام دهد. برای پیاده‌سازی بهتر کد تمیز در پایتون به ویژه در خصوص بحث ماژول‌بندی کدها، می‌توان اصولی نظیر ثواعد اساسی شی‌گرایی در پایتون را دنبال کرد. اصول شی‌گرایی شامل کپسوله‌سازی، انتزاع، ارث‌‌بری و چندریختی می‌شوند.

جمع‌بندی

در این مقاله به طور کلی راجع به چیستی کد تمیز یا همان کلین کد آموختیم. به همه ارزش‌ها، اصول و روش‌های کلین کد اشاره شد. همچنین الگوها و قواعد نوشتن کد تمیز در پایتون نیز شرح و آموزش داده شدند. البته همین الگوها را می‌توان در سایر زبان‌های برنامه نویسی هم اجرا و استفاده کرد. امید است با مطالعه این مقاله، دانش کافی پیرامون کد تمیز و برخی از الگوهای کاربردی برای نوشتن کلین کد بدست آمده باشد.

بر اساس رای ۱۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
t2informatikDEV.toTECHGIG
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *