البرمجة الكائنية (Object-Oriented Programming - OOP)

البرمجة الكائنية (OOP) هي نموذج برمجي يعتمد على مفهوم الكائنات (Objects) كوحدات أساسية لبناء البرامج. بدلاً من كتابة تعليمات خطية متسلسلة (كما في البرمجة الإجرائية)، تُبنى البرامج في OOP من خلال كائنات تتفاعل مع بعضها، وكل كائن يحمل بياناته (الخصائص) ووظائفه (الدوال).

ظهرت OOP في ستينيات القرن العشرين مع لغة Simula، ثم تطورت مع Smalltalk في السبعينيات، وأصبحت شائعة عالميًا مع لغات مثل C++، Java، Python، C#، وRuby.


المبادئ الأساسية الأربعة للبرمجة الكائنية

OOP تقوم على أربع ركائز أساسية:

1. التغليف (Encapsulation)

  • يعني إخفاء التفاصيل الداخلية للكائن وتوفير واجهة عامة (Public Interface) للتعامل معه.
  • يتم ذلك باستخدام المتغيرات الخاصة (Private) والدوال العامة (Public Methods).

مثال (Python):

python
 
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # خاص
 
def deposit(self, amount):
if amount > 0:
self.__balance += amount
return True
return False
 
def get_balance(self):
return self.__balance
 
# الاستخدام
account = BankAccount("أحمد", 1000)
account.deposit(500)
print(account.get_balance()) # 1500
# print(account.__balance) # خطأ! لا يمكن الوصول مباشرة
 
 

الفائدة: حماية البيانات من التعديل العشوائي، وتسهيل الصيانة.


2. الوراثة (Inheritance)

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

مثال (Java):

java
 
class Animal {
void eat() {
System.out.println("هذا الحيوان يأكل");
}
}
 
class Dog extends Animal {
void bark() {
System.out.println("الكلب ينبح!");
}
}
 
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // موروثة من Animal
dog.bark();
}
}
 
 

أنواع الوراثة:

  • وراثة بسيطة (Single)
  • وراثة متعددة المستويات (Multi-level)
  • وراثة هرمية (Hierarchical)
  • ملاحظة: Java وC# لا تدعمان الوراثة المتعددة (Multiple Inheritance) مباشرة، لكن Python تدعمها.

3. تعدد الأشكال (Polymorphism)

  • يعني "أشكال متعددة"، أي أن نفس الدالة يمكن أن تعمل بطرق مختلفة حسب الكائن.
  • يتم عبر:
    • التحميل الزائد (Method Overloading): دوال بنفس الاسم لكن مع معطيات مختلفة (في نفس الفئة).
    • الكتابة فوق (Method Overriding): إعادة تعريف دالة في الفئة الفرعية.

مثال (Python - Overriding):

python
 
class Animal:
def speak(self):
print("صوت حيوان")
 
class Dog(Animal):
def speak(self): # كتابة فوق
print("woof!")
 
class Cat(Animal):
def speak(self):
print("meow!")
 
animals = [Dog(), Cat()]
for animal in animals:
animal.speak() # يعمل حسب نوع الكائن
 
 

الفائدة: مرونة عالية، وكتابة كود عام يعمل مع أنواع مختلفة.


4. التجريد (Abstraction)

  • إخفاء التفاصيل المعقدة وإظهار الوظائف الأساسية فقط.
  • يتم عبر:
    • الفئات المجردة (Abstract Classes)
    • الواجهات (Interfaces)

مثال (Java - Interface):

java
 
interface Shape {
double calculateArea(); // دالة مجردة
}
 
class Circle implements Shape {
double radius;
public Circle(double radius) { this.radius = radius; }
 
public double calculateArea() {
return Math.PI * radius * radius;
}
}
 
class Rectangle implements Shape {
double width, height;
public Rectangle(double w, double h) { width = w; height = h; }
 
public double calculateArea() {
return width * height;
}
}
 
 

يمكن استخدام Shape كمتغير عام:

java
 
Shape s1 = new Circle(5);
Shape s2 = new Rectangle(4, 6);
System.out.println(s1.calculateArea()); // 78.5...
 
 

المفاهيم المهمة الأخرى في OOP

 
 
المفهوم الوصف
الفئة (Class) قالب لإنشاء الكائنات
الكائن (Object) نسخة من الفئة تحمل بيانات ووظائف
المتغيرات (Attributes) خصائص الكائن (مثل: الاسم، العمر)
الدوال (Methods) سلوكيات الكائن
البناء (Constructor) دالة تُستدعى عند إنشاء الكائن
التدمير (Destructor) تُستدعى عند حذف الكائن (في C++، Python تستخدم Garbage Collector)
 

مميزات البرمجة الكائنية

  1. إعادة استخدام الكود (عبر الوراثة والمكتبات)
  2. سهولة الصيانة (تعديل في مكان واحد يؤثر على الكل)
  3. أمان البيانات (التغليف)
  4. مرونة عالية (تعدد الأشكال)
  5. تنظيم أفضل للمشاريع الكبيرة

عيوب البرمجة الكائنية

  1. تعقيد أكبر في البداية مقارنة بالبرمجة الإجرائية
  2. استهلاك ذاكرة أعلى
  3. صعوبة في التصميم الأولي (يحتاج تخطيط دقيق)
  4. أداء أبطأ قليلاً في بعض الحالات (بسبب الطبقات)

أمثلة عملية على OOP

نظام إدارة مكتبة

python
 
class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
self.available = True
 
def borrow(self):
if self.available:
self.available = False
return True
return False
 
def return_book(self):
self.available = True
 
class Library:
def __init__(self):
self.books = []
 
def add_book(self, book):
self.books.append(book)
 
def find_book(self, isbn):
for book in self.books:
if book.isbn == isbn:
return book
return None
 
 

لغات تدعم OOP

 
 
اللغة مستوى دعم OOP
Java كامل (كل شيء كائن)
Python كامل (متعدد النماذج)
C++ كامل (يدعم إجرائي + كائني)
C# كامل
Ruby كامل (كل شيء كائن)
JavaScript عبر النماذج الأولية (Prototype-based)
 

نصائح عند استخدام OOP

  1. لا تُفرط في الوراثة → استخدم التكوين (Composition) عند الحاجة.
  2. التزم بمبدأ المسؤولية الواحدة (Single Responsibility Principle).
  3. استخدم الأسماء الواضحة للفئات والدوال.
  4. فكر في الكائنات ككيانات حقيقية (مثل: سيارة، طالب، حساب بنكي).

الخلاصة

البرمجة الكائنية ليست مجرد "طريقة كتابة كود"، بل هي فلسفة تصميم تساعد على بناء أنظمة معقدة بطريقة منظمة، قابلة للتوسع، وسهلة الصيانة. إتقان OOP يفتح أبوابًا واسعة في تطوير البرمجيات الحديثة، من تطبيقات الهواتف إلى الأنظمة المؤسسية.

"البرمجة الكائنية لا تجعل البرمجة أسهل، بل تجعل الأخطاء أوضح وأقل تكلفة."


هل ترغب في:

  • مثال عملي كامل (مثل لعبة، أو نظام حجز)؟
  • شرح تصميم الأنماط (Design Patterns) مثل Singleton، Factory؟
  • مقارنة بين OOP وFunctional Programming؟

أخبرني وسأقدم لك ما تحتاجه!