로컬함수와 확장

siwan·2021년 11월 12일
0

많은 개발자들이 좋은 코드의 중요한 특징중 하나가 중복이 없는것이라 믿는다.
하지만 자바코드를 이용할때에는 DRY(Don't Repeat YourSelf) 원칙을 피하기는 쉽지 않다.
코틀린에서 이걸 해결하는 방법은 함수를 함수 내부에 중첩 시킬 수 있다.

--- 유저 필드 검증을 체크하는 로직

class User(val id:Int, val name:String,val address :String)

fun saveUser(user:User){
    if (user.name.isEmpty()){
        throw IllegalArgumentException(
            "Can't save user ${user.id} : empty Name"
        )
    }
    if (user.address.isEmpty()){
        throw IllegalArgumentException(
            "Can't save user ${user.address} : empty Address"
        )
    }
}

saveUser(User(1,"",""))

>>java.lang.IllegalArgumentException: Can't save user 1 : empty Name

여기서는 코드중복이 그렇게 많지 않지만 추 후에 검증에 관련된 value 값들을 하나하나 넣으면 코드가 길어지게 된다. 다음은 로컬 함수를 이용해 유저 필드를 체크하는 로직을 만들어보자

--- 함수안에 로컬함수를 이용하여 유저필드를 체크하는 로직
class User(val id:Int, val name:String,val address :String)

fun saveUser(user: User) {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException(
                "Can't save user ${user.id} : $fieldName"
            )
        }
    }
    validate(user.name,"Name")
    validate(user.address,"Address")

}

saveUser(User(1,"zzz",""))
>>java.lang.IllegalArgumentException: Can't save user 1 : empty Address

위와 같이 함수안에 함수를 구현하여 체크를 하는 요소를 줄어들었다.
여기서 좀 더 검증로직을 하는 함수를 만들고 싶으면 확장 함수를 쓰면 된다.

--- 확장 함수를 이용한 유저필드를 체크하는 로직

fun User.validateBeforeSave(){
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException(
                "Can't save user $id : $fieldName"
            )
        }
    }
    validate(name,"Name")
    validate(address,"Address")
}

fun saveUser(user: User) {
    user.validateBeforeSave()
}

saveUser(User(1,"zzz",""))
>>java.lang.IllegalArgumentException: Can't save user 1 : empty Address

확장함수를 이용하면 위와 같이 id와 name, address를 객체 멤버 처럼 수신객체(this)를 지정하지 않아도 바로 쓸수가 있다.
함수안에 중첩으로 함수를 넣는게 가능하지만 나중에 코드가 읽기 어려워져 한단계만 중첩 시키는걸 권장한다.

profile
station3 다방 안드로이드 개발자

0개의 댓글