有一个需求,获取app内容的高度,一般我会这样组织代码结构
我们先假定一些初始值(状态栏是否显示、状态栏高度、导航栏是否显示,导航栏高度等),代码大概是这样:
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")
}
大家觉得怎么样?喜欢哪种方法呢?