فصل الواجهات
الدرس 25 من 28 في دورة Clean Code - كتابة كود أفضل باستخدام Python على Coddy.
"العديد من الواجهات المخصصة للعملاء أفضل من واجهة واحدة عامة الأغراض."
الواجهة (Interface) هي وصف للسلوكيات التي يمكن للكائن القيام بها.
ينص مبدأ فصل الواجهات (Interface segregation) على أن الواجهة يجب أن تكون صغيرة قدر الإمكان من حيث التماسك. بمعنى آخر، يجب أن تفعل شيئًا واحدًا فقط.
دعونا نرى مثالاً سيئاً وسنقوم بإصلاحه،
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
passهذه واجهة ذات مسؤوليات متعددة!
وسنواجه مشكلة عند تنفيذ ذلك،
class Frog(Animal):
def walk(self):
print("Walking")
def swim(self):
print("Swimming")
class Giraffe(Animal):
def walk(self):
print("Walking")
def swim(self):
raise Exception("Girrafe cannot swim!")كما ترى، هذه الواجهة غير متوافقة مع الحيوانات التي لا تستطيع المشي والسباحة معاً!
التحدي
سهلدعنا نصلح المثال السابق من خلال تنفيذ فئتي Walkable و Swimable، حيث يتم تزويدك بفئتي Frog و Giraffe اللتين تقومان بتنفيذ الفئات الجديدة
المهام:
- قم بإنشاء فئة مجردة (abstract class) باسم
Walkableتحتوي على دالة مجردة واحدة فقط هيwalk(self) - قم بإنشاء فئة مجردة (abstract class) باسم
Swimableتحتوي على دالة مجردة واحدة فقط هيswim(self)
لا تقم بتغيير الكود المعطى!
لاحظ أن كل واجهة (interface) الآن لديها مسؤولية واحدة فقط وتتبع المبدأ
جرّب بنفسك
from abc import ABC, abstractmethod
# Enter you code here
class Frog(Walkable, Swimable):
def walk(self):
print("Walking")
def swim(self):
print("Swimming")
class Giraffe(Walkable):
def walk(self):
print("Walking")
if __name__ == "__main__":
animal_type = input()
if animal_type == "frog":
animal = Frog()
animal.walk()
animal.swim()
elif animal_type == "giraffe":
animal = Giraffe()
animal.walk()
print("not Swimming")