متغیر
Variableمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.
متغیر مثل جعبهٔ برچسبدار
رایجترین قیاس: متغیر را جعبهای در نظر بگیرید که برچسبی روی آن زدهاید. داخل جعبه یک مقدار است و برچسب، نام متغیر.
- اعلان. جعبه را میسازید و نامگذاری میکنید.
- مقداردهی. چیزی داخل جعبه میگذارید.
- خواندن. محتوای جعبه را نگاه میکنید.
- تغییر. محتوای قبلی را با مقدار تازه جایگزین میکنید — مقدار قبلی از بین میرود.
واژهٔ «متغیر» دقیقاً به همین اشاره دارد: مقدارش میتواند در طول اجرای برنامه تغییر کند. در مقابل، ثابت مقداری است که پس از تعیین، دیگر قابل تغییر نیست — مثلاً نرخ مالیات یا حداکثر تعداد مجاز کاربران.
اگر مقداری قرار نیست تغییر کند، آن را بهعنوان ثابت تعریف کنید. این کار خطاهای ناشی از تغییر تصادفی را حذف میکند و به خوانندهٔ کد میگوید که این مقدار ثابت است. در بسیاری از زبانهای مدرن، ثابت حالت پیشفرض توصیهشده است.
انواع داده
هر متغیر نوعی دارد که تعیین میکند چه چیزی میتواند نگه دارد و چه عملیاتی روی آن مجاز است:
| نوع | نگه میدارد | نمونه |
|---|---|---|
| عدد صحیح | عدد بدون اعشار | سن، تعداد |
| عدد اعشاری | عدد با بخش اعشاری | قیمت، وزن |
| رشته | متن | نام، نشانی |
| منطقی | درست یا نادرست | آیا کاربر وارد شده؟ |
| آرایه/فهرست | مجموعهای از مقادیر | فهرست نامها |
| تهی | نبودِ مقدار | فیلدی که پر نشده |
زبانها در برخورد با نوع دو دستهاند:
- ایستا. نوع را از ابتدا اعلام میکنید و تغییر نمیکند. خطاها زودتر — هنگام کامپایل — پیدا میشوند.
- پویا. نوع در زمان اجرا تعیین میشود. نوشتن سریعتر است اما برخی خطاها تا زمان اجرا پنهان میمانند.
در بسیاری از زبانها، جمع رشتهٔ «۵» با عدد ۵ نتیجهٔ غیرمنتظره میدهد — گاهی «۵۵» و گاهی خطا. همیشه مطمئن شوید ورودی کاربر را پیش از محاسبه به نوع درست تبدیل کردهاید. ورودی فرمهای وب همیشه متن است، حتی وقتی عدد به نظر میرسد.
نامگذاری: مهارتی که دستکم گرفته میشود
نام متغیر تنها چیزی است که به خوانندهٔ کد میگوید این مقدار چیست. قواعد عملی:
- توصیفی باشد.
userAgeبهتر ازxیاtempاست. - طول متناسب با دامنه. در حلقهٔ کوتاه،
iکاملاً پذیرفته است. در متغیری که در کل فایل استفاده میشود، نام کامل لازم است. - واحد را در نام بیاورید.
timeoutSecondsبسیار بهتر ازtimeoutاست؛ اینکه ثانیه است یا میلیثانیه، منشأ خطاهای واقعی بوده است. - متغیر منطقی را پرسشی نامگذاری کنید.
isActiveیاhasPermission. - از مخففهای شخصی بپرهیزید. مخففی که فقط شما میفهمید، بدتر از نام طولانی است.
- یکدست باشید. در یک پروژه، یک سبک نامگذاری را انتخاب و رعایت کنید.
دامنه: متغیر کجا در دسترس است؟
دامنه تعیین میکند یک متغیر از کجا قابل دسترسی است:
- محلی. فقط داخل تابع یا بلوکی که در آن تعریف شده. پس از پایان آن بلوک، از بین میرود.
- سراسری. از همهجای برنامه قابل دسترسی.
قاعدهٔ حرفهای: دامنه را تا حد ممکن محدود نگه دارید. متغیر سراسری از هر نقطهای قابل تغییر است، و وقتی مقدارش اشتباه شد، باید کل برنامه را بگردید تا بفهمید چه کسی آن را عوض کرده. متغیر محلی این مشکل را ندارد.
مفهوم مرتبط دیگر طول عمر است: متغیر چه مدت در حافظه میماند. متغیرهای محلی معمولاً با پایان تابع آزاد میشوند. در زبانهایی که مدیریت حافظهٔ خودکار ندارند، فراموشکردن آزادسازی حافظه به نشت حافظه منجر میشود.
پرسشهای متداول دربارهٔ متغیر
تفاوت متغیر و ثابت چیست؟
مقدار متغیر میتواند در طول اجرا تغییر کند؛ ثابت پس از مقداردهی اولیه قابل تغییر نیست. استفاده از ثابت هرجا که ممکن است، کد را ایمنتر و قابل فهمتر میکند.
آیا میتوانم نام متغیر را فارسی بگذارم؟
برخی زبانهای مدرن از حروف یونیکد در نامگذاری پشتیبانی میکنند، پس از نظر فنی ممکن است. اما در عمل توصیه نمیشود: مشکلات کدگذاری، دشواری تایپ در محیطهای مختلف، و ناسازگاری با ابزارها و همکاری بینالمللی. نامها را انگلیسی بنویسید و توضیحات را فارسی.
منظور از مقداردهی اولیه چیست؟
دادن مقدار به متغیر بلافاصله پس از تعریف آن. استفاده از متغیری که هرگز مقداردهی نشده، در برخی زبانها خطا و در برخی دیگر منجر به مقادیر غیرقابل پیشبینی میشود — منشأ باگهایی که یافتنشان بسیار دشوار است.
اصطلاحات همخانوادهٔ مفاهیم پایه برنامهنویسی
مشاهدهٔ همه ←- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.
- الگوریتمالگوریتم دنبالهای متناهی از گامهای دقیق و بدون ابهام است که مسئلهای را حل میکند. الگوریتم مستقل از زبان برنامهنویسی است: یک الگوریتم واحد را میتوان در هر زبانی پیاده کرد، درست مثل دستور پختی که با هر اجاقی قابل اجراست.
- فلوچارتفلوچارت یا نمودار گردش کار، نمایش تصویری یک فرایند یا الگوریتم با شکلهای استاندارد است. هر شکل معنای مشخصی دارد و فلشها مسیر اجرا را نشان میدهند. کاربردش فراتر از برنامهنویسی است و در طراحی هر فرایندی به کار میآید.
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
- شیگرایی OOPشیگرایی سبکی از برنامهنویسی است که در آن برنامه از مجموعهای از اشیاء ساخته میشود؛ هر شیء دادههای خودش را نگه میدارد و رفتارهای مربوط به آن دادهها را انجام میدهد. هدف اصلیاش مدیریت پیچیدگی در نرمافزارهای بزرگ است.
برای درک کاملتر، اینها را هم بخوانید
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.