1層のネストを利用するパターンがいくつかあります。
再帰。実装の詳細を非表示にするために使用されます(2つの別々のトップレベルメソッドに分離するよりもクリーンです)。
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 */
}
そして、ローカルブロックの暗黙の変換をシャドウイングするようなより難解なトリック。
これらの両方が必要な場合は、2回のネストを想定できます。それ以上のことはおそらくやり過ぎでしょう。これは主に、1つの方法でやりすぎをしているためです。メソッド内で定義されたすべての種類の変数の周りにクロージャの厄介な寄せ集めを用意するのではなく、独自のメソッドになることができるクリーンなインターフェイスで問題を細分化する方法を検討する必要があります。大きなメソッドはグローバル変数のようなものです。すべてが実装の詳細に依存しすぎて、追跡するのが難しくなります。何かがまともなインターフェースを持つようにするために適切な量の思考を行う準備ができている場合は、一度だけ必要な場合でも、それをトップレベルに持ち出すことを検討してください。あなたがそれほど難しいことを考えないのであれば、私の傾向は、インターフェースを汚染しないようにそれを中に残しておくことです。
いずれにせよ、必要な場所にメソッドを作成することを恐れないでください。たとえば、2つのコレクションがあり、それぞれがロジックの特定のポイントで同じ操作を実行する必要があるメソッドの奥深くにいるとします。あなたが1つか2つか3つの方法であるかどうか心配しないでください!必要な場所にメソッドを作成し、繰り返すのではなく呼び出すだけです。(同じ場所で複数のものを処理する必要がある場合は、リストとマッピングを作成することもできます。)