Scala的优点之一是,它使您可以很好地控制范围。你可以嵌套
像这样的功能:

def fn1 = {
  def fn11 = {
    ...
  }
  def fn12 = {
    ...
    def fn121 = {
      ...
    }
  }
  ...
  def fn13 = {
    ...
  }
}

这里的问题是fn1可能看起来有点吓人。来自Java的背景,建议将功能保持足够小,以使其可以在IDE的单个“页面”上查看。

您会基于以下理由考虑将fn12从fn1中删除:“现在仅在fn1中使用它,但是稍后它可能在类中的其他地方有用……”

另外,您是否希望将嵌套函数放置在哪里-在调用它们的代码之前还是之后?

最佳答案

有一些模式可以利用一层嵌套。

递归,用于隐藏实现细节(比分成两个单独的顶层方法更干净):

def callsRecursive(p: Param): Result = {
  def recursive(p: Param, o: OtherParam, pr: PartialResult = default): Result = {
    ...
  }
}

安全范围请勿重复:
def doesGraphics(p: Point) {
  def up(p: Point): Point = // ...
  def dn(p: Point): Point = // ...
  def lf(p: Point): Point = // ...
  def rt(p: Point): Point = // ...
  /* Lots of turtle-style drawing */
}

还有更多深奥的技巧,例如遮盖本地块的隐式转换。

如果您两者都需要,我可以设想嵌套两次。超过这可能是过大的,主要是因为您可能使一种方法做得太多。您应该考虑如何使用干净的接口(interface)分割问题,然后将这些接口(interface)变成自己的方法,而不是在方法中定义的所有变量周围都杂乱无章的封闭。大方法就像全局变量:一切都变得过于依赖于实现细节,并且很难跟踪。如果您准备做一些适当的思考以使某个东西具有一个不错的界面,即使您只需要一次,也可以考虑将其带到最高层次。如果您不愿意这么认为,那么我倾向于将其保留在内部以避免污染接口(interface)。

无论如何,不​​要害怕在需要的地方创建方法。例如,假设您发现自己处于某个方法的深处,并且具有两个集合,每个集合必须在逻辑上的特定点对它们执行相同的操作。如果您是一两种或三种方法,请不要担心!只需在需要的地方创建方法,然后调用它即可,而无需重复自己的工作。 (请记住,如果您只需要在同一位置处理几件事,则可以创建列表和映射。)

10-06 08:45