ورود

View Full Version : قراردادهای مختلف نامگذاری identifier ها



eshpilen
پنج شنبه 16 دی 1389, 13:09 عصر
دیشب داشتم یه برنامهء پایتون مینوشتم که خیلی زود به ابهام در زمینهء قرارداد صحیح نامگذاری متغییرها برخوردم. اول فکر کردم ای بابا عجب آدم بعد اینهمه سال و مطالعه، توی این چیزای پیش پا افتاده هم گیر میکنه!! بعد به مقاله ای در اینمورد (در ویکیپدیا) مراجعه کردم و متوجه شدم زیاد هم تقصیر من نیست. آخه هر زبان و حتی شرکتی و استانداردهای مختلف حتی برای یک زبان برای خودشون شیوه های نامگذاری مختلفی وضع کردن.
بخصوص اگر چند زبان رو یاد گرفته باشید و بخصوص که این زبانها از خانواده های مختلفی باشن و بازم بخصوص که بصورت تقریبا همزمان با چند زبان کار کنید، یه مقداری دچار سرگیجه و اشتباه و ابهام در این زمینه میشید و مثل من فکر میکنید سوادتون نم کشیده!!
تاحالا همه مدل روش نامگذاری دیدم. حتی در یک زبان استانداردها و استایلهای خیلی متفاوتی از ابعاد مختلف وجود داره که اونقدری وسیع هستن که بنده در این تاپیک فقط یک یا چند مورد خیلی مشترک از این ابعاد رو مطرح میکنم.
مثلا خیلی از برنامه نویسان سی از آندرلاین استفاده میکنن، ظاهرا خیلی ها هم از CamelCase. تازه خود CamelCase هم به چند روش و استایل و استاندارد که مختص یک زبان، شرکت و یا دسته ای از برنامه نویسان هست بکار میره.
توی بعضی برنامه ها ترکیب آندرلاین و CamelCase رو دیده بودم و فکر میکردم غیرمعمول هست و یا شاید حتی ناشی از اشتباه یا تنبلی برنامه نویس بوده؛ اما الان که این مقاله رو خوندم متوجه شدم حتی این هم میتونه یک قرارداد و استاندارد باشه.
فکر میکنم حتی بعضی جاها دیدم که در نامگذاری یک identifier منفرد، همزمان از هردوی CamelCase و آندرلاین استفاده شده، و البته خودم جاهایی به این مورد برخوردم که ممکنه این روش ترکیبی، خوانایی و معنای خاصی رو بتونه بهتر ایجاد کنه (احتمالا بسته به Context مورد نظر).

حالا بعضی موارد جالب توجه و قراردادها و استایل هایی رو که در زبانهای مختلف و توسط دسته های مختلف بکار میرن به اختصار ذکر میکنم. برای اطلاع دقیق و موثق و کامل به این مقاله مراجعه کنید: http://en.wikipedia.org/wiki/Naming_conventions_%28programming%29

----------

از خط تیره (hyphen) (م: که روی کیبورد، همون علامت منفی/تفریق هست) برای جداسازی کلمات بکار رفته در اسامی identifier ها در زبانهایی مثل COBOL و Lisp تقریبا توسط تمام برنامه نویسان این زبانها استفاده میشه. همچنین از خط تیر در identifier های CSS هم استفاده میشه (البته CSS یک زبان برنامه نویسی نیست).
خب البته در زبانهای دیگه ما اصولا نمیتونیم از خط تیره در اسامی استفاده کنیم. بنابراین مشکل و ناسازگاری و ابهامی بر سر این انتخاب، تقریبا وجود نداره؛ خوشبختانه!

----------

بیشتر زبانهای مدرن رو به استفاده از روش CamelCase آوردن. ولی هنوز بنظرم زیاد دیده میشه که افرادی با استایل های دیگری مثل استفاده از آندرلاین کار میکنن؛ بخصوص اونهایی که با زبانهایی مثل سی سابقهء آشنایی/کار قابل توجهی دارن و بخصوص برنامه نویسان قدیمی.

گفته میشه مزایای CamelCase نیاز به تایپ کمتر، اشغال فضای کمتر، و خوانایی بیشتر بخصوص وقتی یک ساختار سلسله مراتبی فضاهای نام گذاری پیچیده استفاده میشه هست.

----------

