首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin代码重构

Kotlin代码重构
EN

Stack Overflow用户
提问于 2017-11-22 07:59:16
回答 2查看 625关注 0票数 0

我有一个函数,它检查是否有搜索条件。

代码语言:javascript
复制
var currentStatus = MutableLiveData<List<Int>>()

private var sellerIds: List<Int>? = null
private var subSellerIds: List<Int>? = null
private var partnerIds: List<Int>? = null
private var productTypeIds: List<Int>? = null
private var brunchIds: List<Int>? = null
private var contractDateFrom: String? = null
private var contractDateTo: String? = null
private var completeDateFrom: String? = null
private var completeDateTo: String? = null

private var totalStatusCnt: Int = 10

val isSearching = ObservableField<Boolean>(false)

private fun checkIfSearchConditions() {
    if (currentStatus.value != null && currentStatus.value!!.isNotEmpty() &&
            currentStatus.value?.size != totalStatusCnt) {
        isSearching.set(true)
    } else if (keyword != null && keyword!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (sellerIds != null && sellerIds!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (subSellerIds != null && subSellerIds!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (partnerIds != null && partnerIds!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (productTypeIds != null && productTypeIds!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (brunchIds != null && brunchIds!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (contractDateFrom != null && contractDateFrom!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (contractDateTo != null && contractDateTo!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (completeDateFrom != null && completeDateFrom!!.isNotEmpty()) {
        isSearching.set(true)
    } else if (completeDateTo != null && completeDateTo!!.isNotEmpty()) {
        isSearching.set(true)
    } else {
        isSearching.set(false)
    }
}

而且checkIfSearchConditions方法看起来很脏,所以我想重构这个方法来说明清楚。

我试着做一个空的检查方法,

代码语言:javascript
复制
private fun checkIfNotEmpty(field: Any?): Boolean {
    return field != null && field!!.isNotEmpty() // isNotEmpty is not unsolved reference
}

但文件类型可以是列表吗?或者字符串?,因此获取'isNotEmpty‘不是未解决的引用’错误。

如何重构该方法以明确说明?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 08:12:05

List<*>?String?创建两个单独的重载方法

代码语言:javascript
复制
private fun checkIfNotEmpty(field: String?): Boolean {
    return field != null && field.isNotEmpty()
}
private fun checkIfNotEmpty(field: List<*>?): Boolean {
    return field != null && field.isNotEmpty()
}

注意,在这些方法中,您不需要在!!中使用field!!.isNotEmpty():因为它不是一个var,在检查它不等于null之后,Kotlin知道它不能变成一个var

另一种更糟的方法是将Any?保持为参数类型,并检查运行时是否有ListString

代码语言:javascript
复制
private fun checkIfNotEmpty(field: Any?): Boolean {
    return when(field) {
        null -> false
        is List<*> -> field.isNotEmpty()
        is String -> field.isNotEmpty()
        else -> false
    }
}

此外,所有具有相同主体的else if分支都可以使用||进行组合:

代码语言:javascript
复制
if ((checkIfNotEmpty(currentStatus) &&
        currentStatus?.value?.size != totalStatusCnt) ||
    checkIfNotEmpty(keyword) ||
    checkIfNotEmpty(sellerIds) || ...
) {
    isSearching.set(true)
} else {
    isSearching.set(false)
}

它可以改进得更好

代码语言:javascript
复制
val isSearchingValue = (checkIfNotEmpty(currentStatus) &&
        currentStatus?.value?.size != totalStatusCnt) ||
    checkIfNotEmpty(keyword) ||
    checkIfNotEmpty(sellerIds) || ...
isSearching.set(isSearchingValue)
票数 1
EN

Stack Overflow用户

发布于 2017-11-22 10:30:42

Kotlin stdlib包含函数

代码语言:javascript
复制
public inline fun CharSequence?.isNullOrEmpty(): Boolean = this == null || this.length == 0
public inline fun CharSequence?.isNullOrBlank(): Boolean = this == null || this.isBlank()

您可以为Collection?定义类似的乐趣

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47429484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档