大きなメソッド(またはプロシージャ、または関数—この質問は OOPに固有のものではありませんが、私は99%の時間でOOP言語で作業しているため、私が最も使いやすい用語です) 、結果に不満を感じることがよくあります。これらの小さなメソッドについては、大きなメソッドの単なるコードブロックである場合よりも推論するのが難しくなります。なぜなら、それらを抽出すると、呼び出し元のコンテキストに由来する多くの基本的な前提が失われるためです。
後で、このコードを見て個々のメソッドを見ると、それらがどこから呼び出されているかすぐにはわかりません。ファイル内のどこからでも呼び出すことができる通常のプライベートメソッドと考えています。たとえば、初期化メソッド(コンストラクターなど)を一連の小さなメソッドに分割することを想像してください:メソッド自体のコンテキストでは、オブジェクトの状態がまだ無効であることを明確に知っていますが、通常のプライベートメソッドでは、おそらくはすでに初期化されており、有効な状態です。
これについて私が見た唯一の解決策は、where
Haskell の句です。これにより、「親」関数でのみ使用される小さな関数を定義できます。基本的には次のようになります。
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
しかし、私が使用する他の言語にはこのようなものはありません。最も近いのは、ローカルスコープでラムダを定義することです。
だから、私の質問は-あなたはこれに遭遇しますか、そしてあなたはこれが問題であることを見ますか?そうした場合、特にJava / C#/ C ++などの「メインストリーム」OOP言語では、通常どのように解決しますか?
重複についての編集:他の人が気づいたように、分割方法を議論する質問とワンライナーである小さな質問が既にあります。私はそれらを読みましたが、呼び出し元のコンテキスト(上記の例では、オブジェクトが初期化されている)から派生する可能性のある基本的な前提の問題については説明していません。それが私の質問のポイントであり、それが私の質問が異なる理由です。
更新:この質問と議論を下で行った場合、特にこの問題に関するJohn Carmackの記事をお楽しみください。
実行されている実際のコードを認識することに加えて、インライン関数には、他の場所から関数を呼び出せないという利点もあります。それはばかげているように聞こえますが、それにはポイントがあります。コードベースが長年の使用で成長するにつれて、ショートカットを使用して、実行する必要があると思われる作業のみを実行する関数を呼び出す機会が多くなります。PartialUpdateA()およびPartialUpdateB()を呼び出すFullUpdate()関数があるかもしれませんが、特定のケースでは、PartialUpdateB()を実行するだけでよいことに気付く(または考える)可能性があり、他を避けることで効率的です作業。これには多くのバグがたくさんあります。ほとんどのバグは、実行状態があなたが思っているとおりではないという結果です。