بر اساس تصمیم اخیرم درجهت نوشتن برداشت های شخصی خود در مورد کد تمیز دومین پست این سری مجموعه رو با نام نامگذاری شروع میکنم.
نامگذاری به معنی انتخاب یک کلمه (و یا چند کلمه در قالب یک شبه جمله) که باعث رجوع راحت تر،جست و جوی بهتر و همچنین به خاطر سپاری سهل تر انجام میشود.
در دنیای انسان ها عموما نام افراد بر اساس علایق والدین انتخاب میشوند که هیچ ربطی به نحوه کارکرد و یا توانایی های فردی فرد ندارد (البته در بعضی موارد نام افراد برای تصاحب یک خصیصه شخصیتی خاص در بزرگ سال، مانند کریم_درجهت سخاوتمند بودن- انتخاب میشود.)
در دنیای اشیا برعکس دنیای برعکس دنیای انسان ها نامها بر اساس کارایی اجسام انتخاب میشوند.برای مثال قاب عکس.بیاید باهم اتفاقاتی که در ذهن بعد از دیدن کلمه "قاب عکس" می افتد را به صورت غیر علمی بررسی کنیم :
از این مثال یک برداشت ساده میتوان داشت :
ترکیب کلمات امکان حدس و درک مورد استفاده اشیا را ممکن میسازد.
براساس تعریف بالا از نامگذاری اشیا، امکان معادل سازی با دنیای نرم افزار به دلیل اشتراک در وجود اشیا قابل انجام است که بر اساس دسته های زیر قابل ارائه میباشد.نامگذاری در دنیای توسعه نرم افزار برای بخش های مختلفی قابل اعمال است،از جمله:
قبل از شروع بررسی نکات، شاه کلید نامگذاری را این جمله میدانم :
به گونهای نام انتخاب کنید که کدتان همانند یک نثر ادبی زیبا قابل خواندن و لذب بردن باشد.
در این بخش بررسی خاصی غیر از این نکته وجود ندارد که نامگذاری پروژه ها بهتر است بر اساس نوع معماری مورد استفاده به سادگی قابل درک باشد.برای مثال در پروژه درصورتی که بخشهایی برای انجام فعالیت های سطح 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 ها به برخلاف افزایش طول فایل ها، کلیک را افزایش نمیدهد، بلکه منجر به تایپ بیشتر توسعه دهنده ها و همچنین از ریخت افتادن کد ها میشود.
البته نباید این مورد را نادیده گرفت که به لطف کامپایلر ها و 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 ها با سختار پوشه ای آن میتواند یکسان نباشد.این مورد در تیمهای بزرگ دیده میشود.