3.6 让你的代码更整洁:局部函数和扩展

版权声明:本文为博主原创文章,转载请标注 https://blog.csdn.net/cai784921129/article/details/81541314

许多开发人员认为,好代码的重要标准之一就是减少重复代码,有时候要做到这一点就不容易了,在许多情况下,可以使用IDE的Exteract method(抽取方法)的重构方法把长的方法分解为更小的代码块,然后重用这些代码块。但是这样可能让代码更费解,因为你以一个包含许多小方法的类告终,而且它们之间并没有明确的关系。可以更近一步地将提取的函数组合成一个内部类,这样就可以保持解构,但是这种函数需要用到大量的样板代码。

Kotlin提供了一个简洁的方案来减少重复代码:可以在函数中嵌套函数。这样既可以获得所需的结构,也无需额外的语法开销。 

class User(val id: Int, val name: String, val address: String) fun saveUser(user: User) {

    //重复的字段检查 
    if (user.name.isEmpty()) { 
    throw IllegalArgumentException("name为空不能保存") 
    } if (user.address.isEmpty()) { 
    throw IllegalArgumentException("address为空不能保存") 
 } 
    //保存user到数据库 

 }

这里重复的代码是很少,你可能不想在类中一个面面俱到的方法中,去验证用户字段的每一种特殊情况。但是,如果将验证代码放到局部函数中,可以摆脱重复,并保持清晰的代码:

fun saveUser(user: User) { 

fun validate(user: User, value: String, fieldName: String) { 
if (value.isEmpty()) {
 throw IllegalArgumentException("用户$fieldName 为空不能保存") 
 }
} 
    validate(user, user.name, "Name")
    validate(user, user.address, "address") 
    //保存user到数据库 
}

这样不用重复验证逻辑,如果在项目演进时需要向User添加其他字段,也可以轻松添加更多验证。但是,把User对象传递给验证函数看起来还是有点难看。但是这完全不必要,因为局部函数可以访问所在函数中的所有参数和变量。可以利用这一点,去除冗余的User参数:

fun saveUser(user: User) { 

fun validate(value: String, fieldName: String) {
 if (value.isEmpty()) { 
    throw IllegalArgumentException("用户$fieldName 为空不能保存") 
 } 
} 
    validate(user.name, "Name") 
    validate(user.address, "address")
     //保存user 
}

还可以继续改进,把验证逻辑方法放到User类的扩展函数中

提取逻辑到扩展函数中

fun User.validateBeforeSave() {

 fun validate(value: String, fieldName: String) {
     if (value.isEmpty()) { 
    throw IllegalArgumentException("用户$fieldName 为空不能保存") 
    } 
} 
    validate(name, "Name") 
    validate(address, "address") 
} 
...
fun saveUser(user: User) {
 user.validateBeforeSave()
 //保存user 
}

《参考Kotlin实战》

扫描二维码关注公众号,回复: 3514246 查看本文章

猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/81541314
3.6