NO. 0206
برنامه‌نویسی و طراحی وب مفاهیم پایه برنامه‌نویسی

کلاس

Class

کلاس نقشه یا قالبی است که تعیین می‌کند یک نوع شیء چه ویژگی‌هایی دارد و چه کارهایی می‌تواند انجام دهد. از روی یک کلاس می‌توان بی‌نهایت شیء ساخت که هر کدام داده‌های خودشان را دارند اما رفتار مشترکی نشان می‌دهند.

کلاس نقشه است، شیء ساختمان

این تمایز، پایهٔ فهم موضوع است:

  • کلاس فقط یک تعریف است و در حافظه جای چندانی نمی‌گیرد. مثل نقشهٔ یک آپارتمان.
  • شیء نمونهٔ ساخته‌شده از روی آن کلاس است. مثل آپارتمان واقعی که از روی نقشه ساخته شده.

از روی یک نقشه می‌توان صد آپارتمان ساخت. همه ساختار یکسانی دارند اما هر کدام ساکنان و وسایل خودشان را دارند. در برنامه‌نویسی هم از یک کلاس User می‌توان هزاران شیء ساخت که هر کدام نام و ایمیل خودشان را دارند.

هر کلاس دو دسته عضو دارد:

  • ویژگی — داده‌هایی که شیء نگه می‌دارد؛ مثل نام، سن و ایمیل.
  • متد — کارهایی که شیء می‌تواند انجام دهد؛ در واقع توابعی که به آن کلاس تعلق دارند.
سازنده

متد ویژه‌ای که هنگام ساخت شیء تازه به‌طور خودکار اجرا می‌شود. کارش مقداردهی اولیه به ویژگی‌هاست — مثل تحویل‌گرفتن کلید و چیدن وسایل اولیهٔ آپارتمان.

چرا کلاس مفید است؟

مزیت اصلی، کنار هم قرار دادن داده و رفتار مرتبط است.

بدون کلاس، برای مدیریت یک حساب بانکی باید متغیرهای پراکنده‌ای برای موجودی، شمارهٔ حساب و نام صاحب حساب داشته باشید، و توابعی جدا برای واریز و برداشت که همهٔ این‌ها را به‌عنوان ورودی بگیرند.

با کلاس، همهٔ این‌ها در یک واحد منسجم جمع می‌شوند: شیء حساب، خودش موجودی‌اش را می‌داند و خودش می‌تواند واریز و برداشت کند.

مزیت دوم، کپسوله‌سازی است: می‌توانید تعیین کنید کدام بخش از داده‌ها از بیرون قابل دسترسی باشد. مثلاً موجودی حساب نباید مستقیماً از بیرون قابل تغییر باشد؛ فقط از طریق متدهای واریز و برداشت که قواعد را بررسی می‌کنند — مثل اینکه برداشت بیشتر از موجودی مجاز نیست.

این همان چیزی است که کلاس را از یک ساختار دادهٔ ساده متمایز می‌کند: نه‌تنها داده را نگه می‌دارد، بلکه از درستی آن محافظت می‌کند.

وراثت و ترکیب

وراثت یعنی یک کلاس می‌تواند ویژگی‌ها و متدهای کلاس دیگری را به ارث ببرد و چیزهایی به آن اضافه کند.

مثال: کلاس Employee همهٔ ویژگی‌های Person را دارد، به‌علاوهٔ حقوق و سمت. لازم نیست نام و سن را دوباره تعریف کنید.

هشدار مهم دربارهٔ وراثت

وراثت در نگاه اول جذاب است اما به‌راحتی سوءاستفاده می‌شود. سلسله‌مراتب عمیق وراثت — کلاسی که از کلاسی که از کلاسی ارث می‌برد — کد را به‌شدت دشوار می‌کند: برای فهمیدن رفتار یک شیء باید چند فایل را دنبال کنید.

توصیهٔ رایج امروز: ترکیب را بر وراثت ترجیح دهید. یعنی به‌جای اینکه بگویید «ماشین یک نوع موتور است»، بگویید «ماشین یک موتور دارد». این رویکرد انعطاف بیشتری می‌دهد.

آزمون ساده: اگر جملهٔ «الف یک نوع ب است» طبیعی به نظر می‌رسد، وراثت منطقی است. اگر «الف یک ب دارد» طبیعی‌تر است، ترکیب را انتخاب کنید.

اشتباه‌های رایج در طراحی

  • کلاس خدا. کلاسی که همه‌کار می‌کند و صدها خط طول دارد. اگر نام کلاسی Manager یا Helper است، معمولاً نشانهٔ همین مشکل است.
  • کلاس بدون رفتار. کلاسی که فقط داده نگه می‌دارد و هیچ متد معناداری ندارد. گاهی موجه است، اما اگر همهٔ کلاس‌هایتان چنین‌اند، احتمالاً منطق در جای اشتباهی نوشته شده.
  • افشای بیش از حد. باز گذاشتن همهٔ ویژگی‌ها برای دسترسی مستقیم، هدف کپسوله‌سازی را از بین می‌برد.
  • کلاس برای هر چیزی. اگر کاری با یک تابع ساده حل می‌شود، ساختن کلاس برایش پیچیدگی بی‌مورد است.
  • نام‌گذاری مبهم. نام کلاس باید اسم باشد و مفهوم روشنی از دنیای مسئله را نشان دهد.

پرسش‌های متداول دربارهٔ کلاس

تفاوت کلاس و شیء در یک جمله؟

کلاس تعریف است و شیء نمونهٔ ساخته‌شده از آن. کلاس را یک بار می‌نویسید؛ شیء را هر بار که لازم داشته باشید می‌سازید.

آیا همهٔ زبان‌ها کلاس دارند؟

خیر. برخی زبان‌ها اصلاً مفهوم کلاس ندارند و از رویکردهای دیگری برای سازمان‌دهی کد استفاده می‌کنند — مثل برنامه‌نویسی تابعی. کلاس یکی از راه‌های ساختاردهی است، نه تنها راه ممکن.

کلاس انتزاعی چیست؟

کلاسی که نمی‌توان مستقیماً از آن شیء ساخت و فقط برای ارث‌بری طراحی شده. کاربردش تعریف ساختار مشترکی است که کلاس‌های فرزند باید آن را کامل کنند — مثل نقشهٔ ناقصی که هر سازنده باید جزئیاتش را پر کند.