Android kotlin函数只有7个参数
Sonarqube仅允许7个参数用于该功能。我有一个函数,它用8个参数组成字符串Android kotlin函数只有7个参数,android,kotlin,sonarqube,Android,Kotlin,Sonarqube,Sonarqube仅允许7个参数用于该功能。我有一个函数,它用8个参数组成字符串 fun example( context: Context, a: Int, b: Int, c: String, d: Int, e: String, list: List<String>, dat: String ) { a = d+b var f = a+b+d if (
fun example(
context: Context,
a: Int,
b: Int,
c: String,
d: Int,
e: String,
list: List<String>,
dat: String
) {
a = d+b
var f = a+b+d
if (list >0){
f = f+ "example"
}
return c+ e + f + dat
}
如何获取
d
和b
最新值,因为函数返回后这些局部变量将被销毁?。如何通过传递7个参数来提高此函数的效率。您可以创建一个包含多个值的自定义数据模型
像这样
data class CustomModel(
var list:List<String>
var dat:String
)
现在调用函数example(),并将CustomModel(list,dat)传递到示例函数中的CustomModel参数中。让我们从一个问题开始—为什么函数中的参数超过7个是件坏事 答案很简单——都是关于可读性的。 那么,我们能做些什么呢 1<代码>选项对象
数据类示例选项(
公共值p1:字符串,
...
公共值p10:Int=0
)
有趣的例子(选项:ExampleOpts){
}
这种方法更具可读性——函数签名表明它有很多参数,因此将它们提取到自己的结构中是一件好事
2。建筑商
当我们达到如此多的参数时,以某种方式验证方法之外的数据可能是好的。我们可以使用生成器来完成。这在kotlin中并不常见,因为构建器的许多优点都可以通过简单的数据类(如默认参数等)实现。然而,有时它可能是值得的,特别是当我们需要验证数据时
3。忽略这个问题:)
事实上,我们不应该将SonarQube(或任何其他linter)中的所有问题都视为必须解决的问题,因为这只是静态分析的结果。有时,拥有更多的参数只是一件正常的事情。例如:
正如我们在这个库中看到的,我们有比7更多的参数,这是非常非常好的
4。这不是为了减少参数数量,而是为了提高可读性。
如此多的参数表明实现可能有问题。快速查看一下实现,就会发现它确实如此
fun example(
context: Context,
a: Int,
b: Int,
c: String,
d: Int,
e: String,
customModel: CustomModel
) {
a = d + b
var f = a + b + d
if (customModel.list > 0) {
f = f + "example"
}
return c + e + f + customModel.dat
}
上下文
-未使用
a
-不会编译,因为a
在第一行重新声明(val无法重新分配
)
所以,参数的数量并不总是一个问题——它只是一个暗示,可能有什么问题。由您来验证它,并在需要时进行修复。我认为更好的方法是这样做。对参数数量的限制是因为可能存在影响代码可维护性的设计问题。如果通过使问题变得更复杂(比如在元组或列表中隐藏多个参数)来解决问题,那么问题只会变得更糟。与其挖一个更深的洞,不如忽略声纳警告。这不仅关乎可读性,还关乎单一责任原则。有这么多的参数是一个可能的设计问题的标志。
fun example(
context: Context,
a: Int,
b: Int,
c: String,
d: Int,
e: String,
customModel:CustomModel
) {
a = d+b
var f = a+b+d
if (customModel.list >0){
f = f+ "example"
}
return c+ e + f + customModel.dat
}
fun example(
context: Context,
a: Int,
b: Int,
c: String,
d: Int,
e: String,
customModel: CustomModel
) {
a = d + b
var f = a + b + d
if (customModel.list > 0) {
f = f + "example"
}
return c + e + f + customModel.dat
}