قرارداد نام‌گذاری

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

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

## مزایای بالقوه
استفاده از قراردادهای نام‌گذاری مزایای گوناگونی دارد:
* ارائهٔ اطلاعات اضافی (فراداده) دربارهٔ کاربرد یک شناسه
* کمک به رسمی‌سازی انتظارات و ارتقای یکپارچگی در تیم توسعه
* امکان استفاده از ابزارهای خودکار بازسازی کد (refactoring) یا جست‌وجو و جایگزینی با کمترین احتمال خطا
* افزایش وضوح در موارد ابهام‌برانگیز
* بهبود ظاهر حرفه‌ای محصول (برای نمونه با ممنوع‌کردن نام‌های بیش‌ازحد طولانی یا مخفف‌های نامفهوم)
* جلوگیری از «برخورد نام‌ها» هنگام ترکیب محصولات سازمان‌های مختلف (همچنین نگاه کنید به: فضای نام)
* فراهم‌ساختن دادهٔ معنادار برای واگذاری پروژه و استفادهٔ مجدد از کد پس از مدت طولانی

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

## خوانایی
شناسه‌هایی که به‌خوبی انتخاب شده باشند درک سیستم و نگهداری کد منبع را برای توسعه‌دهندگان بسیار آسان‌تر می‌کنند. برای نمونه، گرچه عبارت زیر ممکن است هدف موردنظر را برآورده سازد:


```c
a = b * c;
```


اما مقصود آن آشکار نیست. در مقایسه با:


```c
weekly_pay = hours_worked * hourly_pay_rate;
```


که نیت و معنای کد را دست‌کم برای آشنایان با زمینهٔ موضوع روشن می‌سازد.

پژوهش‌ها نشان می‌دهند که سبک شناسه بر یادآوری و دقت تأثیر می‌گذارد و آشنایی با یک سبک خاص سرعت یادآوری را افزایش می‌دهد.

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

ملاحظات اصلی عبارتند از:
* شناسه‌های کوتاه‌تر تایپ آسان‌تری دارند (هرچند بسیاری از محیط‌های توسعه تکمیل خودکار ارائه می‌دهند)
* شناسه‌های بسیار کوتاه (مانند `i` یا `j`) با ابزارهای جست‌وجو و جایگزینی دشوار یافت می‌شوند (مگر با عبارت باقاعده)
* شناسه‌های بلندتر اطلاعات بیشتری منتقل می‌کنند اما ممکن است شلوغی بصری ایجاد کنند

از نظر تاریخی، کوتاهی نام متغیرها تا حدی ناشی از محدودیت‌های پیونددهنده‌های اولیه بود که نام متغیر را به ۶ نویسه محدود می‌کردند. در برخی نسخه‌های بیسیک فقط دو حرف نخست معنادار بود. همچنین نمایشگرهای کم‌وضوح نخستین (مثلاً ۸۰ ستونی) و ریشه‌های ریاضیاتی علوم رایانه که در آن متغیرها معمولاً تک‌حرفی‌اند در این امر نقش داشتند.

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

### شناسه‌های چندکلمه‌ای
از آنجا که بیشتر زبان‌های برنامه‌نویسی فاصله را در شناسه‌ها مجاز نمی‌دانند، روشی برای جداسازی واژهها لازم است. از نظر تاریخی برخی زبان‌های اولیه مانند الگول (۱۹۵۸) و فورترن (۱۹۵۵) فاصله را درون شناسه‌ها مجاز می‌دانستند، اما این رویکرد به دلیل دشواری تجزیهٔ واژگانی (tokenization) در زبان‌های بعدی کنار گذاشته شد.

#### جداسازی با نویسهٔ حائل
یک رویکرد، جداسازی کلمات با نویسهٔ غیرالفبایی-عددی است. دو نویسه‌ای که معمولاً برای این منظور به کار می‌روند خط پیوند (`-`) و زیرخط (`_`) هستند.

خط پیوند تقریباً در همهٔ برنامه‌های نوشته‌شده به کوبول (۱۹۵۹)، فورث (۱۹۷۰) و لیسپ (۱۹۵۸) به کار می‌رود و همچنین در دستورات و بسته‌های یونیکس و CSS رایج است. این شیوه نام استانداردی ندارد اما گاه *kebab-case* یا *lisp-case* نامیده می‌شود.

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

روش جایگزین استفاده از زیرخط است که در خانوادهٔ سی (از جمله پایتون) با حروف کوچک رایج است. این شیوه نگارش ماری (snake_case) نام دارد و در کتاب زبان برنامه‌نویسی سی (۱۹۷۸) دیده می‌شود. زیرخط با حروف بزرگ (مانند `UPPER_CASE`) معمولاً برای ماکروهای پیش‌پردازندهٔ سی و متغیرهای محیطی در یونیکس به کار می‌رود.

#### جداسازی با بزرگی حرف
رویکرد دیگر نشان‌دادن مرز واژه‌ها با بزرگ‌نویسی حرف میانی است که نگارش شتری (camelCase) یا PascalCase نامیده می‌شود. بدین ترتیب «`two words`» به‌صورت «`twoWords`» یا «`TwoWords`» نوشته می‌شود. این شیوه در پاسکال، جاوا، سی‌شارپ و ویژوال بیسیک رایج است.

نحوهٔ برخورد با سرنام‌ها در شناسه‌ها (مانند «اکس‌ام‌ال» و «HTTP» در XMLHttpRequest) متفاوت است: برخی آن‌ها را کوچک می‌نویسند (مثلاً `XmlHttpRequest`) و برخی بزرگ نگه می‌دارند (مثلاً `XMLHTTPRequest`).

#### جدول قالب‌های رایج شناسه‌های چندکلمه‌ای

## فراداده و قراردادهای ترکیبی
### نماد مجارستانی
شاید شناخته‌شده‌ترین قرارداد ترکیبی نماد مجارستانی باشد که هدف (نماد مجارستانی کاربردی) یا نوع داده (نماد مجارستانی سیستمی) متغیر را در نام آن رمزگذاری می‌کند. برای نمونه، پیشوند `sz` در متغیر `szName` نشان می‌دهد که متغیر رشته‌ای پایان‌یافته با نول (null-terminated string) است.

### نماد موقعیتی
سبکی که برای نام‌های بسیار کوتاه (هشت نویسه یا کمتر) به کار می‌رود. برای نمونه: `LCCIIL01` که در آن `LC` نام برنامهٔ کاربردی، `C` زبان کوبول، `IIL` زیرمجموعهٔ فرایند و `01` شمارهٔ ترتیبی است. این نوع قرارداد هنوز در رایانه‌های بزرگ (mainframe) مبتنی بر JCL و قالب ۸٫۳ سیستم MS-DOS کاربرد دارد.

### طرح واژهٔ ترکیبی (زبان OF)
«زبان OF» آی‌بی‌ام در راهنمای سامانهٔ مدیریت اطلاعات (IMS) مستند شده بود. این طرح از الگوی PRIME-MODIFIER-CLASS استفاده می‌کرد. واژه‌های PRIME موجودیت‌های اصلی سیستم، واژه‌های MODIFIER برای تدقیق و واژه‌های CLASS نوع داده را نشان می‌دادند. برای نمونه «`CUST-ACT-NO`» به معنای «شمارهٔ حساب مشتری» بود. واژه‌های CLASS معمولاً فهرستی کمتر از دو دوجین اصطلاح بودند و از نظر کارکرد مشابه پیشوندهای نماد مجارستانی عمل می‌کردند.

## قراردادهای ویژهٔ زبان‌های برنامه‌نویسی
### اکشن‌اسکریپت
قراردادهای کدنویسی ادوبی برای اکشن‌اسکریپت عمدتاً با استانداردهای اکما اسکریپت سازگار است و سبک شناسه‌ها مشابه جاوااسکریپت است.

### ایدا
در ایدا تنها سبک توصیه‌شده برای شناسه‌ها `Mixed_Case_With_Underscores` است.

### ای‌پی‌ال
در گویش‌های ای‌پی‌ال، از نشانهٔ دلتا (Δ) برای جداسازی واژه‌ها استفاده می‌شود؛ مانند `PERFΔSQUARE`. در نسخه‌های قدیمی‌تر حروف کوچک وجود نداشت.

