클라이언트들은 자신이 사용하지 않는 메서드에 의존하도록 강요되어서는 안된다
인터페이스를 잘게 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것이다
클래스 상속은 하나의 부모 클래스만 가질 수 있도록 하지만 동시에 구현할 수 있는 인터페이스(프로토콜) 의 수를 제한하지는 않는다
따라서 서로 관련 없는 많은 메서드들을 하나의 인터페이스에 집어넣을 필요가 없으며 이를 더 정제된 인터페이스로 나눠야한다
필요하다면 그 전부를 단일 클래스에서 구현할 수 있다
protocol Gesture {
func didTap()
func didSwipe()
func didScroll()
}
class Button: Gesture {
func didTap() {
// tap Gesture logic
}
func didSwipe() {
// not used
}
func didScroll() {
// not used
}
}
하나의 인터페이스(프로토콜)에 Gesture 관련 모든 메서드들이 들어있다
따라서 해당 인터페이스를 구현하는 구상클래스에서 해당 메서드가 필요하지 않더라 하더라도 구현을 해줘야 한다
protocol TapGesture {
func didTap()
}
protocol SwipeGesture {
func didSwipe()
}
protocol ScrollGesture {
func didScroll()
}
class Button: TapGesture {
func didTap() {
// tap Gesture logic
}
}
각각의 Gesture를 분리하고 사용하는 기능을 가지고 있는 프로토콜만 채택하여 구현해주었다
이로인해 원하는 기능만 구현이 가능해졌다
만약 새로운 gesture 가 필요하다면 해당 프로토콜을 채택하여 구현해주면 될것이다
한번 인터페이스를 분리하여 구성해놓았다면 더이상 분리해서는 안된다
이미 구현되어 있는 프로젝트에 또 인터페이스를 분리한다면 이미 해당 인터페이스를 구현하고 있는 클래스 및 클라이언트에 문제가 생길 수 있다
또한 인터페이스가 너무 많아진다면 코드는 더욱 복잡해진다는 사실을 잊지 말고 균형을 유지해야한다