【问题标题】:Scala split large class into multiple filesScala将大类拆分为多个文件
【发布时间】:2022-01-27 10:57:43
【问题描述】:

我有一个类定义如下:

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 */
}

我想将私有成员移动到一个单独的文件中,但问题是它们都相互依赖以及大类的参数/其他成员。

有什么方法可以将类分成多个部分?

【问题讨论】:

  • 考虑到这一切看起来有多么复杂,将其拆分成多个文件不太可能取得任何有用的结果。

标签: scala oop


【解决方案1】:

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

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

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

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

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

Cake Pattern 是一种值得商榷的方法,但它可能适合您的需求。您可以混合所有这些函数的实现,并在基本特征中保持抽象的依赖关系。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多