جاري التحميل...

الديكورات

الديكورات هي واحدة من أكثر الميزات قوة ومرونة في البرمجة بلغة بايثون، وتسمح بتوسيع أو تعديل سلوك الدوال والفئات دون تغيير الكود الأصلي لها. تعتبر الديكورات أداة أساسية في تطوير البرمجيات الحديثة لأنها توفر طريقة نظيفة ومنظمة لإضافة وظائف إضافية، مثل تسجيل الدخول، التحقق من الصلاحيات، أو تحسين الأداء، بشكل متكرر وفعال. في هندسة البرمجيات وهندسة النظام، تُستخدم الديكورات لتحسين إعادة الاستخدام، تقليل التكرار، وتحقيق تصميم نظيف يعتمد على المبادئ الأساسية للبرمجة الكائنية التوجه.
من حيث المفاهيم الأساسية، تتعامل الديكورات مع بناء الجملة (syntax) بطريقة تسمح بتمرير الدوال كوسيطات، وهي تعتمد على الفهم المتقدم للهياكل البيانية (data structures) والخوارزميات (algorithms). كما أنها متوافقة مع مبادئ OOP، حيث يمكن استخدامها لتعديل أو توسيع سلوك الكائنات والفئات. عند إتقان الديكورات، سيتمكن المطورون من كتابة كود أكثر مرونة، قابل للصيانة، وفعال من حيث الأداء، مع تقليل الأخطاء الشائعة مثل التسريبات الذاكرية أو التعامل غير الصحيح مع الاستثناءات.
من خلال هذا الدرس، ستتعلم كيفية إنشاء ديكورات أساسية ومتقدمة، دمجها مع الخوارزميات، واتباع أفضل الممارسات في تطوير البرمجيات والنظم المعقدة، مع التركيز على الأمثلة العملية القابلة للتطبيق الفوري.

مثال أساسي

python
PYTHON Code
def logger(func):
def wrapper(*args, **kwargs):
print(f"تم استدعاء الدالة {func.name} مع الوسائط: {args} و {kwargs}")
result = func(*args, **kwargs)
print(f"قيمة الإرجاع: {result}")
return result
return wrapper

@logger
def جمع_عددين(a, b):
return a + b

ناتج = جمع_عددين(5, 7)

في هذا المثال، قمنا بإنشاء ديكور بسيط باسم logger يقوم بتسجيل الاستدعاءات إلى أي دالة مزينة به. يبدأ التنفيذ بتعريف الديكور الذي يأخذ دالة كوسيط func، ثم ينشئ دالة داخلية wrapper للتعامل مع أي عدد من الوسائط (args, kwargs). تقوم wrapper بتنفيذ الكود قبل وبعد استدعاء الدالة الأصلية، مما يسمح بإضافة وظائف إضافية دون تعديل الدالة الأساسية.
بعد ذلك، استخدمنا الديكور @logger فوق الدالة جمع_عددين، مما يجعل أي استدعاء لهذه الدالة يمر عبر wrapper تلقائيًا. هذا يوضح كيفية استخدام الديكورات لتوسيع السلوكيات، وهو مفيد جدًا في تسجيل الدخول، تتبع الأداء، أو إدارة الأخطاء بطريقة منظمة. استخدام
args و **kwargs يعزز المرونة، ويمنع الأخطاء المتعلقة بعدد الوسائط. كما أن الطريقة الموضحة تتجنب مشاكل التسريبات الذاكرية لأنها لا تحتفظ بالموارد بعد انتهاء التنفيذ.

مثال عملي

python
PYTHON Code
def التحقق_من_الصلاحيات(role_required):
def decorator(func):
def wrapper(user, *args, **kwargs):
if getattr(user, 'role', None) != role_required:
raise PermissionError(f"المستخدم لا يملك صلاحيات {role_required}")
return func(user, *args, **kwargs)
return wrapper
return decorator

class مستخدم:
def init(self, name, role):
self.name = name
self.role = role

@التحقق_من_الصلاحيات("admin")
def حذف_حساب(user, account_id):
print(f"تم حذف الحساب {account_id} بواسطة {user.name}")

مدير = مستخدم("أحمد", "admin")
حذف_حساب(مدير, 123)

