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

Потренируйтесь самостоятельно: Онлайн-компилятор Python