Hay algunos patrones que aprovechan una capa de anidación.
recursividad, donde se utiliza para ocultar los detalles de implementación (y es más limpio que separa en dos métodos de nivel superior separadas):
def callsRecursive(p: Param): Result = {
def recursive(p: Param, o: OtherParam, pr: PartialResult = default): Result = {
...
}
}
Ámbito de fallos No te-repetir-yourself:
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 */
}
Y más trucos esotéricos como sombrear conversiones implícitas para un bloque local.
Si necesita estas dos cosas, podría imaginar anidar dos veces. Más que eso es probable que sea demasiado, sobre todo porque probablemente estás haciendo que un método haga demasiado. Debería pensar en cómo subdividir el problema con interfaces limpias que luego pueden convertirse en sus propios métodos, en lugar de tener un revoltijo desordenado de cierres alrededor de todo tipo de variables definidas dentro del método. Los grandes métodos son como variables globales: todo se vuelve demasiado dependiente de los detalles de la implementación y demasiado difícil de seguir. Si está listo para pensar lo suficiente para que algo tenga una interfaz decente, incluso si solo lo necesita una vez, considere sacarlo al nivel superior. Si no vas a pensar tan duro, mi inclinación es dejarlo adentro para evitar contaminar la interfaz.
En cualquier caso, no tenga miedo de crear un método en cualquier lugar que lo necesite. Por ejemplo, supongamos que se encuentra en lo profundo de algún método con dos colecciones, cada una de las cuales debe tener la misma operación realizada en puntos específicos de la lógica. ¡No te preocupes si tienes uno o dos o tres métodos de profundidad! Simplemente cree el método donde sea necesario y llámelo en lugar de repetirlo. (Solo tenga en cuenta que crear una lista y mapear es una alternativa si simplemente necesita procesar varias cosas en el mismo lugar).