### سی و سی‌پلاس‌پلاس
در سی و C++، واژه‌های کلیدی و شناسه‌های کتابخانه استاندارد سی عمدتاً با حروف کوچک هستند. نام‌هایی که ماکروهای پیش‌پردازنده را نمایش می‌دهند طبق قرارداد تنها با حروف بزرگ و زیرخط نوشته می‌شوند (مانند `NULL` و `EINVAL`). نام‌های دارای دو زیرخط متوالی یا آغازشده با زیرخط و حرف بزرگ برای پیاده‌سازی (کامپایلر، کتابخانهٔ استاندارد) رزرو شده‌اند.

#### سی
در پایگاه‌های کد قدیمی‌تر مانند استانداردهای کدنویسی گنو یا سبک هستهٔ لینوکس، همهٔ نمادها به‌صورت  نوشته می‌شوند (به‌جز ماکروها و شمارشی‌ها که  هستند). پسوند `_t` اغلب برای نشان‌دادن یک نوع به کار می‌رود (مانند `size_t`). POSIX این نام‌ها را رزرو کرده‌است.

پایگاه‌های کد جدیدتر مانند اس‌دی‌ال، وولکان و Raylib از  برای نمادها استفاده و از پسوند `_t` اجتناب می‌کنند.

به دلیل نبود فضای نام در سی، توابع اغلب با نام کتابخانه پیشوندگذاری می‌شوند. برای نمونه در اپن‌اس‌اس‌ال تابع `SSL_new()` برای ساختن یک شیء `SSL*` به کار می‌رود.

ویندوز ای‌پی‌آی از  برای توابع (مانند `CreateFile()`)، حروف بزرگ برای انواع (مانند `HANDLE`) و نماد مجارستانی برای متغیرها استفاده می‌کند.

#### سی‌پلاس‌پلاس
در C++ چندین سبک نام‌گذاری وجود دارد و هیچ‌یک غالب نیست:
* در راهنماهای سبک قدیمی‌تر و متأثر از سی،  برای انواع به کار می‌رود. کتابخانه استاندارد سی++ و بوست از این سبک پیروی می‌کنند (مانند `std::unordered_map`). در این سبک تنها ماکروها  هستند و ثابت‌ها  می‌مانند تا با ماکروها تداخل نداشته باشند (مانند `std::numbers::pi`). پارامترهای قالب ممکن است  باشند.
* در راهنماهای سبک جدیدتر مانند گوگل، متا یا POCO، انواع به‌صورت  و متدها و متغیرها به‌صورت  نام‌گذاری می‌شوند.
* بی‌یارنه استراس‌تروپ، خالق سی‌پلاس‌پلاس، در کتاب خود سبکی به نام «PPP» را اتخاذ کرده که حرف نخست نوع را بزرگ می‌نویسد و اجزای نام را با زیرخط جدا می‌کند (مانند `My_vector`).

### جاوا
قراردادهای نام‌گذاری جاوا از آغاز پیدایش این زبان الزامات دقیقی برای بزرگ‌نویسی کلاس‌ها و متغیرها تعیین کرده‌اند. نام کلاس‌ها با حرف بزرگ آغاز می‌شود (مانند `String` یا `ArrayList`)، نام متدها با حرف کوچک (مانند `add` یا `isEmpty`) و ثابت‌ها تماماً با حروف بزرگ و جداکننده زیرخط نوشته می‌شوند (مانند `MIN_VALUE`).

## استاندارد ایزو/آی‌ئی‌سی ۱۱۱۷۹
استاندارد ISO/IEC 11179-5 دربارهٔ ثبت فراداده شامل قراردادهای نام‌گذاری برای مفاهیم عناصر، حوزه‌های مفهومی و حوزه‌های مقداری است. این استاندارد همهٔ زبان‌های نشانه‌گذاری (HTML، XML و غیره) و نیز داده‌هایی را که از طریق عناصر فراداده توسط زبان‌های دیگر استفاده می‌شوند پوشش می‌دهد.

## جستارهای وابسته
* نگارش شتری
* نگارش ماری
* نماد مجارستانی
* سبک تورفتگی
* نحو (زبان‌های برنامه‌نویسی)

## منابع

## پیوند به بیرون
* راهنمای سبک گوگل
* PEP 8 — راهنمای سبک پایتون

رده:قراردادهای نامگذاری
رده:کد منبع