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 (list >0){
f = f+ "example"
}
return c+ e + f + dat
}
使此函数只有7个参数。我通过删除最后一个参数<code>dat</code>来拆分函数,但为了计算<code>dat</code>变量,我还需要<code>b</code>和<code>d</code>变量值。因此,在函数返回后,我需要<code>b</code>和<code>d</code>的值来计算<code>dat</code>值,然后concat<code>dat</code>值来返回函数。如下所示
fun example(
context: Context,
a: Int,
b: Int,
c: String,
d: Int,
e: String,
list: List<String>
) {
a = d+b
var f = a+b+d
if (list >0){
f = f+ "example"
}
return c+ e + f
}
// i call it like below
example(context, 1, 1, "c", 1, "e", listOf('list1', 'list2')) + exampleConcat("dat text")
fun exampleConcat(dat: String) {
val t = d + b + dat // here i need the latest value of 'd' and 'b'
return t
}
如何获取d
和b
最新值因为函数返回后这些局部变量将被销毁?。如何通过传递7个参数使这个函数高效。
让我们从一个问题开始-为什么一个函数中超过7个参数是件坏事?
答案很简单——都是关于易读性的。那么,我们能做些什么呢?
1.选择
对象
data class ExampleOpts(
public val p1: String,
...
public val p10: Int = 0
)
fun example(opts: ExampleOpts) {
}
这种方式更具可读性 - 函数签名表明它有很多参数,因此将它们提取到自己的结构中是一件好事。
2.建设者
当我们达到如此多的参数时,以某种方式验证方法之外的数据可能是好的。我们可以使用生成器来完成。这在kotlin中并不常见,因为我们可以简单地使用数据类(如默认参数等)来获得builder的许多优点。然而,有时它可能是值得的,特别是当我们需要验证数据时。
阅读更多关于静态编程语言中的构建器模式
3.忽略这个问题:)
事实上,我们不应该将SonarQube(或任何其他linter)中的所有问题都视为必须修复的问题,因为它只是静态分析的结果。有时拥有更多参数只是正常的事情。例如:
最多22个参数的函数示例
正如我们在这个库中看到的,我们比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不能重新赋值
)
因此,参数的数量并不总是一个问题 - 这只是一个建议,可能有问题。由您来验证它并在需要时进行修复。
您可以创建一个自定义数据模型,该模型将采用多个值。
像这样
data class CustomModel(
var list:List<String>
var dat:String
)
因此,您的解决方案将是这样的。
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
}
现在调用函数example(),并将CustomModel(list,dat)传递到示例函数中的CustomModel参数中。
1. zend_parse_parameters 2. Arg Info 与类型绑定 3. 小结 前面的章节我们look了一下如何在扩展中定义函数,它们的实现大都比较简单,但是在实际工作中,肯定会碰到函数接收参数的问题,而它就是我们这一章要讲解的内容。
我已经开始学习Haskell,我读到Haskell中的每一个函数只需要一个参数,我不明白在Haskell的庇护下发生了什么魔法,这使得它成为可能,我想知道它是否有效。 上面的签名意味着函数接受一个,然后返回另一个函数,该函数接受一个,并返回一个 示例1相对简单,但我开始想知道当函数稍微复杂一点时会发生什么。 在这个例子中,我编写了一个函数,并以两种方式执行它,一次传递一个参数,一次传递所有参数。
我是Kotlin的新手,很难理解下面的代码 所以这个函数叫做,它的输入参数是一个名为的函数,它是
我有一个非常奇怪的问题,很简单,但我不明白问题是什么。 我有一个类,ClassA调用ClassB中的函数,比如- 类A是在我的applicationContext中定义的bean。类xml ClassB中的函数定义看起来像 IntelliJ没有指出任何语法问题,一切看起来都很正常。。。然而,当我试图编译时,Maven出现了一个异常 B类与a类位于不同的模块中,因此B类位于a类的pom中。作为依赖项
我想为实现接口的类中的函数参数使用默认值,如下所示: 现在这里是编译的,这里是不编译的: KO:不允许重写函数为其参数指定默认值 KO:类“LocalFileStoreService”不是抽象的,并且没有实现抽象成员公共抽象存储文件(路径:String,负载:InputStream,类型:MediaType):fqn中定义的单元。。。文件存储服务 好 啊: 这是预期的行为吗?有没有更好的方法来管理
嗨,我为tictactoe游戏编写了这个示例代码,除了checkWinner函数之外,其他都正常工作,它接受两个参数ArrayList和currentPlayer来检查胜利者。该函数在每个玩家在tictactoe游戏中查看获胜的点击单元格后调用。我不知道错误在哪里!事先谢谢你