همچنین نام 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ها استفاده بشه. حالات مختلف در نامگذاری اینترفیس ها:
صفت: ISerializable
اسم: IComponent
عبارت اسمی: ICustomDbFactoryProvider
- در موارد مناسب میشه از نام کلاس پایه به عنوان پسوند استفاده کرد. استفاده مناسب از این روش میتونه کمک زیادی به شناخت آسونتر جزء مربوطه بکنه. مثلا SystemException که نوعی Exception یا IndexAttribute که نوعی Attribute هست. البته در استفاده از این روش باید درک درستی از مفهوم نام نهایی تولید شده داشت و برای انتخابش قضاوتی منطقی انجام داد. مثلا انتخاب نام Button برای نوعی که از کلاس Control مشتق شده مثال نقضی بر این روشه که نشون میده درنظر گرفتن مفهوم و کارکرد نوع از رعایت این قاعده مهمتره، اما مثلا FileStream که از Stream مشتق شده چون مفهوم و عملیات انجام شده در نوع مربوطه رو به روشنی میرسونه، نام بسیار مناسبیه.
نوع جنریک که در دات نت 2.0 معرفی شد، مفهوم جدیدی با نام type parameter (که عموما با حرف 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 { ... }
درصورت پیاده سازی نوع جدیدی که از انواع موجود در کتابخونه های دات نت فریمورک مشتق میشه باید از قواعد زیر پیروی بشه:
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 استفاده بشه. |
- در حالت کلی، برای نامگذاری enumها باید از روش Pascal Casing استفاده کرد.
public enum ConsoleColor { Black, Blue, Cyan, ... }
[Flags] public enum ConsoleModifiers { Alt, Control, Shift }
public enum ImageMode { ImageModeBitmap = 0, // اضافه هست ImageMode پسوند ImageModeGrayscale = 1, ... }
public enum ImageMode { Bitmap = 0, Grayscale = 1, ... }
.: در ادامه به نامگذاری اعضای یک نوع پرداخته میشه.
قسمت اول: کلیات
قسمت دوم: جزئیات
قسمت سوم: نامگذاری اسمبلی
قسمت چهارم: نامگذاری فضای نام
قسمت پنجم: نامگذاری نوع
قسمت ششم: نامگذاری اعضای نوع
:.