kotlin中链式调用的简单思考

回主页

有一个需求,获取app内容的高度,一般我会这样组织代码结构

  1. 获取手机屏幕高度
  2. 如果当前手机状态栏在显示,就减去状态栏高度
  3. 如果当前手机虚拟导航栏在显示,就减去导航栏高度
  4. 返回处理后的高度

我们先假定一些初始值(状态栏是否显示、状态栏高度、导航栏是否显示,导航栏高度等),代码大概是这样:

val statusBarHeight = 32 // we assume the value of statusbar's height is 32
val navigationBarHeight = 128 // we assume the value of nav's height is 128
val screenHeight = 1920
val statusBarVisible = true
val navigationBarVisible = false

以及

fun methodWithImperativeStyle() {
    var contentHeight = screenHeight
    if (statusBarVisible) {
        contentHeight -= statusBarHeight
    }

    if (navigationBarVisible) {
        contentHeight -= navigationBarHeight
    }

    println("contentHeight: $contentHeight")
}

这种写法倾向于面向过程的编程思维,于是,我写了一个支持链式调用的方法,并且把新的获取app内容的高度的实现方式显示如下。

fun <T> T.checkAndModify(condition: Boolean, modify: (T) -> T): T {
    return if (condition) {
        modify(this)
    } else this
}

以及

fun methodWithChainedStyle() {
    val contentHeight = screenHeight.checkAndModify(statusBarVisible) {
        it - statusBarHeight
    }.checkAndModify(navigationBarVisible) {
        it - navigationBarHeight
    }

    println("contentHeight: $contentHeight")
}

大家觉得怎么样?喜欢哪种方法呢?

回主页