Kotlin - 嵌套函数与具有 1 个调用点的私有(private)函数

标签 kotlin

每当我有一个足够大的函数需要分解成更小的函数时,我总是会创建更小的函数作为更大函数范围的嵌套函数,如下所示:

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/

相关文章:

hibernate - 将子类按自定义FungibleState模式的瞬时父属性分组

java - Java 9+ 中未找到 Gradle 重复模块/无法找到或加载主类错误

android - MPAndroidChart:带间隙的水平条形图

Kotlin:类似类中的双冒号与 Lambda

java - 要求因 float 而失败

spring-boot - 如何启用 Spring Security kotlin DSL?

android - 对于 Dagger 2,是否可以进行可变构造函数参数注入(inject)?

Kotlin map : why is there no toHashMap()?

kotlin - 是否可以在 Kotlin 中模拟改造 Deferred<Response<T>>?

java - 在底部导航栏中添加项目