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
是使用一些 Database
、WebService/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
.
我有一个 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
是使用一些 Database
、WebService/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
.