为什么
当我们在现有代码库中添加新功能时,我们倾向于为现有功能添加越来越多的参数。通常,我们希望最大程度地减少当前代码的更改,并快速包装功能/bugfix。虽然意图是好的,但它可能会导致许多问题。
根据项目,此数字可能会有所不同。根据Sonarlint,该数字应小于7。
- 功能做得太多
- 可以将参数分组以形成新类
虽然可以使用@Suppress("LongParameterList"),
抑制此警告,但最好重构代码以避免此警告。
该怎么办
根据功能,有不同的方法来重构代码以避免此警告。
- 检查功能中的参数的用法,看看是否可以
- 删除可能有相同目的的参数
- 将功能分为多个函数
- 组相关的参数到新类中,并将类实例传递为参数
怎么做
fun showErrorDialog(
title: String? = null,
message: String? = null,
positiveTitle: String? = null,
negativeTitle: String? = null,
val positiveButtonTextColor: Int? = null,
isCancelable: Boolean = true,
isSingleButtonDialog: Boolean = true,
val inCompose: Boolean = false
) {
...
}
解决此问题的一种方法是将参数分组到新类中,并创建一个新的超载函数,将新类作为参数。
data class DialogParams(
val title: String? = null,
val message: String? = null,
val positiveTitle: String? = null,
val negativeTitle: String? = null,
val positiveButtonTextColor: Int? = null,
val isCancelable: Boolean = true,
val isSingleButtonDialog: Boolean = true,
)
fun showErrorDialog(
dialogParams: DialogParams,
val inCompose: Boolean = false
) {
...
}
用新函数替换函数调用,并将参数作为新类实例传递。
fun showLoginFailed() {
showErrorDialog(
DialogParams(
title = "Login Failed",
message = "Please try again",
positiveTitle = "Retry",
negativeTitle = "Cancel",
positiveButtonTextColor = R.color.green,
isCancelable = false,
isSingleButtonDialog = true
)
)
}
用新功能替换所有用法后,您可以删除旧功能。
注意:简化了代码示例。理想情况下,使用字符串资源代替硬编码字符串。