انتزاع (Abstraction) در OOP: پنهان کردن پیچیدگی
شما با چند اقدام ساده رانندگی میکنید. پدال گاز را فشار میدهید. فرمان را میچرخانید. ترمز میگیرید.
نیازی ندارید بدانید سوخت چگونه وارد موتور میشود. نیازی نیست بدانید پیستونها چگونه حرکت میکنند یا دندهها چگونه تغییر میکنند. خودرو این جزئیات را از شما پنهان میکند. شما از یک رابط (interface) ساده برای کنترل یک ماشین پیچیده استفاده میکنید.
نرمافزار نیز به همین صورت عمل میکند.
ارسال ایمیل را در نظر بگیرید. شما فقط یک دستور را فراخوانی میکنید: emailService.send().
در پشت صحنه، اتفاقات زیادی میافتد:
- سیستم آدرس را اعتبارسنجی میکند.
- یک اتصال SMTP ایجاد میکند.
- با یک ارائهدهنده احراز هویت میکند.
- پیام را میسازد.
- در صورت شکست اولین تلاش، عملیات تلاش مجدد را مدیریت میکند.
نیازی نیست این مراحل را ببینید. شما فقط میخواهید که ایمیل ارسال شود.
اگر از انتزاع استفاده نمیکردید، کد شما اینگونه به نظر میرسید:
connect()authenticate()buildMessage()sendMessage()disconnect()
انجام این کار در هر بار، مشکلاتی ایجاد میکند. هر بخش از کد شما بیش از حد میداند. اگر ارائهدهنده ایمیل خود را تغییر دهید، باید تکتک خطوط کدی را که ایمیل ارسال میکنند، بهروزرسانی کنید. تغییر دادن سیستم شما دشوار میشود.
انتزاع این مشکل را حل میکند. این مفهوم نشان میدهد که یک شیء چه کاری انجام میدهد، اما نحوه انجام آن را پنهان میکند.
شما یک رابط ساده را ارائه میدهید. فراخواننده (caller) بر روی وظیفه خود تمرکز میماند. پیادهسازی (implementation) پنهان میماند. این کار باعث میشود کد شما از هم جدا (decoupled) و نگهداری آن آسان باشد.
مردم اغلب انتزاع (Abstraction) را با کپسولهسازی (Encapsulation) اشتباه میگیرند.
کپسولهسازی میپرسد: چه کسی میتواند این داده را تغییر دهد؟ این مفهوم از وضعیت داخلی محافظت میکند. انتزاع میپرسد: کاربر به دیدن چه جزئیاتی نیاز دارد؟ این مفهوم پیچیدگی را پنهان میکند.
آنها برای ساخت سیستمهای بهتر در کنار هم کار میکنند.
در مرحله بعد، به وراثت (Inheritance) نگاهی خواهیم انداخت. ما به یک سوال پاسخ خواهیم داد: اگر اشیاء رفتار مشترکی دارند، آیا نیاز است همان کد را دو بار بنویسید؟