استبدال ليسكوف
الدرس 24 من 28 في دورة Clean Code - كتابة كود أفضل باستخدام Python على Coddy.
"يجب أن تكون الدوال التي تستخدم مؤشرات أو مراجع للفئات الأساسية قادرة على استخدام كائنات من الفئات المشتقة دون معرفة ذلك."
ينص هذا المبدأ على أن الفئة الفرعية (child class) يجب أن تكون قابلة للاستبدال من فئتها الأصلية (parent class).
على سبيل المثال،
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')كما ترى، فإن كلاً من SMS و Email يرثان من Notification، ولكن أحدهما يرسل إلى email والآخر إلى phone، لذا فإن فئة SMS ليست قابلة للاستبدال من فئتها الأصلية Notification!
التحدي
متوسطقم بإصلاح الكود المعطى لتطبيق مبدأ Liskov substitution -
- يجب أن تأخذ الدالة notify الوسيط message فقط.
- يجب أن يمتلك كل من Email و SMS منشئًا (constructor) يقوم بتهيئة email و phone على التوالي.
- قم بتعديل الكود لتطبيق التغييرات
هذا مجرد حل واحد مقترح لتطبيق مبدأ Liskov، وهناك حلول أخرى ستعمل أيضًا!
جرّب بنفسك
from abc import ABC, abstractmethod
class Notification(ABC):
@abstractmethod
def notify(self, message, email):
pass
class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')
class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}')
if __name__ == '__main__':
email = input()
phone = input()
message = input()
notification1 = Email()
notification2 = SMS()
notification1.notify(message, email)
notification2.notify(message, phone)