此功能有太多参数
#android #codequality #functions #sonarlint

为什么

当我们在现有代码库中添加新功能时,我们倾向于为现有功能添加越来越多的参数。通常,我们希望最大程度地减少当前代码的更改,并快速包装功能/bugfix。虽然意图是好的,但它可能会导致许多问题。

根据项目,此数字可能会有所不同。根据Sonarlint,该数字应小于7。

  1. 功能做得太多
  2. 可以将参数分组以形成新类

虽然可以使用@Suppress("LongParameterList"),抑制此警告,但最好重构代码以避免此警告。

该怎么办

根据功能,有不同的方法来重构代码以避免此警告。

  1. 检查功能中的参数的用法,看看是否可以
    1. 删除可能有相同目的的参数
    2. 将功能分为多个函数
  2. 组相关的参数到新类中,并将类实例传递为参数

怎么做

 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
    )
  )
}

用新功能替换所有用法后,您可以删除旧功能。

注意:简化了代码示例。理想情况下,使用字符串资源代替硬编码字符串。