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