如何在 kotlin 中重构具有 6 个以上参数的方法

How to refactor method with more than 6 parameters in the kotlin

我需要在一个api中发起一个请求,我要发送11个参数,但是使用代码分析工具,通知我最多发送6个。会有某种形式的重构让我发送这些参数而不用这种方式发送?我正在使用科特林 我简化了我的代码:

viewModel.requestTest(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param10)
class viewModel

fun requestTest (param1 , param2, param3 : String? = "" , param4 : String? = "", param5 : String? = "", param6 : String? = "", param7 : String? = "", param8 : String? = "", param9 : String? = "", param10 : String? = "" , param10: String? = "") {
    //do request filling the body with these parameters
}


使用数据 class 作为参数的包装器。

data class RequestParams(val param1: String, ..., val paramN: String)

fun requestTest (params: RequestParams) {
    // use parameters like params.param1
}

请注意,在大多数情况下,您还可以为这些参数提供默认值并使用命名参数来简化此类调用,例如

data class RequestParams(
  val name: String = "foo",
  val value: Int = 3,
  ...,
  val whatever: String? = null)

val params = RequestParams(
  value = 5
)

...

请注意,您仍然将超过 6 个参数传递给数据 class 的构造函数,但通常 linting 工具会识别出数据 classes 是保存许多属性的惯用方式,并在检查此规则时忽略它们(正如@Matt Timmermans 在您的问题评论中指出的那样,这是 indeed the case)。

如果这不能解决您的问题,那么您可以将 10 个参数分组为 2 个数据 classes,具有 5+5 或 4+6 个参数——这是否有意义完全取决于您的参数的潜在业务含义。

如果以这种方式拆分参数没有意义,我倾向于在数据 class 构造函数上添加一个 linter 忽略注释,而不是专门编码来解决 linter。

我认为在 Android 系统

中使用像 Bundle(https://developer.android.com/reference/android/os/Bundle?hl=en) 这样的对象很有用