شیگرایی OOP
OOP — Object-Oriented Programmingشیگرایی سبکی از برنامهنویسی است که در آن برنامه از مجموعهای از اشیاء ساخته میشود؛ هر شیء دادههای خودش را نگه میدارد و رفتارهای مربوط به آن دادهها را انجام میدهد. هدف اصلیاش مدیریت پیچیدگی در نرمافزارهای بزرگ است.
ایدهٔ اصلی
در سبک قدیمیتر، برنامه مجموعهای از دادهها و توابعی بود که روی آن دادهها کار میکردند — و این دو از هم جدا بودند. با بزرگشدن برنامه، دنبالکردن اینکه کدام تابع کدام داده را تغییر میدهد، به کابوس تبدیل میشد.
شیگرایی پیشنهاد داد: داده و رفتارهای مربوط به آن را کنار هم بگذاریم. بهجای «تابعی که موجودی حساب را تغییر میدهد»، «حسابی که میتواند موجودی خودش را تغییر دهد».
مزیت این تغییر نگاه، محدودکردن دامنهٔ تأثیر است: اگر مشکلی در موجودی حساب پیش بیاید، فقط باید کلاس حساب را بررسی کنید، نه کل برنامه را.
چهار اصل
۱. کپسولهسازی. پنهانکردن جزئیات درونی و ارائهٔ رابطی کنترلشده به بیرون. کاربر شیء لازم نیست بداند دادهها چطور ذخیره شدهاند؛ فقط از متدها استفاده میکند.
مثال: برای برداشت از حساب، متد withdraw را صدا میزنید. این متد بررسی میکند موجودی کافی هست یا نه. اگر موجودی مستقیماً قابل تغییر بود، هر کسی میتوانست آن را منفی کند.
۲. وراثت. ساختن کلاس تازه بر پایهٔ کلاس موجود، برای استفادهٔ مجدد از کد مشترک.
۳. چندریختی. اشیاء مختلف میتوانند به یک پیام واحد، پاسخهای متفاوتی بدهند.
مثال: اگر متد draw() را روی اشیاء «دایره»، «مربع» و «مثلث» صدا بزنید، هر کدام خودشان را به شکل درست رسم میکنند. کد فراخواننده لازم نیست بداند با کدام شکل طرف است.
۴. انتزاع. نمایش فقط جزئیات ضروری و پنهانکردن پیچیدگی. شما رانندگی میکنید بدون آنکه سازوکار موتور را بدانید؛ فرمان و پدال، رابط انتزاعی خودرو هستند.
کپسولهسازی و انتزاع، ارزش اصلی را میسازند. وراثت — همانطور که در بخش کلاس گفته شد — بیشترین سوءاستفاده را دارد و متخصصان امروز نسبت به آن محتاطترند.
مزایا و انتقادها
مزایا:
- مدلسازی طبیعی. مفاهیم دنیای واقعی — مشتری، سفارش، فاکتور — مستقیماً به کلاس تبدیل میشوند.
- نگهداری آسانتر. تغییر در یک کلاس، اثر محدودی بر بقیه دارد.
- کار تیمی. هر توسعهدهنده میتواند روی کلاسهای جداگانه کار کند.
- استفادهٔ مجدد. کلاسهای عمومی در پروژههای مختلف قابل استفادهاند.
انتقادهای جدی:
- پیچیدگی بیمورد. برای برنامههای کوچک، لایههای انتزاع بیشتر از آنکه کمک کنند، دستوپاگیرند.
- وضعیت پراکنده. وقتی داده در دهها شیء توزیع شده، دنبالکردن اینکه چه چیزی چه زمانی تغییر کرده دشوار میشود — بهویژه در برنامههای همزمان.
- وسواس وراثت. سلسلهمراتبهای عمیق، فهم کد را تقریباً غیرممکن میکنند.
- ناهماهنگی با مدلهای داده. نگاشت اشیاء به جدولهای پایگاه داده، مشکلات شناختهشدهٔ خود را دارد.
به همین دلیل امروز بسیاری از زبانها و تیمها رویکرد ترکیبی دارند: از کلاس برای سازماندهی استفاده میکنند اما ایدههایی مثل دادههای تغییرناپذیر و توابع خالص را هم از برنامهنویسی تابعی وام میگیرند.
کِی مناسب است؟
مناسب: نرمافزارهای بزرگ با مفاهیم دامنهای روشن، سامانههایی که باید سالها نگهداری شوند، و پروژههای تیمی.
کمتر مناسب: اسکریپتهای کوتاه، پردازش داده و تبدیلهای پیاپی، و برنامههایی که عمدتاً محاسباتیاند.
ساختن کلاس برای هر چیزی، فقط به این دلیل که «شیگرایی بهتر است». اگر اسکریپتی مینویسید که یک فایل را میخواند و خلاصهای چاپ میکند، چند تابع ساده کاملاً کافی است. شیگرایی ابزاری برای مدیریت پیچیدگی است؛ اگر پیچیدگی وجود ندارد، فقط سربار اضافه میکند.
پرسشهای متداول دربارهٔ شیگرایی OOP
آیا شیگرایی بهترین سبک برنامهنویسی است؟
هیچ سبکی مطلقاً بهترین نیست. شیگرایی برای مدلسازی سامانههای بزرگ با موجودیتهای مشخص عالی است. برنامهنویسی تابعی برای پردازش داده و محاسبات موازی مزایای روشنی دارد. بیشتر زبانهای مدرن از هر دو پشتیبانی میکنند و انتخاب به مسئله بستگی دارد.
از کجا یادگیری شیگرایی را شروع کنم؟
ابتدا مفاهیم پایه — متغیر، تابع، شرط و حلقه — را کاملاً یاد بگیرید. سپس با کلاس و شیء شروع کنید و روی کپسولهسازی تمرکز کنید. وراثت و چندریختی را در مرحلهٔ آخر بیاموزید و در ابتدا کم از وراثت استفاده کنید.
رابط چیست و چه فرقی با کلاس دارد؟
رابط فقط تعیین میکند چه متدهایی باید وجود داشته باشند، بدون آنکه پیادهسازیشان را مشخص کند — مثل قراردادی که کلاس متعهد به رعایتش است. کلاس هم تعریف میکند و هم پیادهسازی. رابط ابزار اصلی رسیدن به چندریختی است.
اصطلاحات همخانوادهٔ مفاهیم پایه برنامهنویسی
مشاهدهٔ همه ←- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.
- الگوریتمالگوریتم دنبالهای متناهی از گامهای دقیق و بدون ابهام است که مسئلهای را حل میکند. الگوریتم مستقل از زبان برنامهنویسی است: یک الگوریتم واحد را میتوان در هر زبانی پیاده کرد، درست مثل دستور پختی که با هر اجاقی قابل اجراست.
- فلوچارتفلوچارت یا نمودار گردش کار، نمایش تصویری یک فرایند یا الگوریتم با شکلهای استاندارد است. هر شکل معنای مشخصی دارد و فلشها مسیر اجرا را نشان میدهند. کاربردش فراتر از برنامهنویسی است و در طراحی هر فرایندی به کار میآید.
- متغیرمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
برای درک کاملتر، اینها را هم بخوانید
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
- تابعتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.