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

شی‌گرایی OOP

OOP — Object-Oriented Programming

شی‌گرایی سبکی از برنامه‌نویسی است که در آن برنامه از مجموعه‌ای از اشیاء ساخته می‌شود؛ هر شیء داده‌های خودش را نگه می‌دارد و رفتارهای مربوط به آن داده‌ها را انجام می‌دهد. هدف اصلی‌اش مدیریت پیچیدگی در نرم‌افزارهای بزرگ است.

ایدهٔ اصلی

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

شی‌گرایی پیشنهاد داد: داده و رفتارهای مربوط به آن را کنار هم بگذاریم. به‌جای «تابعی که موجودی حساب را تغییر می‌دهد»، «حسابی که می‌تواند موجودی خودش را تغییر دهد».

مزیت این تغییر نگاه، محدودکردن دامنهٔ تأثیر است: اگر مشکلی در موجودی حساب پیش بیاید، فقط باید کلاس حساب را بررسی کنید، نه کل برنامه را.

چهار اصل

۱. کپسوله‌سازی. پنهان‌کردن جزئیات درونی و ارائهٔ رابطی کنترل‌شده به بیرون. کاربر شیء لازم نیست بداند داده‌ها چطور ذخیره شده‌اند؛ فقط از متدها استفاده می‌کند.

مثال: برای برداشت از حساب، متد withdraw را صدا می‌زنید. این متد بررسی می‌کند موجودی کافی هست یا نه. اگر موجودی مستقیماً قابل تغییر بود، هر کسی می‌توانست آن را منفی کند.

۲. وراثت. ساختن کلاس تازه بر پایهٔ کلاس موجود، برای استفادهٔ مجدد از کد مشترک.

۳. چندریختی. اشیاء مختلف می‌توانند به یک پیام واحد، پاسخ‌های متفاوتی بدهند.

مثال: اگر متد draw() را روی اشیاء «دایره»، «مربع» و «مثلث» صدا بزنید، هر کدام خودشان را به شکل درست رسم می‌کنند. کد فراخواننده لازم نیست بداند با کدام شکل طرف است.

۴. انتزاع. نمایش فقط جزئیات ضروری و پنهان‌کردن پیچیدگی. شما رانندگی می‌کنید بدون آنکه سازوکار موتور را بدانید؛ فرمان و پدال، رابط انتزاعی خودرو هستند.

کدام مهم‌تر است؟

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

مزایا و انتقادها

مزایا:

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

انتقادهای جدی:

  • پیچیدگی بی‌مورد. برای برنامه‌های کوچک، لایه‌های انتزاع بیشتر از آنکه کمک کنند، دست‌وپاگیرند.
  • وضعیت پراکنده. وقتی داده در ده‌ها شیء توزیع شده، دنبال‌کردن اینکه چه چیزی چه زمانی تغییر کرده دشوار می‌شود — به‌ویژه در برنامه‌های هم‌زمان.
  • وسواس وراثت. سلسله‌مراتب‌های عمیق، فهم کد را تقریباً غیرممکن می‌کنند.
  • ناهماهنگی با مدل‌های داده. نگاشت اشیاء به جدول‌های پایگاه داده، مشکلات شناخته‌شدهٔ خود را دارد.

به همین دلیل امروز بسیاری از زبان‌ها و تیم‌ها رویکرد ترکیبی دارند: از کلاس برای سازمان‌دهی استفاده می‌کنند اما ایده‌هایی مثل داده‌های تغییرناپذیر و توابع خالص را هم از برنامه‌نویسی تابعی وام می‌گیرند.

کِی مناسب است؟

مناسب: نرم‌افزارهای بزرگ با مفاهیم دامنه‌ای روشن، سامانه‌هایی که باید سال‌ها نگهداری شوند، و پروژه‌های تیمی.

کمتر مناسب: اسکریپت‌های کوتاه، پردازش داده و تبدیل‌های پیاپی، و برنامه‌هایی که عمدتاً محاسباتی‌اند.

اشتباه رایج تازه‌کارها

ساختن کلاس برای هر چیزی، فقط به این دلیل که «شی‌گرایی بهتر است». اگر اسکریپتی می‌نویسید که یک فایل را می‌خواند و خلاصه‌ای چاپ می‌کند، چند تابع ساده کاملاً کافی است. شی‌گرایی ابزاری برای مدیریت پیچیدگی است؛ اگر پیچیدگی وجود ندارد، فقط سربار اضافه می‌کند.

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

آیا شی‌گرایی بهترین سبک برنامه‌نویسی است؟

هیچ سبکی مطلقاً بهترین نیست. شی‌گرایی برای مدل‌سازی سامانه‌های بزرگ با موجودیت‌های مشخص عالی است. برنامه‌نویسی تابعی برای پردازش داده و محاسبات موازی مزایای روشنی دارد. بیشتر زبان‌های مدرن از هر دو پشتیبانی می‌کنند و انتخاب به مسئله بستگی دارد.

از کجا یادگیری شی‌گرایی را شروع کنم؟

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

رابط چیست و چه فرقی با کلاس دارد؟

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