المبدأ المفتوح المغلق
الدرس 23 من 28 في دورة Clean Code - كتابة كود أفضل باستخدام Python على Coddy.
"يجب أن تكون الكيانات البرمجية مفتوحة للتوسيع، ولكن مغلقة للتعديل."
ينص المبدأ على أن أي دالة أو وحدة أو فئة يجب أن تسمح بتوسيع سلوكها دون تعديل الكود نفسه.
لنفترض أن لدينا فئة TxtConvertor تقوم بتحويل ملف txt إلى json أو xml،
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")هذا الهيكل ينتهك مبدأ المفتوح-المغلق (Open-Closed principle).
لماذا؟
على سبيل المثال، إذا أردنا إضافة دعم للتحويل من ملف txt إلى html، فسيتعين علينا تعديل الفئة الحالية (مما ينتهك مبدأ الإغلاق)
إذًا ماذا يجب أن نفعل؟
في هذا المثال، سيكون أحد الحلول هو إنشاء فئة مجردة (abstract class) ستحتوي على الدالة الرئيسية،
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.تدعم مكتبة
abcالفئات الأساسية المجردة (abstract base classes) للغة بايثون، يمكنك قراءة المزيد هنا
التحدي
متوسطمهمتك هي تعديل المثال المعطى لتطبيق مبدأ المفتوح-المغلق (Open-Closed principle)، وإضافة محول لدعم التحويل من txt إلى html.
- قم بإنشاء فئة مجردة
TxtConvertor - قم بإنشاء الفئات
TxtConvertorToJson، وTxtConvertorToXML، وTxtConvertorToHTMLالتي سترث منTxtConvertorوتقوم بتنفيذ المحولات (كما في المثال أعلاه)
جرّب بنفسك
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")