每当我有一个足够大的函数可以分解成更小的函数时,我总是将较小的函数创建为较大函数作用域的嵌套函数,如下所示:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是因为它提供了这些功能的封装,这些功能目前只有一个调用点;封闭范围的那个。
然而,我在工作中经常被要求将这些函数重构为封闭类的私有函数,如下所示:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我反对这一点的论点是,这些函数只有 1 个调用点,通过将它们提升到类级别的私有函数,我用只在一个地方调用的方法混淆了类。
还可以提出一个额外的小论点,如果我将它们设为类的私有函数,那么稍后有人可以进来并开始在这些私有函数和调用它们的函数之间插入方法,这样它们之间可能会有 100 行代码调用站点和函数本身,导致需要心理体操来理解调用函数(因为您现在需要将调用函数从屏幕上滚动以查看私有函数)。
在我的论点没有说服评论者之后,我总是遵守并将它们转移到班级的私人职能中。
我的论点是否有效或是否有合法的原因(性能、代码可读性)使我的论点无效?
我发现将嵌套函数转换为包含该函数的类中的私有函数非常令人困惑,因为唯一的目的只是提高主函数的可读性。private 子句只能防止在类外部无意中使用,但它会妨碍类源代码的可读性。
就效率而言,没有任何问题,恰恰相反,但这无关紧要。在编译时,在类中搜索有效函数更加简化,因为嵌套函数甚至不是数据字典的一部分。
就效率而言,当允许嵌套函数查看父函数的部分上下文(位于代码的较早部分)时,会产生很小的开销。由于使用只是作为实现更好的可读性的一种手段,所以我认为这没有问题。
作为私有函数,编译器可以访问类中的任何位置的函数,我认为这是一个封装缺陷,因为这不是本地和嵌套函数的目的。
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |