每当我有一个足够大的函数需要分解成更小的函数时,我总是会创建更小的函数作为更大函数范围的嵌套函数,如下所示:
class Foo {
fun bar() : Int {
fun a() : Int {
// Do a load of stuff
return 1
}
fun b() : Int {
// Do a load of stuff
return 1
}
return a() + b()
}
}
我这样做是因为它提供了对这些功能的封装,这些功能目前只有一个调用点;的封闭范围。
但是,我经常在工作中被要求将这些函数重构为封闭类的私有(private)函数,如下所示:
class Foo {
fun bar() : Int {
return a() + b()
}
private fun a() : Int {
// Do a load of stuff
return 1
}
private fun b() : Int {
// Do a load of stuff
return 1
}
}
我反对这一点的论点是,这些函数只有 1 个调用点,并且通过将它们提升到类级别的私有(private)函数,我正在使用只在一个地方调用的方法来混淆类。
还可以提出一个额外的小论点,如果我将它们设为类的私有(private)函数,那么稍后有人可以进来并开始在这些私有(private)函数和调用它们的函数之间插入方法,这样在它们之间可能有 100 行代码调用站点和函数本身,导致需要心理体操才能理解调用函数(因为您现在需要将调用函数滚动到屏幕之外才能看到私有(private)函数)。
在我的论点没有说服审稿人之后,我总是遵守并将它们转移到类(class)的私有(private)职能中。
我的论点是有效的还是有正当的理由(性能、代码可读性)使我的论点无效?
最佳答案
我发现将嵌套函数转换为包含函数的类中的私有(private)函数非常令人困惑,因为唯一的目的只是提高主函数的可读性。 private 子句仅防止在类外无意使用,但它阻碍了类源代码的可读性。
在效率方面,没有问题,恰恰相反,但这无关紧要。在编译器时,在类中搜索有效函数更加简化,因为嵌套函数甚至不是数据字典的一部分。
在效率方面,当允许嵌套函数查看父函数的部分上下文时,会有一点开销,这在代码的前面部分。由于使用只是作为实现更好可读性的一种手段,我认为这没有问题。
作为私有(private)函数,编译器可以在类中的任何位置访问该函数,我认为这是一个封装缺陷,因为这不是本地和
嵌套函数。
关于Kotlin - 嵌套函数与具有 1 个调用点的私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62088132/