Yusefnejad

یوسف نژاد

Yusefnejad

یوسف نژاد

در ادامه قسمت های قبلی (1 و 2 و 3 و 4)، در این قسمت نامگذاری class و struct و interface یا به صورت کلی «نوع» (Type) شرح داده میشه. ازاونجاکه class و struct نمایش دهنده موجودیتهای یک سیستم اند، نامشون درحالت کلی باید «اسم» (noun) یا عبارت اسمی (noun phrase) باشه. این قاعده اونقدر اهمیت داره که به عنوان یک قانون کلی اگه نشه یک اسم یا عبارت اسمی مناسب برای نام یک class یا struct پیدا کرد، احتمالا باید در طراحی کلی نوع مربوطه تجدیدنظر بشه.

همچنین نام interfaceهایی که به عنوان ریشه یک سلسله مراتب ارثبری استفاده میشن (مثل <IList<T)، باید به صورت اسم یا عبارت اسمی درنظر گرفته بشه. اما نام interfaceهایی که یکسری امکانات و توانایی ها رو به نمایش میزارن، باید صفت (adjective) یا عبارت صفتی (adjective phrase) باشه، (مثل IComparable و IFormattable).

نکته مهم دیگه ای که باید بهش توجه بشه اینه که برای نوع هایی که بیشترین استفاده رایج رو دارن باید از مناسبترین نامهایی که به سادگی قابل تشخیصن استفاده کرد، حتی اگه نام مورد استفاده از لحاظ فنی برای نوع دیگه ای با کاربرد کمتر مناسبتر باشه. مثلا نام بسیار رایجی که برای ارسال درخواست های چاپ به صف چاپگر استفاده میشه، Printer هست، درحالیکه از لحاظ فنی نام PrintQueue باید برای این نوع درنظر گرفته بشه و عبارت Printer برای مفهوم فیزیکی دستگاه چاپگر بکار میره. اما از لحاظ سادگی و رایج بودن، نام Printer برای این مورد بسیار مناسب و ایده آل هست، چون بیشتر مردم در استفاده از چاپگر بیشتر درگیر ارسال درخواستهای چاپ هستند تا موارد دیگه ای مثل تنظیم دستگاه. بنابراین باید از نام Printer به دلیل روشنی و رسوندن ساده تر مفهوم موردنظر، استفاده بشه. اما درصورت نیاز برای ارجاع به دستگاه چاپگر از لحاظ فیزیکی مثلا برای اعمال برخی تنظیمات میشه از عبارتی مثل PrinterConfiguration یا PrinterManager استفاده کرد. درواقع رعایت این قاعده باعث راهنمایی برنامه نویسها برای دسترسی آسونتر به API موردنظرشون میشه.

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

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

- در نامگذاری class و struct باید از «اسم» یا «عبارات اسمی» استفاده بشه. رعایت این قاعده باعث جداسازی آسونتر نوع از متد (که نام باید «فعل» باشه)  میشه.

- در نامگذاری interface باید از «صفت» یا «عبارات صفتی» استفاده بشه. در موارد معدودی هم میشه از «اسم» یا «عبارات اسمی» استفاده بشه. البته استفاده از اسم باید با دقت بیشتری انجام بشه چون ممکنه در این صورت استفاده از یک کلاس abstract مناسبتر باشه.

- باید از روش Pascal Casing استفاده بشه.

- به هیچ وجه نباید از پیشوند (مثل C یا Cls) استفاده کرد.

یکی از استثناهایی که در زمینه استفاده از پیشوند وجود داره، استفاده از حرف I در ابتدای نام interfaceهاست که به دلایل تاریخی وجود داره (مثلا از این روش در برنامه نویسی COM زیاد استفاده میشه). با اینکه این روش در دنیای دات نت کاملا پذیرفته شده، اما هنوز هم برخی با استفاده از این استثنا چندان موافق نیستن چون در بیشتر موارد برای برنامه نویسا فرقی نمیکنه که با یه کلاس abstract درگیرن یا یه اینترفیس، درصورتیکه غالب جامعه برنامه نویسای دات نت و سایر پلتفرمای مشابه (ازجمله خود من) از این روش به دلیل تمایز مشخصی که برای interfaceها ایجاد میکنه، طرفداری میکنن. درواقع این مورد از استثناهای عدم استفاده از روش Hungarian هم هست.

- باید از پیشوند I در نامگذاری interfaceها استفاده بشه. حالات مختلف در نامگذاری اینترفیس ها:
صفت: ISerializable
اسم: IComponent
عبارت اسمی: ICustomDbFactoryProvider

نکته: یک مورد استثنا و در واقع اشتباه در نامگذاری اینترفیسها که در دات نت فریمورک وجود داره System._AppDomain  هست. تکرار این اشتباه به هیچ وجه توصیه نمیشه.

- در موارد مناسب میشه از نام کلاس پایه به عنوان پسوند استفاده کرد. استفاده مناسب از این روش میتونه کمک زیادی به شناخت آسونتر جزء مربوطه بکنه. مثلا SystemException که نوعی Exception یا IndexAttribute که نوعی Attribute هست. البته در استفاده از این روش باید درک درستی از مفهوم نام نهایی تولید شده داشت و برای انتخابش قضاوتی منطقی انجام داد. مثلا انتخاب نام Button برای نوعی که از کلاس Control مشتق شده مثال نقضی بر این روشه که نشون میده درنظر گرفتن مفهوم و کارکرد نوع از رعایت این قاعده مهمتره، اما مثلا FileStream که از Stream مشتق شده چون مفهوم و عملیات انجام شده در نوع مربوطه رو به روشنی میرسونه، نام بسیار مناسبیه.
- نام کلاسی که پیاده سازی استاندارد یک اینترفیس هست، باید تنها در حرف با نام اینترفیس مربوطه تفاوت داشته باشه. مثلا کلاس Component که حاوی پیاده سازی استاندارد اینترفیس IComponent هست از این فاعده به درستی پیروی کرده.

