البرمجة الكائنية (OOP) عمليًا: الأصناف، الوراثة، والتغليف

 

البرمجة الكائنية (OOP) عمليًا: الأصناف، الوراثة، والتغليف

 

Programming الكائنية (Object-Oriented Programming – OOP) هي أحد أهم الأساليب الحديثة في تطوير البرمجيات.
تُستخدم في لغات مثل Python وJava وC++ وC#، وتُعتبر حجر الأساس لبناء أنظمة معقدة ومنظمة وسهلة الصيانة.

في هذا المقال، سنأخذك إلى تطبيق عملي شامل لمفاهيم OOP، وسنتعرف على:

  • ما هي البرمجة الكائنية ولماذا تُستخدم؟
  • كيفية إنشاء الأصناف (Classes) والكائنات (Objects).
  • مفهوم الوراثة (Inheritance) لإعادة استخدام الكود.
  • مفهوم التغليف (Encapsulation) لحماية البيانات.
  • أمثلة عملية بلغة بايثون مع شرح مفصل لكل خطوة.

🧩 أولًا: ما هي البرمجة الكائنية (OOP)؟

البرمجة الكائنية تعتمد على تمثيل العناصر في البرنامج ككائنات (Objects) تحتوي على بيانات وسلوك.
كل كائن ينتمي إلى صنف (Class) يحدد خصائصه ووظائفه.

🎯 الفكرة ببساطة:
بدل أن تكتب كودًا ضخمًا ومعقدًا، تقسمه إلى “كائنات” مستقلة — مثل “سيارة”، “مستخدم”، “منتج”، وهكذا.


🧱 ثانيًا: مفهوم الصنف (Class) والكائن (Object)

🔹 الصنف (Class)

هو القالب (Blueprint) الذي نُنشئ منه الكائنات.
يُعرّف الخصائص (Attributes) والدوال (Methods).

🔹 الكائن (Object)

هو نسخة حقيقية من الصنف تحتوي على بيانات فعلية.

🧠 مثال بلغة Python:

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model

    def start(self):
        print(f"{self.brand} {self.model} بدأت التشغيل 🚗")

# إنشاء كائنات من الصنف
car1 = Car("Toyota", "Corolla")
car2 = Car("BMW", "X5")

car1.start()
car2.start()

🟢 النتيجة:

Toyota Corolla بدأت التشغيل 🚗
BMW X5 بدأت التشغيل 🚗

🔸 __init__: دالة تُسمى البنّاء (Constructor) تُستخدم لتهيئة الكائن عند إنشائه.
🔸 self: تشير إلى الكائن نفسه (مثل “أنا” في الجملة).


🧬 ثالثًا: الوراثة (Inheritance)

الوراثة تسمح لك بإنشاء صنف جديد يعتمد على صنف موجود مسبقًا، بحيث يرث خصائصه ووظائفه.
هذا يوفر الوقت ويُقلل تكرار الكود.

🧠 مثال عملي:

class Vehicle:
    def __init__(self, brand):
        self.brand = brand

    def drive(self):
        print(f"{self.brand} تتحرك للأمام 🚙")

# صنف جديد يرث من Vehicle
class Car(Vehicle):
    def __init__(self, brand, model):
        super().__init__(brand)
        self.model = model

    def info(self):
        print(f"السيارة: {self.brand} {self.model}")

# كائن من الصنف الفرعي
car = Car("Tesla", "Model S")
car.drive()
car.info()

🟢 النتيجة:

Tesla تتحرك للأمام 🚙  
السيارة: Tesla Model S

🔹 الكلمة المفتاحية super() تُستخدم لاستدعاء دوال الصنف الأب.
🔹 الوراثة تُساعد في بناء “سلاسل” من الأصناف بحيث تتشارك الخصائص والوظائف.


🔒 رابعًا: التغليف (Encapsulation)

التغليف هو حماية بيانات الكائن من الوصول أو التعديل المباشر من خارج الصنف.
يتم ذلك عبر جعل الخصائص “خاصة” واستخدام “دوال تحكم”.

🧠 مثال:

class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # خاص (Private)

    def deposit(self, amount):
        self.__balance += amount
        print(f"تم إيداع {amount} ريال. الرصيد الجديد: {self.__balance}")

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount
            print(f"تم سحب {amount} ريال. الرصيد المتبقي: {self.__balance}")
        else:
            print("رصيد غير كافٍ ❌")

# تجربة الصنف
acc = BankAccount("أحمد", 1000)
acc.deposit(500)
acc.withdraw(200)
acc.withdraw(2000)

🟢 النتيجة:

تم إيداع 500 ريال. الرصيد الجديد: 1500  
تم سحب 200 ريال. الرصيد المتبقي: 1300  
رصيد غير كافٍ ❌

🔸 الخاصية __balance لا يمكن الوصول إليها من خارج الصنف مباشرة.
🔸 هذه الميزة تمنع التلاعب غير المقصود في البيانات الحساسة.


🧠 خامسًا: التعدد الشكلي (Polymorphism) – لمحة سريعة

رغم أننا سنفصل في مقال لاحق، من المفيد الإشارة إلى مفهوم التعدد الشكلي.
وهو يعني أن نفس الدالة يمكن أن تعمل بشكل مختلف بحسب الصنف الذي تستخدمه.

مثال مبسط:

class Animal:
    def sound(self):
        print("صوت الحيوان")

class Dog(Animal):
    def sound(self):
        print("الكلب ينبح 🐶")

class Cat(Animal):
    def sound(self):
        print("القط يموء 🐱")

animals = [Dog(), Cat()]
for a in animals:
    a.sound()

🟢 النتيجة:

الكلب ينبح 🐶  
القط يموء 🐱

⚙️ سادسًا: لماذا OOP مهمة؟

الميزة الوصف
🧩 التنظيم تقسم المشروع إلى وحدات مستقلة يمكن العمل عليها بسهولة.
🔁 إعادة الاستخدام الوراثة تُقلل من تكرار الكود.
🔒 الأمان التغليف يحمي البيانات الحساسة.
⚙️ التوسعية يسهل إضافة ميزات جديدة دون كسر الكود القديم.
🧠 الفهم الكود يصبح أقرب للواقع (أشخاص، سيارات، منتجات…).

💡 سابعًا: تطبيق عملي متكامل — إدارة متجر بسيط

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return f"{self.name} - {self.price} ريال"

class Electronic(Product):
    def __init__(self, name, price, warranty):
        super().__init__(name, price)
        self.warranty = warranty

    def info(self):
        return f"{self.name} - {self.price} ريال (ضمان {self.warranty} سنة)"

# الاستخدام
p1 = Product("كتاب برمجة", 50)
p2 = Electronic("حاسوب محمول", 4000, 2)

print(p1.info())
print(p2.info())

🟢 النتيجة:

كتاب برمجة - 50 ريال  
حاسوب محمول - 4000 ريال (ضمان 2 سنة)

🔗 روابط خارجية موثوقة


🏁 الخلاصة

البرمجة الكائنية ليست مجرد “أسلوب”، بل طريقة تفكير في تصميم البرامج.
بمجرد أن تتقن مفاهيم الأصناف، الوراثة، والتغليف، ستتمكن من كتابة كود أكثر احترافية وتنظيمًا.

تذكر دائمًا:

“البرمجة الجيدة هي التي تجعل التعقيد يبدو بسيطًا.” 💡

 

Leave a Reply

Your email address will not be published. Required fields are marked *

Back To Top Img
error: المحتوى محمي !! صقر ويب
Download profile