美文网首页Android开发Kotlin
Kotlin3.6局部函数和扩展

Kotlin3.6局部函数和扩展

作者: 无心下棋 | 来源:发表于2018-05-29 22:13 被阅读11次

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

class User(val id: Int, val name: String, val address: String)
 fun saveUser(user: User) {
        if (user.name.isEmpty()) {
            throw IllegalArgumentException("用户名为空不能保存")
        }
        if (user.address.isEmpty()) {
            throw IllegalArgumentException("用户地址为空不能保存")
        }
        //保存user
    }

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

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

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

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

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

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

fun saveUser(user: User) {
        user.validateBeforeSave()
        //保存user
    }

将一段代码提取到扩展函数中,相当有效。如果能够遵循,类的api只能包含必须的方法,那么就可以让类保持精炼的同时,也让思路更清晰。另一方面,主要处理单个对象,而且不需要访问其私有数据的函数,可以访问它的成员而无需额外验证。

相关文章

  • Kotlin3.6局部函数和扩展

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

  • 学习内容

    函数 顶层函数 扩展函数 可变函数 局部函数 组件函数 中缀调用 let函数 lambda表达式 表达式 解构声明...

  • shell脚本变量处理和扩展

    shell脚本变量处理和扩展 变量的类型 局部变量 局部变量只在代码块或一个函数里有效 如果变量用local来声明...

  • 浅谈Kotlin语法篇之扩展函数(五)

    1、为什么要使用Kotlin中的扩展函数? 2、怎么去使用扩展函数和扩展属性? 3、什么是扩展函数和属性? 4、扩...

  • Block浅析

    block是语言的的扩展功能,它是一种带有自动变量(局部变量)的匿名函数. /******************...

  • 009 Stata循环:扩展函数

    无论是局部宏,还是全局宏,其后都可以跟扩展函数。 {local | global} mname : extende...

  • scala之函数和闭包

    函数和闭包 方法 局部函数:函数里面嵌套函数 局部函数可以访问包含它们的函数的参数,因此上面的函数可以改造为如下形...

  • 重拾Kotlin(12)-扩展函数和扩展属性

    一、扩展函数和扩展属性 1.1、扩展函数 扩展函数用于为一个类增加一种新的行为,这是为缺少有用函数的类进行扩展的途...

  • 全局变量和局部变量相关

    局部变量和全局变量 局部变量概念:局部变量就是定义在函数,代码块和函数形参列表中的变量,我们称之为局部变量作用范围...

  • 一个例子记住C++对象的生存周期

    代码 代码说明: 类A,含构造函数和析构函数 普通函数fun,函数体里新建了类A的局部自动对象FunObj和局部静...

网友评论

    本文标题:Kotlin3.6局部函数和扩展

    本文链接:https://www.haomeiwen.com/subject/dlrzjftx.html