版权声明:本文为博主原创文章,转载请标注 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实战》