Menu
CoddyTech

Phân tách giao diện

Bài học 25 trên 28 trong khóa học Clean Code: viết code tốt hơn với Python của Coddy.

"Nhiều giao diện dành riêng cho từng ứng dụng sẽ tốt hơn một giao diện đa năng."

Giao diện mô tả những hành vi mà một đối tượng có thể thực hiện.

Nguyên tắc phân tách giao diện (interface segregation) nêu rằng giao diện nên có phạm vi gắn kết nhỏ nhất có thể. Nói cách khác, giao diện chỉ nên làm MỘT việc.

Hãy xem một ví dụ chưa tốt rồi cùng sửa nhé,

from abc import ABC, abstractmethod


class Animal(ABC):
	@abstractmethod
	def walk(self):
		pass

	@abstractmethod
	def swim(self):
		pass

Giao diện này có nhiều trách nhiệm!

Và chúng ta sẽ gặp vấn đề khi triển khai giao diện này,

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!")

Như bạn thấy, giao diện này không phù hợp với những loài vật không thể vừa đi bộ vừa bơi!

challenge icon

Thử thách

Dễ

Hãy sửa ví dụ trên bằng cách triển khai các lớp Walkable và Swimable. Bạn đã được cung cấp các lớp Frog và Giraffe, những lớp triển khai các lớp mới.

Nhiệm vụ:

  • Tạo lớp trừu tượng Walkable chỉ có một hàm trừu tượng là walk(self)
  • Tạo lớp trừu tượng Swimable chỉ có một hàm trừu tượng là swim(self)

Đừng thay đổi code đã cho!

Lưu ý rằng giờ đây mỗi giao diện chỉ có một trách nhiệm và tuân theo nguyên tắc 

Tự làm thử

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")
			

Tất cả bài học trong Clean Code: viết code tốt hơn với Python

Tự luyện tập: Trình biên dịch Python online