التجريد في البرمجة كائنية التوجه (OOP): إخفاء التعقيد
أنت تقود السيارة بالضغط على الدواسات وتدوير المقود. لست بحاجة لفهم كيفية حقن الوقود أو حركة المكبس؛ فالسيارة تخفي هذه التفاصيل عنك، وما عليك سوى استخدام واجهة بسيطة.
البرمجيات تعمل بنفس الطريقة.
فكر في إرسال بريد إلكتروني. من المرجح أن يبدو الكود الخاص بك هكذا:
emailService.send(email);
يبدو الأمر بسيطاً. ولكن خلف الكواليس، يقوم النظام بالعديد من المهام:
- التحقق من صحة العنوان.
- الاتصال بخادم SMTP.
- التحقق من هوية المستخدم.
- بناء الرسالة.
- معالجة محاولات إعادة الإرسال.
- تسجيل الأخطاء.
لست بحاجة لرؤية هذه الخطوات، فكل ما يهمك هو إرسال البريد الإلكتروني.
إذا قمت بكشف كل خطوة، فستتسبب في حدوث مشاكل. تخيل لو كان على كل مطور استدعاء الدوال التالية يدوياً:
connect()authenticate()buildMessage()sendMessage()disconnect()
هذا يجعل الكود الخاص بك هشاً. فإذا قمت بتغيير مزود خدمة البريد الإلكتروني، سيتعين عليك تحديث كل مكان في تطبيقك، مما يجعل الكود مرتبطاً ارتباطاً وثيقاً (tightly coupled) بالتنفيذ.
التجريد يحل هذه المشكلة.
التجريد يكشف عما يفعله الكائن، ويخفي كيفية قيامه بذلك. أنت تظهر للمستخدم فقط ما يحتاج إليه.
يتفاعل المستخدم مع واجهة مستقرة، ولا يهمه منطق التحقق من الهوية أو استراتيجية إعادة المحاولة؛ فتبقى تلك التفاصيل مخفية.
يخلط الكثيرون بين التجريد (Abstraction) والكبسلة (Encapsulation). إليك الفرق:
الكبسلة (Encapsulation) تسأل: من يمكنه تغيير حالة هذا الكائن؟ فهي تحمي البيانات.
التجريد (Abstraction) يسأل: ما هي التفاصيل التي يجب أن يراها المستخدم؟ فهو يخفي التعقيد.
يعمل الاثنان معاً لبناء أنظمة أفضل.
في المرة القادمة، سنناقش الوراثة (Inheritance). سنرى كيفية التعامل مع السلوك المشترك دون كتابة الكود نفسه مرتين.