- 하나의 클래스는 하나의 책임(역할)만 가진다.
- 지키지 않으면 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있음
낮은 결합도, 높은 응집도를 얻기 위해 사용
CRUD기능이 있는 Database 클래스에서 다음과 같이 remote와 local에 따라 getFirstData, isSameDataList를 사용하고 isExistData를 서로 공유해서 사용한다고 가정하자.
만약 getFirstData의 작동방식을 바꾸기 위해 isExistData를 변경하게 되면 getFirstData의 함수뿐만 아니라 isSameDataList를 영향을 끼치게된다. 이러한 상황이 단일 책임 원칙을 위배하는 것이다.
class Database {
lateinit var name: String
var dataList = mutableListOf<String>()
fun create() {
var newData = "newData"
dataList.add(newData)
}
fun read(data: String): String? {
return dataList.find { it == data }
}
fun upload(data: String) {
dataList.add(data)
}
fun delete(data: String) {
dataList.remove(data)
}
fun isExistData(data: String): Boolean {
return dataList.find { it == data }.isNullOrBlank()
}
fun getFirstData(data: String): String{
if(isExistData(data)){
return dataList.first { it == data }
}
return "not Exist"
}
fun isSameDataList(list: List<String>): Boolean {
list.forEach { data ->
if(!isExistData(data)){
return false
}
}
return true
}
}
fun main(args: Array<String>) {
val localDatabase = Database()
val remoteDatabase = Database()
remoteDatabase.isExistData("init")
localDatabase.isSameDataList(listOf())
}
이를 LocalDatabase, RemoteDatabase 클래스를 만들고 Databse 클래스를 상속한 뒤 해당 클래스에서 사용할 기능을 정의하는 방식으로 바꾼다.
이렇게 바꾸면 Database 클래스는 CRUD 기능을 담당, LocalDatabase와 RemoteDatabase는 각자 사용하는 함수를 담당하게 되어 단일 책임을 가지게 된다.
이렇게 되면 getFirstData의 작동방식을 바꾸기 위해서 isExistData를 변경해도 LocalDatabase나 다른 클래스에는 영향을 끼치지 않게 된다.
open class Database {
lateinit var name: String
var dataList = mutableListOf<String>()
fun create() {
var newData = "newData"
dataList.add(newData)
}
fun read(data: String): String? {
return dataList.find { it == data }
}
fun upload(data: String) {
dataList.add(data)
}
fun delete(data: String) {
dataList.remove(data)
}
}
class LocalDatabase : Database(){
fun isSameDataList(list: List<String>): Boolean {
list.forEach { data ->
if(!isExistData(data)){
return false
}
}
return true
}
fun isExistData(data: String): Boolean {
return dataList.find { it == data }.isNullOrBlank()
}
}
class RemoteDatabase: Database() {
fun getFirstData(data: String): String{
if(isExistData(data)){
return dataList.first { it == data }
}
return "not Exist"
}
fun isExistData(data: String): Boolean {
return dataList.find { it == data }.isNullOrBlank()
}
}
fun main(args: Array<String>) {
val localDatabase = LocalDatabase()
val remoteDatabase = RemoteDatabase()
remoteDatabase.getFirstData("init")
localDatabase.isSameDataList(listOf())
}