החלפת ליסקוב
שיעור 24 מתוך 28 בקורס קוד נקי – כתיבת קוד טוב יותר באמצעות Python של Coddy.
"פונקציות שמשתמשות במצביעים או בהפניות למחלקות בסיס חייבות להיות מסוגלות להשתמש באובייקטים של מחלקות נגזרות מבלי לדעת זאת."
עיקרון זה קובע שמחלקת בן חייבת להיות ניתנת להחלפה במחלקת האב שלה.
לדוגמה,
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!
אתגר
בינוניתקן את הקוד הנתון כדי ליישם את עקרון ההחלפה של ליסקוב -
- הפונקציה notify צריכה לקבל רק את message כארגומנט.
- לכל אחת מהמחלקות Email ו-SMS צריך להיות בנאי שיאתחל את email ואת phone, בהתאמה.
- ערוך את הקוד כדי להחיל את השינויים
זהו רק פתרון מוצע אחד ליישום עקרון ליסקוב; ישנם פתרונות נוספים שיעבדו!
נסו בעצמכם
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)
כל השיעורים ביחידה קוד נקי – כתיבת קוד טוב יותר באמצעות Python
תרגלו בעצמכם: קומפיילר Python אונליין