Menu
Coddy logo textTech

Разделение интерфейса

Урок 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!")

Как видите, этот интерфейс несовместим с животными, которые не умеют одновременно ходить и плавать!

challenge icon

Задание

Легко

Давайте исправим приведенный выше пример, реализовав классы 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