Разделение интерфейса
Урок 25 из 28 курса Clean Code — пишите код лучше на Python на Coddy.
«Много специализированных под клиента интерфейсов лучше, чем один интерфейс общего назначения».
Интерфейс — это описание поведения, которое может выполнять объект.
Принцип разделения интерфейсов гласит, что интерфейс должен быть как можно меньше с точки зрения связности. Другими словами, он должен выполнять только ОДНУ задачу.
Давайте рассмотрим плохой пример и исправим его:
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, которые реализуют новые классы
Задачи:
- Создайте абстрактный класс
Walkable, содержащий только одну абстрактную функциюwalk(self) - Создайте абстрактный класс
Swimable, содержащий только одну абстрактную функциюswim(self)
Не изменяйте предоставленный код!
Обратите внимание, что теперь каждый интерфейс имеет только одну ответственность и следует принципу
Попробуйте сами
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")
Все уроки раздела Clean Code — пишите код лучше на Python
Потренируйтесь самостоятельно: Онлайн-компилятор Python