有一些模式可以利用一层嵌套。
递归,它用于隐藏实现细节(并且比分成两个单独的顶级方法更干净):
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 */
}
还有更深奥的技巧,例如隐藏本地块的隐式转换。
如果你需要这两个,我可以设想嵌套两次。更多的可能是矫枉过正,主要是因为你可能让一种方法做得太多。您应该考虑如何使用干净的接口细分问题,然后这些接口可以成为它们自己的方法,而不是在方法中定义的各种变量周围有一个混乱的大杂烩。大方法就像全局变量:一切都变得过于依赖于实现的细节,而且难以跟踪。如果您已准备好进行适当的思考以使某些东西具有像样的界面,即使您只需要一次,那么请考虑将其带到顶层。如果您不打算那么努力,我倾向于将其留在内部以避免污染界面。
无论如何,不要害怕在任何你需要的地方创建一个方法。例如,假设您发现自己深陷于具有两个集合的某个方法中,每个集合都必须在逻辑中的特定点对它们执行相同的操作。不要担心,如果你是一两个或三个方法的深度!只需在需要的地方创建方法,然后调用它而不是重复自己。(请记住,如果您只需要在同一个地方处理几件事情,创建列表和映射是一种替代方法。)