Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استبدال ليسكوف

الدرس 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!

challenge icon

التحدي

متوسط

قم بإصلاح الكود المعطى لتطبيق مبدأ 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)

جميع دروس Clean Code - كتابة كود أفضل باستخدام Python