في المثال المتقدم، قمنا بإنشاء ديكور للتحقق من صلاحيات المستخدم قبل تنفيذ أي دالة حرجة. يقوم الديكور التفاعلي بأخذ الوسيط role_required، ويعيد ديكورًا داخليًا يتأكد من أن المستخدم لديه الصلاحيات المطلوبة قبل استدعاء الدالة الأصلية. هذا يوضح كيفية استخدام الديكورات لفرض السياسات الأمنية والقيود على مستوى النظام، وهو مهم جدًا في تطبيقات الويب وخدمات الخلفية التي تحتاج إدارة أدوار متعددة.
تمثّل الفئات هنا نمطًا كائني التوجه OOP، حيث نتحقق من خاصية role لكل كائن مستخدم. استخدام الديكورات بهذه الطريقة يقلل من تكرار الكود، ويحافظ على بنية واضحة وسهلة الصيانة، مع تقليل الأخطاء مثل التعامل مع المستخدمين غير المخولين. كما أن تصميم wrapper يحمي الموارد ويعزز الأداء باستخدام أساليب بسيطة لتجنب الحلقات غير الضرورية أو استدعاءات غير آمنة.

أفضل الممارسات تتضمن التأكد من أن الديكورات لا تغير توقيع الدالة الأساسية، واستخدام functools.wraps للحفاظ على معلومات الدالة الأصلية. يجب الحرص على إدارة الموارد بشكل صحيح لتجنب التسريبات الذاكرية، ومعالجة الاستثناءات بطريقة واضحة لمنع توقف النظام عن العمل. من الأخطاء الشائعة استخدام ديكورات معقدة جدًا تؤدي إلى صعوبة في الصيانة أو تنفيذ الخوارزميات بشكل غير فعال.
عند تصحيح الأخطاء، يفضل اختبار كل ديكور بشكل منفصل باستخدام بيانات تجريبية، ومراقبة الأداء عند تطبيقه على دوال متعددة. لتحسين الأداء، يمكن تقليل العمليات غير الضرورية داخل wrapper، وتجنب التحقق المتكرر من الوسائط. بالنسبة للأمان، يجب التأكد من أن أي ديكور يتعامل مع المستخدمين أو الصلاحيات يحتوي على معالجة دقيقة للمدخلات لتجنب ثغرات الحقن أو تجاوز الصلاحيات.

📊 جدول مرجعي

Element/Concept Description Usage Example
logger ديكور لتسجيل استدعاءات الدوال @logger فوق أي دالة لتسجيل الاستدعاءات
wrapper الدالة الداخلية في الديكور تعالج الوسائط وتضيف سلوك قبل وبعد الدالة الأصلية
التحقق_من_الصلاحيات ديكور للتحكم في الوصول حسب الصلاحيات @التحقق_من_الصلاحيات("admin") فوق دوال حساسة
functools.wraps يحافظ على خصائص الدالة الأصلية @wraps(func) داخل wrapper

خلاصة الدرس توضح أن الديكورات أداة قوية لتوسيع وظائف الدوال والفئات بشكل نظيف وفعال، مع تطبيقها على سيناريوهات حقيقية مثل التحقق من الصلاحيات أو تسجيل الأداء. إتقان هذه التقنية يساعد على بناء نظم برمجية قوية، قابلة للصيانة، ومرنة في التعامل مع المتطلبات المتغيرة. يوصى بعد ذلك بدراسة مفاهيم متقدمة مثل ديكورات الفئات، الديكورات المتداخلة، وتصميم أنماط المراقبة (Observer patterns) باستخدام الديكورات. من المهم أيضًا تجربة الأمثلة العملية وتطبيقها على مشاريع صغيرة قبل الانتقال إلى نظم أكبر، مع متابعة مصادر تعلم متقدمة مثل مستندات بايثون الرسمية والكتب المتخصصة في تصميم البرمجيات.

🧠 اختبر معرفتك

جاهز للبدء

اختبر معرفتك

اختبر فهمك لهذا الموضوع بأسئلة عملية.

4
الأسئلة
🎯
70%
للنجاح
♾️
الوقت
🔄
المحاولات

📝 التعليمات

  • اقرأ كل سؤال بعناية
  • اختر أفضل إجابة لكل سؤال
  • يمكنك إعادة الاختبار عدة مرات كما تريد
  • سيتم عرض تقدمك في الأعلى