- 한 클래스는 자신이 사용하는 인터페이스만 구현해야한다.
- 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야한다.
다음과 같이 LocalDatabase와 RemoteDatabase를 추상화하는 DB 인터페이스가 있다고 가정하자.
해당 인터페이스에는 crud와 LocalDatabase에서만 사용할 isSameDataList, RemoteDatabase에서 사용하는 getFirstData 함수를 포함한다.
이 경우, LocalDatabase와 RemoteDatabase는 자신이 사용하지 않는 메소드들도 오버라이딩을 하게된다.
이를 각각의 기능에 맞게 인터페이스를 분리해서 사용하게 하는 것이 인터페이스 분리 원칙이다.
interface DB {
fun create()
fun read(data: String)
fun upload(data:String)
fun delete(data: String)
fun getFirstData(data: String)
fun isSameDataList(list: List<String>)
}
class LocalDatabase : DB{
... (crud)
override fun getFirstData(data: String) {
// not use
}
override fun isSameDataList(list: List<String>) {
...
}
}
class RemoteDatabase : DB{
... (crud)
override fun getFirstData(data: String) {
...
}
override fun isSameDataList(list: List<String>) {
// not use
}
}
LocalDB, RemoteDB 인터페이스에서 각자 사용할 함수를 정의하여 사용할 Database의 종류의 맞게 인터페이스를 구현하여 사용하게 된다.
interface DB {
fun create()
fun read(data: String)
fun upload(data:String)
fun delete(data: String)
}
interface LocalDB {
fun isSameDataList(list: List<String>)
}
interface RemoteDB {
fun getFirstData(data: String)
}
class LocalDatabase : DB, LocalDB{
... (crud)
override fun isSameDataList(list: List<String>) {
...
}
}
class RemoteDatabase : DB, RemoteDB{
... (crud)
override fun getFirstData(data: String) {
...
}
}