美文网首页Kotlin编程Kotlin
Kotlin边用边学:require / check / ass

Kotlin边用边学:require / check / ass

作者: 朱和 | 来源:发表于2018-07-13 06:46 被阅读8次

Takeway(划重点)

  • require对外、check对内,组成了协议的前置条件
  • assert是协议的后置条件


    kotlin+android-360.jpg

接触过Design by contractOCL(Object Constraint Language)或平时设计比较严谨的同学应该知道,一个良好的接口设计/文档其实是应该包括了接口的前置条件(即满足什么条件才可以调用这个接口)和后置条件的(执行完毕这个接口后,哪些是真)。在2000年初期MDA (Model-driven Architecture)还比较红火的时候,很多模型师、架构师都会在接口中追加此类定义。这个追加行为,除了本身有利于源代码的输出(是的,当时MDA的口号其实就是以后不需要码农,只要模型师的),确实可以让接口的定义更完整、清晰,显得专业味十足。

现在MDA虽然不怎么再提到,但其科普的前置/后置条件还是一定程度帮助了软件业的完善。Kotlin作为一个比较现代的语言,在汲取了多类语言和设计概念后,很多原先其他语言需要特定实现(或重复发明轮子)的事情,在Kotlin的标准库就自带了,譬如require / check / assert 对于前置/后置条件的支持。

先看下三者的定义:

  • require(Boolean) throw IllegalArgumentException
  • check(Boolean) throw IllegalStateException
  • assert(Boolean) throw AssertionError

其实对应着看到各自的输出,应该能猜测到一些东西。譬如

  • IllegalArgumentException: 传入的参数有问题
  • IllegalStateException:自身状态不对
  • AssertionError:和预估的不一样 (在后置条件的维基百科中其实就是这么定义的)

    Postconditions are sometimes tested using assertions within the code itself

所以总结下来,大概就是这么回事了:

  • require负责检查输入的参数,如果有问题,抛出IllegalArgumentException
  • check负责检查自身是否万事俱备可以执行了,如果不是,抛出IllegalStateException
  • require + check就是在做前置条件的检查,通过了才可以执行真正的程序逻辑
  • assert负责确保程序执行完毕后的结果/内部状态是否符合预期,如果不是,抛出AssertionError

一个完整应用了这几个检查的代码大概如下(一个方法用于单次执行指定的sql语句,每次执行连接数据库并在执行完毕后释放连接(老土的demo,没有连接池-_-)):

fun execute(sql: String) : Unit {
    // 输入参数的检查
    require(!sql.isNullOrBlank()) {
        "被执行的sql语句不能为空"
    }

    // 自身状态检查
    check(!this.host.isNullOrBlank()) {
        "sql server未指定"
    }

    /*
     * conn = ...
     * conn.execute(sql)
     * conn.disconnect()
     */

    // 执行完毕后状态检查
    assert(!conn.isConnected) {
        "每次执行完毕后都需要释放连接"
    }
}

上面的require和check的顺序,没有一定的谁先谁后,这个纯粹看个人风格/习惯。不过如果涉及到某些执行/检查比较费资源时,还是让不费资源的优先执行为上。

Kotlin标准库的这几个函数,虽小却清晰的用代码来定义了契约,讲究协作的今天,还是挺需要的。

相关文章

  • Kotlin边用边学:require / check / ass

    Takeway(划重点) require对外、check对内,组成了协议的前置条件 assert是协议的后置条件k...

  • 边学边用,边用边学

    我一直想学很多东西,却一直没学好,甚至还没开始真正学习。 大学的时候,我就想学很多东西。想学习谈判,学习演讲,写一...

  • 边学边用

    7月14日《人生效率手册》5 书里说到,如果我们不能将所学的理论与实践相结合,换句话说,在实践场景中,无法调用知识...

  • 边学边用

    2020.08.16 星期天 阴雨天 早上去辅导的时候,马老师给学生买了高中语法书,给我...

  • 边学边用

    分享424 有这么一句话:有人不让你成功,但是没有办法不让你成长。成长是自己的事情,成长应该成为每一个人的状态。 ...

  • 边学边用

    我阅读的书目是《致青年老师》 读书笔记分享:在读《致青年老师》第三辑《心里装着学生》,想学生之所想,急学生之所急,...

  • Kotlin边用边学:别把Extension Function玩

    Key Takeaways(划重点) 设计原则不要忘 扩展是个补锅匠 定向输出是好手 升级外挂要当心 这里假定你对...

  • markdown边学边用

    ```代码块``` ~~删除线~~ 有序列表 数字+英文句号 后面还有空格 反斜杠转义特殊字符\``` *** 分...

  • 边学边用 - 草稿

    刘斌焦点网络四期驻马店坚持分享第260天 看到刘老师分享的边学边用,用中才会有更好的进步,很有感触。这一次遇到实际...

  • excel边用边学

    vlookup函数:ƒ(x)=vlookup(lookup_value,table_array,col_index...

网友评论

    本文标题:Kotlin边用边学:require / check / ass

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