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