当前位置: 首页 > 知识库问答 >
问题:

kotlin函数只有7个参数

漆雕硕
2023-03-14

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
}

如何获取db最新值因为函数返回后这些局部变量将被销毁?。如何通过传递7个参数使这个函数高效。

共有2个答案

屠锐
2023-03-14

让我们从一个问题开始-为什么一个函数中超过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不能重新赋值

因此,参数的数量并不总是一个问题 - 这只是一个建议,可能有问题。由您来验证它并在需要时进行修复。

鲍宁
2023-03-14

您可以创建一个自定义数据模型,该模型将采用多个值。

像这样

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游戏中查看获胜的点击单元格后调用。我不知道错误在哪里!事先谢谢你