kotlin中链式调用的简单思考

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

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

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

1
2
3
4
5
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

以及

1
2
3
4
5
6
7
8
9
10
11
12
fun methodWithImperativeStyle() {
var contentHeight = screenHeight
if (statusBarVisible) {
contentHeight -= statusBarHeight
}

if (navigationBarVisible) {
contentHeight -= navigationBarHeight
}

println("contentHeight: $contentHeight")
}

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

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

以及

1
2
3
4
5
6
7
8
9
fun methodWithChainedStyle() {
val contentHeight = screenHeight.checkAndModify(statusBarVisible) {
it - statusBarHeight
}.checkAndModify(navigationBarVisible) {
it - navigationBarHeight
}

println("contentHeight: $contentHeight")
}

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