مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

چگونه متغیرها را نامگذاری کنیم؟

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

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

نام خوب نامی است که قصد و هدف را مشخص کند

نام هایی که ما برای موجودیت های برنامه (متغیر، کلاس، تابع) انتخاب می کنیم باید نشان دهنده قصد و هدف ما از آن موجودیت باشد. یعنی نامی را که انتخاب کرده ایم به ما می گوید که اولا چرا چنین موجودیتی وجود دارد ثانیا چه کار می کند و ثالثا چطوری از آن استفاده می شود. دقت کنید که اگر نامگذاری شما برای رساندن منظور خود نیاز به کامنت گذاشتن دارد بدانید که آن نامگذاری درست نیست و باید نام آن موجودیت را تغییر دهید. مثلا نامگذاری زیر اشتباه است:

int d; // elapsed time in days 

بهتر است که نام متغیر بالا را به شکل زیر تغییر دهیم.

int elapsedTimeInDays;

شاید بگویید که این نامگذاری باعث طولانی شدن نام متغیر ما می شود و تایپ کردن آن زمانبر بوده و باعث پایین آمدن سرعت ما خواهد شد. دقت کنید که با ادیتور ها و IDE های موجود این بهانه کاملا رد می شود زیرا با قدرت و هوشمندی که ابزار های برنامه نویسی دارند لازم نیست که شما نام کل متغیر را تایپ کنید. اما مقدار شفافیتی که این نام با نام قبلی دارد بسیار زیاد است. پس نگران طولانی بودن نباشید و به با معنی بودن بپردازید.

از نامگذاری گمراه کننده پرهیز کنید.

برای انتخاب نام نباید نام هایی استفاده کنید که کسی که کد شما را می خواند به اشتباه بیاندازد و یا سرنخ غلط به او بدهد. مثلا ممکن است که اسم یک متغیر hp قرار داده شده باشد. خب با توجه به معروف بودن hp مشخص نیست که این متغیر دقیقا به چه منظور ساخته شده است و هدف ساختن آن چه بوده است. همچنین اگر مجموعه ای از دانش آموزان دارید که همه آنها را در متغیری به نام studentList ذخیره کرده اید دقت داشته باشید که نوع این متغیر حتما باید از نوع List باشد و آرایه یا ساختمان داده ی دیگری نباشد زیرا که خواننده را به اشتباه خواهد انداخت. اگر نوع متغیر این مجموعه دانش آموزان از نوع لیست نیست پس نام دیگری مانند students برای آن انتخاب کنید تا گویای مطلب باشد و گمراه کننده نباشد.

از  نام هایی که خیلی شبیه به هم هستند استفاده نکنید.

استفاده از نام هایی مانند عبارات زیر ممنوع است.

XYZControllerForEfficientHandlingOfStrings
XYZControllerForEfficientStorageOfStrings  

زیرا که بخش بزرگی از این دونام شبیه به هم هستند و همین امر باعث می شود که چشم های خواننده خسته شود و یا برنامه نویسان دیگر آنها را به جای همدیگر استفاده کنند که باعث دردسر خواهد شد. همچنین استفاده از L کوچک و o بزرگ به خاطر این که ممکن است که با اعداد 1و 0 اشتباه گرفته شود ممنوع است. همچنین استفاده از عباراتی مانند klass که همان کلاس است ولی به خاطر کلمه کلیدی بودن با k نوشته شده است تا کامپایلر خطا نگیرد نیز کار درستی نیست.

در تعریف متغیر ها از سری عددی استفاده نکنید.

استفاده از سری عددی به دنبال یک حرف کار بسیار کثیفی است مثل a1,a2,a3,…. با این که این نام ها گمراه کننده نیستند ولی هیچ قصد و منظوری را مشخص نمی کنند و هیچ اطلاعی از متغیر و استفاده از آن را به ما نمی دهند. دقت داشته باشید که نام متغیر باید به 3 سوال گفته شده در بالا پاسخ دهند.

از نامگذاری با معنی و قابل تلفظ استفاده کنید.

کسی که کد شما را می خواند باید کد شما برایش مانند یک نوشته جذاب و قابل فهم باشد مثلا نامی مثل gwda را نمی شود تلفظ کرد و همچنین برای خواننده هیچ معنی خاصی ندارد. همچنین نام getYYYYYY اسمی واقعا بد و بدون معنی می باشد.

همچنین از پیشوند هایی که به پیشوندهای لهستانی معروف هستند و در زبانهای قدیمی رایج بوده اند استفاده نکنید. مثلا استفاده از حرف c قبل از نام کلاس و یا _ قبل از نام فیلد داخلی واقعا کار اشتباهی است و نباید استفاده شود.

انتخاب نام کلاس و تابع

نام کلاس ها را از اسم ها انتخاب می کنیم مانند Account, Employee, Student, Message و نام توابع را به صورت فعل دستوری می نویسیم مثل GetAge و یا InsertName 

نام گذاری با توجه دامنه استفاده

اگر متغیری داریم که در یک بخش 3 خطی و کمتر استفاده می شود می توانیم نام آن را کوتاه انتخاب کنیم ولی اگر دامنه استفاده از این متغیر بیشتر از 3 خط است باید نام آن را کامل بنویسیم. پس طول نامگذاری متغیر با اندازه دامنه رابطه مستقیم دارد ولی برای نام کلاس و متد این قضیه به صورت عکس عمل می کند. مثلا هرچه یک متد یا کلاس عام تر باشند بهتر است نام آن کوتاه تر باشد. مثل open یا close که هم برای فایل ها و هم برای دیتابیس و هم برای سوکت ها استفاده می شود. ولی در دامنه های کوچک بهتر است که نام ما کامل باشد تا منظور ما کامل انتقال داده شود. در نامگذاری کلاس های ارث بری شده می توان یک صفت به نام آن اضافه کرد مثلا کلاس SavingAccount که از کلاس Account ارث بری کرده است. 

صریح کد بنویسید

از نام های جوک و شاعرانه و فلسفی و این چیز ها استفاده نکنید و صریح و واضح نام گذاری کنید مثلا نام abort درست است و استفاده از نامی مانند eatMyShorts به جای آن غلط است. درکدتان مزه نریزید و ضرب المثل نزنید و با کدتان لاس نزنید. برای هر منظور از یک نام مشخص استفاده کنید. مثلا fetch و get, retrieve تقریبا مشابه هم هستند ولی تصمیم بگیرید که در برنامه از یکی استفاده کنید و به آن پایبند باشید و آن را عوض نکنید. عکس قضیه رو هم رعایت کنید. از یک نام  برای چند منظور استفاده نکنید و از قاعده هر کلمه فقط برای یک مفهوم استفاده کنید.

کدی که شما می نویسید توسط برنامه نویس ها خوانده خواهد شد. پس مشکلی ندارد که از نام های معمول رشته کامپیوتر استفاده کنید مثل jobQueue . با دیدن این اسم برنامه نویس خواهد فهمید که یک ساختمان داده صف برای job ها در نظر گرفته شده است.در کد نوشته شده می توان از نام های موجود در problem domain هم استفاده کر مثلا اگر سیستم حسابداری می نویسید می توانید از نام های معمول در حسابداری استفاده کنید. مطالب گفته شده از کتاب clean code uncle bob آورده شده است.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات