Scala 将大型 class 拆分为多个文件

Scala split large class into multiple files

我有一个 class 定义如下:

trait BigService {
   def A
   def D
   def E
   /* etc */
}

class BigServiceImpl(...) extends BigService {
   def A = _

   private def B = _ // uses func A, and BigService's parameters

   private def C = _ // uses func B, and BigService's parameters

   def D = _ // uses func C, and BigService's parameters

   /* other members */
}

我想将私有成员移动到一个单独的文件中,但问题是它们都相互依赖,并且依赖于大型 class.[=12] 的 parameters/other 成员=]

有没有办法把class分成多个部分?

我确信可以拆分和重构任何代码,但问题非常抽象,因此很难提供任何具体建议。因此,这里有一些您可以采用的原则。

组合与继承。假设您的 BigService 是使用一些 DatabaseWebService/API 等的实际业务服务 class。您可以使用组合将这些组件添加到您的服务中,而不是继承它们全部来自不同的 classes.

考虑反转函数依赖关系。通常 public 方法将依赖于私有方法,而不是相反。这可能是您的关键。提取许多具有单一用途的小方法,然后您将能够看到如何将它们及其依赖项移出到不同的 class。切向记住控制反转。

使用高阶函数将行为与实现分离。如果 private def B 使用函数 A 和一些 class 成员,您可以将其表示为 HOF:def B(functionA: (...) => ..., someArg: T) 或类似的。

Scala 为您提供 OOP 和 FP 的强大功能,因此您可以利用两者进行重构。他们的关键是理解底层函数类型:什么取决于什么。如果您使功能纯粹、单一用途和通用,您可以显着减少依赖性。

Cake Pattern 是一种有争议的方法,但它可能适合您的需要。您混合所有这些功能的实现,并在基本特征中保持依赖抽象。

我可以继续说下去,但重点是尝试以更线性的方式构建您的代码,其中依赖项仅指向一个方向而不形成一个圆圈。 IE。依赖图 A -> B -> C 优于 A -> C, C -> B, B -> A.