شرکت ادوبی روشهایی رو برای نامگذاری در ActionScript توصیه میکنه که بیشترشون با استاندارد ECMAScript سازگار هستن (م: ActionScript زبانی بر اساس ECMAScript هست که این ECMAScript در اصل ابتدا استاندارد جاوااسکریپت معروف بوده). استایل identifier ها شبیه جاوا هست.

----------

در زبان Ada، تنها استایل توصیه شده این هست: Mixed_Case_With_Underscores
یخورده عجیب نیست؟ چون هم اغلب (یا همیشه؟) باید حروف اول کلمات رو بزرگ بنویسیم و هم از آندرلاین استفاده کنیم. البته این شکل خوانایی قابل توجهی داره بنظرم!

----------

در زبان سی و سی++، کلمات کلیدی و identifier های کتابخانهء استاندارد، بیشتر با حروف کوچک هستن. البته ماکروها با تمام حروف بزرگ و استفاده از آندرلاین بعنوان جداکنندهء کلمات بکار رفته نوشته میشن (این استاندارد با قضیهء تمام حروف بزرگ بودن ثابت ها در خیلی از زبانهای برنامه نویسی، ارتباط داره).
در این دو زبان، اسامی ای که با دوتا آندرلاین یا یک آندرلاین و بعدش یک حرف بزرگ شروع میشن، برای استفاده در پیاده سازی خود زبان (کامپایلر و کتابخانهء استاندارد) درنظر گرفته شدن و نباید توسط برنامه نویسان استفاده بشن.

----------

استاندارد نامگذاری در جاوا که Sun Microsystem توصیه کرده از نوع CamelCase هست. برای نام کلاسها از CamelCase ای استفاده میکنیم که اولین حرف در اون حرف بزرگ هست، و توصیه میشه از کلمات کامل استفاده کنیم و از استفاده از اختصارها خودداری بشه مگر در مواردی که اون اختصارها از خود کلمه متداول تر هستن (مثلا URL یا HTML).
نام متدها باید بصورت فعل باشه و حرف اول کوچک. مثال: run ، getBackground
بقیهء متغییرها هم با اولین حرف کوچک نوشته میشن و ضمنا باید از استفاده از آندرلاین یا علامت دلار بعنوان اولین حرف اجتناب بشه. بعضی قراردادهای کدنویسی اظهار میکنن که آندرلاین باید به ابتدای تمام متغییرهای اشیاء (instance variables) اضافه بشه. از استفاده از نام متغییرهای یک کاراکتری باید اجتناب بشه، مگر درمورد متغییرهایی که بصورت موقتی بکار میرن و بعدا در جای دیگری از کد مورد استفاده قرار نمیگیرن.
ثابت ها در زبان جاوا، با تمام حروف بزرگ و آندرلاین بعنوان جداکننده نوشته میشن.
درمورد اختصارهای با طول سه یا بیشتر کاراکتر، بجای اینکه تمام حروف رو بزرگ بنویسیم، فقط حرف اول بزرگ نوشته میشه (م: البته این روش در بیشتر زبانهای دیگر هم خیلی معمول هست و فقط مختص جاوا نیست). بطور مثال parseDbmXmlFromIPAddress بجای parseDBMXMLFromIPAddress. البته میشه حتی سرنام های دو کاراکتری رو هم به اینصورت نوشت. یعنی مثلا parseDbmXmlFromIpAddress.

----------

در زبان JavaScript استاندارد رسمی خاصی وجود نداره، ولی اغلب از استانداردهای جاوا پیروی میشه.

----------

در Lisp از خط تیره برای جداسازی کلمات بکار رفته در نام identifier ها استفاده میشه.

----------

مایکروسافت درمورد .NET توصیه میکنه که از UpperCamelCase (یعنی CamelCase با اولین حرف بزرگ) که بنام Pascal Style هم شناخته میشه برای نامگذاری بیشتر identifier ها استفاده کنیم (lowerCamelCase برای پارامترها و متغییرها توصیه میشه). این استانداردی برای تمام زبانهای دات نت هست.
ضمنا میکروسافت توصیه میکنه که از پیشوندهای نوع (نشانه گذاری مجارستانی) استفاده نشه.

----------

در Perl، متغییرها و توابع محلی، با کلمات با تمام حروف کوچک، و جدا شده بوسیله آندرلاین نامگذاری میشن؛ متغییرها و توابعی که قرار هست private باشن یک آندرلاین هم در ابتدا دارن.
متغییرهای Package بصورت Title case (م: تاجاییکه فهمیدم یعنی همهء کلمات با حروف اول بزرگ، به استثنای بعضی مجموعه های خاص از کلمات) نامگذاری میشن.
ثابت ها با تمام حروف بزرگ.
نام Package ها بصورت camel case، به استثنای بعضی موارد (pragmata—e.g., strict and mro—which are lowercase).

----------

در Python توصیه میشه از UpperCamelCase برای نام کلاسها، تمام حروف بزرگ با آندرلاین بعنوان جداکننده (CAPITALIZED_WITH_UNDERSCORES) برای ثابت ها و lowercase_separated_by_underscores (تمام حروف کوچک؛ کلمات جداشده بوسیلهء آندرلاین) برای بقیهء identifier ها استفاده کنیم.

----------

Visual Basic بیشتر روی این تاکید داره که چه چیزی بیشتر خوانا هست بجای اینکه بخواد اطلاعاتی درمورد خود identifier بده.

==============================

خب امیدوارم خوشتون اومده باشه.
البته قصد این بود که نظر و تجربه و اطلاعات شما رو هم بدونیم. پس لطفا هر صحبتی در اینمورد دارید بفرمایید.
ضمنا من هنوز از خوندن این مقاله متوجه نشدم که باید اسم توابع Global خودم رو در پایتون بر اساس چه استایلی انتخاب کنم. بنظرم توضیح این مقاله درمورد پایتون خیلی ناقص هست؛ چون با مطالعهء نامگذاری های اجزای داخلی خود پایتون، ابهام و موارد دیگری هم دیده میشن. مثلا نام پکیج ها با حروف کوچک. و یه چیزای نسبتا غیرمنتظره ای مثل کلاس http.client.HTTPConnection و متدی با نام getresponse (البته مورد دوم خیلی عجیب تر و غیراستانداردتر بنظر میاد - مورد اول رو بعضیا استفاده میکنن و شاید قاعدهء استثنای خاصی هم داره).

eshpilen
پنج شنبه 16 دی 1389, 13:53 عصر
راستی بنظرم بد نیست یه توضیح دربارهء CamelCase برای مبتدی ها بدم (جسارت نباشه البته! چون دوستان این فروم که ماشالا بیشترشون حرفه ای هستن).
الان به همین عبارت CamelCase که نگاه کنید، مشخص هست یعنی چی. حرف اول هر کلمه رو بزرگ نوشتیم تا کلمات بکار رفته در یک نام، بدون نیاز به فاصله یا یک کاراکتر خاص بعنوان جداکننده، از هم تشخیص داده بشن.
یک نام بصورت CamelCase میتونه به دو صورت باشه؛ یک نوع که حرف اول اولین کلمهء اون نام در اون با حرف کوچک نوشته میشه (lowerCamelCase) و یک نوع که حرف اول اولین کلمهء نام با حرف بزرگ نوشته میشه (UpperCamelCase). اگر به کوچکی و بزرگی حروف خود این اصطلاح ها که نگاه کنید کاملا مشخص هست.
معمولا در بیشتر زبانهای برنامه نویسی مدرن، از UpperCamelCase برای نامگذاری کلاسها استفاده میشه (البته کلاس رو با شیء اشتباه نگیرید - یک کلاس، از اشیایی که از اون کلاس ایجاد میشن جداست). ولی مثلا درمورد متد همین کلاسها، بسته به استایل خود زبان و یا شرکت/افراد از هردو روش، و گاهی روشهای دیگری غیر از CamelCase، استفاده میشه. مثلا دات نت برای متدها هم از UpperCamelCase استفاده میکنه؛ اما جاوا از lowerCamelCase (که این استاندارد جاوا فکر کنم در خیلی زبانهای دیگه هم بکار میره).
کلا دات نت از این نظر متفاوت هست. اگر به اجزای دات نت نگاه کنید، تفاوت زیادی میبینید که این تفاوت همون کاربرد UpperCamelCase در بیشتر موارد هست که زبانهای دیگه در اون موارد اغلب استاندارد متداول دیگری دارن.

راستی شاید پرسیده باشید منظور از Camel در CamelCase چی هست. Camel یعنی شتر! و Case هم که به کوچکی و بزرگی حروف گفته میشه. و اصطلاح CamelCase به این اشاره داره که فرم کلی عبارتی که بصورت CamelCase نوشته شده بخاطر توالی حروف بزرگ و کوچک که بنابراین ارتفاع اونها تغییر میکنه، شبیه تفاوت ارتفاعی هست که کوهان شتر ایجاد میکنه!