【问题标题】:Kotlin Extension functions to split big classesKotlin 扩展函数来拆分大类
【发布时间】:2018-10-29 10:48:18
【问题描述】:

最近在我的公司,在回顾了编写重型课程的不同方法后,开始了一场辩论。

必须用 Kotlin 重写一个包含组件特定逻辑的大型 Java 类(没有任何标准的 OOP 原则)。提供的解决方案是将类别中的逻辑和类别拆分为具有内部扩展功能的单独文件到主类。

例子:

Main.kt
class BigClass {
  // internal fields exposed to the extension functions in different files

  // Some main logic here
}


BusinessLogic.kt
internal fun BigClass.handleBussinessCase() {
 // Complex business logic handled here accessing the exposed internal fields from BigClass
}

您对此有何看法?我没有看到它在任何地方使用可能是有充分理由的,但是千行类的替代品似乎更糟。

【问题讨论】:

  • 如果您可以将逻辑拆分为“类别”,那么为什么不能将其拆分为类?
  • 我必须从主类传递多个引用,我主要关心的是可读性。拆分成多个文件会使代码有点难以理解

标签: android kotlin


【解决方案1】:

您必须考虑到扩展函数只不过是一个带有隐式第一个参数的函数,该参数由this 引用。

所以在你的情况下,你会有类似的东西:

internal fun handleBussinessCase(ref: BigClass)

这将转换为 Java 为:

static void handleBussinessCase(BigClass ref)

但这可以假设为委托模式,也可以在 Kotlin 中更简洁地封装。

由于属性必须是internal,因此您可以将它们作为data class 注入到较小的用例中。如果您围绕这些定义一个接口(这会使属性public),您可以使用它创建一个委托模式,并在您的实现中仍然使用this 引用每个属性。

【讨论】:

    【解决方案2】:

    以下是为类制作扩展函数的一些想法:

    • 它将是一个实用函数,将与您正在扩展的对象一起操作,它不是一个对象函数,这意味着它只能访问public 方法和属性;
    • 如果您计划使用在单元测试中扩展的类,这些方法(扩展)将更难模拟;
    • 与继承的对象一起使用时,它们的行为很可能不会像您预期的那样。

    也许我错过了什么,所以请阅读更多关于扩展的信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多