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