有一个需求,获取app内容的高度,一般我会这样组织代码结构
- 获取手机屏幕高度
- 如果当前手机状态栏在显示,就减去状态栏高度
- 如果当前手机虚拟导航栏在显示,就减去导航栏高度
- 返回处理后的高度
我们先假定一些初始值(状态栏是否显示、状态栏高度、导航栏是否显示,导航栏高度等),代码大概是这样:
1 | val statusBarHeight = 32 // we assume the value of statusbar's height is 32 |
以及1
2
3
4
5
6
7
8
9
10
11
12fun methodWithImperativeStyle() {
var contentHeight = screenHeight
if (statusBarVisible) {
contentHeight -= statusBarHeight
}
if (navigationBarVisible) {
contentHeight -= navigationBarHeight
}
println("contentHeight: $contentHeight")
}
这种写法倾向于面向过程的编程思维,于是,我写了一个支持链式调用的方法,并且把新的获取app内容的高度的实现方式显示如下。
1 | fun <T> T.checkAndModify(condition: Boolean, modify: (T) -> T): T { |
以及1
2
3
4
5
6
7
8
9fun methodWithChainedStyle() {
val contentHeight = screenHeight.checkAndModify(statusBarVisible) {
it - statusBarHeight
}.checkAndModify(navigationBarVisible) {
it - navigationBarHeight
}
println("contentHeight: $contentHeight")
}
大家觉得怎么样?喜欢哪种方法呢?