نامگذاری پارامترهای نوع جنریک (Generic Type Parameter)

نوع جنریک که در دات نت 2.0 معرفی شد، مفهوم جدیدی با نام type parameter (که عموما با حرف T مشخص میشه) وارد دنیای دات نت کرد. نامگذاری این جزء جدید قواعد خاصی داره که عبارتند از:
- بهتره از حرف T برای نام تک حرفی پارامترهای نوع استفاده بشه. استفاده از حروف دیگه به دلیل کاربرد بسیار معدودشون (یا عدم کاربردشون) توصیه نمیشه.
- باید از حرف T در ابتدای نامهای توصیفی (چندحرفی) استفاده بشه.
- باید از عباراتی کاملا توصیفی برای نامگذاری این پارامترها استفاده بشه، مگه اینکه استفاده از نامهای تک حرفی (مثل T) برای رسوندن مفهوم مربوطه کافی به نظر برسه و استفاده از نامهای با طول بیشتر و توصیفی ارزش اضافه ای نداشته باشه. مثل:

public interface ISessionChannel<TSession> { ... }
public delegate TOutput Converter<TInput, TOutput>(TInput from);
public class Nullable<T> { ... }
public class List<T> { ... }

- درصورت امکان بهتره تا از قید بکار رفته برای پارامتر نوع در نامش استفاده بشه. مثال:

public interface ISessionChannel<TSession> where TSession : ISession { ... }

نامگذاری انواع رایج

درصورت پیاده سازی نوع جدیدی که از انواع موجود در کتابخونه های دات نت فریمورک مشتق میشه باید از قواعد زیر پیروی بشه:
- باید از راهنمایی موجود در جدول زیر برای بکاربردن پسوندهای مناسب در نامگذاری پیروی کرد. این قواعد برای کلیه کلاسهای موجود در سلسله مراتب ارثبری نوع مربوطه باید رعایت شود. مثلا استفاده از پسوند Exception هم برای کلاسهایی که به طور مستقیم از کلاس Exception مشتق میشن باید استفاده بشه و هم برای کلاسهایی که از مشتقات کلاس Excpetion به ارث میرن (مثلا FileNotFoundException).
استفاده از پسوندهای ارائه شده در جدول زیر باید تنها برای موارد خاص اشاره شده بکار برن و استفاده از اونا برای نوع های دیگری که از سایر کلاسها یا اینترفیس ها ارث میبرن ممنوعه. مثلا نامگذاریهای زیر اشتباهه:

public class SettingStream : String { ... }
public class ConfigException : Component { ... }

نوع پایه نکات نامگذاری
System.Attribute
باید از پسوند Attribute در نامگذاری استفاده بشه.
System.Delegate
برای نام delegateهایی که در ایونت ها استفاده میشن باید از پسوند EventHandler استفاده بشه.
برای سایر delegateها باید از پسوند Callback استفاده بشه.
نباید از پسوند Delegate استفاده بشه.
System.EventArgs
باید از پسوند EventArgs استفاده بشه.
System.Enum
هیچ نوعی نباید از این کلاس مشتق بشه. برای استفاده از این نوع باید از امکاناتی که زبانهای برنامه نویسی فراهم کردن استفاده بشه. مثلا در #C از کلمه کلید enum استفاده میشه.
نباید از پسوندهای Enum یا Flag استفاده بشه.
System.Exception
باید از پسوند Exception استفاده بشه.
IDictionary
IDictionary<TKey, TValue>
باید از پسوند Dictionary استفاده بشه. 
IEnumerable
ICollection
IList
IEnumerable<T>
ICollection<T>
IList<T>
باید از پسوند Collection استفاده بشه.
System.IO.Stream
باید از پسوند Stream استفاده بشه.
CodeAccessPermission
IPermission
باید از پسوند Permission استفاده بشه.

نامگذاری انواع شمارشی (Enumeration)

- در حالت کلی، برای نامگذاری enumها باید از روش Pascal Casing استفاده کرد.
- باید از نامهای مفرد استفاده کرد، مگه اینکه اعضای enum از نوع bit field باشن (flags enum). مثال:

public enum ConsoleColor
{
  Black,
  Blue,
  Cyan,
  ...
}

- برای enumهای از نوع flags (اونایی که اعضای bit field دارن) باید از نامهای جمع استفاده کرد. مثل:

[Flags]
public enum ConsoleModifiers
{
  Alt,
  Control,
  Shift
}

- نباید از پسوند یا پیشوندهای زائد مثل Enum یا Flags استفاده کرد.
- نباید از پسوند یا پیشوندهای زائد برای نامگذاری اعضای یک enum (مثلا نام خود enum) استفاده کرد. مثلا نمونه زیر کاملا اشتباهه:

public enum ImageMode
{
  ImageModeBitmap = 0, // اضافه هست ImageMode پسوند
  ImageModeGrayscale = 1,
  ...
}

که به جای این نامگذاری اشتباه باید از روش زیر استفاده کرد:

public enum ImageMode
{
  Bitmap = 0,
  Grayscale = 1,
  ...
}

.: در ادامه به نامگذاری اعضای یک نوع پرداخته میشه.

:.
  • یوسف نژاد

NET Framework.

NET.

نامگذاری

Naming

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
آخرین نظرات