توسعه کد برای مجالس ! - نام‌گذاری - قسمت اول

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

مفهوم نام‌گذاری

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

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

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

  • کلمه قاب عکس خوانده شده و به مغز منتقل می‌شود.
  • کلمه به دو بخش "قاب" و "عکس" شکسته می‌شود.
  • مغز سه برچسب را به سرعت شناسایی می‌کند : "قاب"، "عکس" و "قاب عکس"
  • برای هر سه برچسب فوق، مغز کارایی و موارد استفاده گوناگونی را دسته بندی می‌کند.
  • بعد از لحظه تفکیک و آماده شدن برچسب ها و موارد استفاده (که در زمان بسیار بسیار بسیار سریعی اتفاق می افتد) شما قادر به درک موقعیت هستید.

از این مثال یک برداشت ساده می‌توان داشت :

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

نام‌گذاری در دنیای نرم افزار

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

  • نام پروژه.
  • نام پوشه‌ها.
  • نام فایل‌ها.
  • نام namespace ها.
  • نام کلاس‌ها.
  • نام خصوصیت‌ها (فیلد‌ها).
  • نام قابلیت‌ها (متد‌ها و توابع).
  • نام ورودی های متد‌ها و توابع.
  • نام متغیر‌های محلی.

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

به گونه‌ای نام انتخاب کنید که کدتان همانند یک نثر ادبی زیبا قابل خواندن و لذب بردن باشد.

نام پروژه

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


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

نام پوشه‌ها

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

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

برای کلاس اصلی :

src > MainProjectName > DomainService > TaxCalculation > LegalCustomersTaxCalculationService.cs

برای کلاس تست مربوط به کلاس اصلی :

src > MainProjectName > DomainServiceTests > TaxCalculation > LegalCustomersTaxCalculationServiceTests.cs

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

حال ساختار زیر را درنظر بگیرید :

برای کلاس اصلی :

src > MainProjectName > DomainService > Tax > LegealCustomers > TaxCalculationService.cs

برای کلاس تست مربوط به کلاس اصلی :

src > MainProjectName > DomainServiceTests > Tax > LegalCustomers > TaxCalculationServiceTests.cs

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

نام فایل‌ها

به کرات در پروژه‌های مختلف شاهد این مورد بوده ام که فایل‌هایی مانند :

Text1.txt / Class1.cs /style.css / a.cs / java.java / a.ts / main.js / ...

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

همیشه نام هایی انتخاب کنید که دو خصیصه اصلی زیر را دارا باشند :

  • قابلیت حدس محتویات آن و مورد کاربرد آن وجود دارد.
  • قابلیت جست‌و‌جو داشته باشند.

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

انتخاب نام در توسعه کد
انتخاب نام در توسعه کد

نام namespace ها

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

البته نباید این مورد را نادیده گرفت که به لطف کامپایلر ها و IDE های فعلی این موارد کمتر به چشم می‌آید-استفاده از کلید واژه‌هایی مانند : using/import کار توسعه دهنده بسیار راحت تر شده است - ولی نکته مهم در افزایش طول namespace ها تولید کلاس‌هایی با اسم های unique تر خواهیم بود.برای مثال :

با کنترل namespace ها می‌‎توان :

MainProjectName.DomainService.Tax.LegealCustomers.TaxCalculation.TaxCalculationService.cs

به

MainProjectName.DomainService.TaxCalculation.LegalCustomersTaxCalculationService.cs

تغییر داد، که علاوه بر خوانایی بهتر از ساخت نام های عمومی - TaxCalculationService- که قادر به حدس محتویات آن بدون باز کردن و مطالعه آن نیستیم، جلوگیری می‌کند.



یکی دیگر از مواردی که در نام‌گذاری namespace ها اهمیت دارد، انتخاب نام هایی است که با خواندن آن، خواننده به صورت مرحله به مرحله توانایی حدس مورد استفاده زیر مجموعه ها را داشته باشد.برای مثال توجه شما را به یکی از namespace های معروف در dot net framework است جلب می‎‌کنم :

System.IO.File

برداشت های اولیه از این namespace، دست شما را گرفته و مرحله به مرحله مشخص می کنید که :

از ابزار های سیستم عاملی ، در زیرمجموعه فعالیت های I/O ، فعالیت های مربوط به کارکردن با File ها در این namespace قرار دارد.

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