Разделение интерфейса
Урок 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")