Refactoring Loops
CoddyのC#ジャーニー「ロジックとフロー」セクションの一部 — レッスン 16/66。
ループのリファクタリングは、コードの可読性と保守性を向上させることができます。
シンプルにするために、従来のループを foreach に置き換えます:
string[] fruits = { "apple", "banana", "cherry" };
// Before refactoring
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}
// After refactoring
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}複雑なループロジックをメソッドに抽出:
int[] numbers = { 1, 2, 3, 4, 5, 6 };
// Before refactoring
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] % 2 == 0)
{
Console.WriteLine($"{numbers[i]} is even");
}
}
// After refactoring with helper method
for (int i = 0; i < numbers.Length; i++)
{
if (IsEven(numbers[i]))
{
Console.WriteLine($"{numbers[i]} is even");
}
}
// Helper method
bool IsEven(int number)
{
return number % 2 == 0;
}大きなループを小さく、より焦点を絞ったループに分割します:
int[] data = { 1, 2, 3, 4, 5 };
// Before: One large loop doing multiple things
// 修正前:複数のことを行う1つの大きなループ
for (int i = 0; i < data.Length; i++)
{
// Process data
// データの処理
data[i] = data[i] * 2;
// Print results
// 結果の出力
Console.WriteLine(data[i]);
}
// After: Separate loops with clear purposes
// 修正後:明確な目的を持つ別々のループ
// Process data
// データの処理
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2;
}
// Print results
// 結果の出力
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
}チャレンジ
中級refactorArrayFilter という名前のメソッドを作成してください。このメソッドは:
- 整数配列をパラメータとして受け取ります
- 3で割り切れる数をカウントするコードの2つのバージョンを実装します:
- Original: 従来の for ループと if 文を使用
- Refactored: foreach ループを使用し、ロジックをヘルパーメソッドに抽出
- リファクタリング版からのカウントを整数として返します
例えば、配列 [3, 4, 6, 7, 9] が与えられた場合、メソッドは 3 を返すべきです。なぜなら、3 で割り切れる 3 つの数(3、6、9)があるからです。
注意: 何も出力する必要はありません - カウントを整数として返してください。
チートシート
foreach を使用して、従来の for ループの代わりに配列のイテレーションをより簡単に実行してください:
// Traditional for loop
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}
// Refactored with foreach
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}複雑なループロジックをヘルパーメソッドに抽出してください:
// Before refactoring
if (numbers[i] % 2 == 0)
{
Console.WriteLine($"{numbers[i]} is even");
}
// After refactoring with helper method
if (IsEven(numbers[i]))
{
Console.WriteLine($"{numbers[i]} is even");
}
// Helper method
bool IsEven(int number)
{
return number % 2 == 0;
}大規模なループを、単一の責任を持つ小さな焦点を絞ったループに分割してください:
// Before: One loop doing multiple things
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2; // Process
Console.WriteLine(data[i]); // Print
}
// After: Separate loops with clear purposes
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2; // Process only
}
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]); // Print only
}自分で試してみよう
public class RefactorArrayFilter
{
// refactorArrayFilterメソッドを実装してください
public static int refactorArrayFilter(int[] numbers)
{
// ここにコードを記述してください
}
// 必要なヘルパーメソッドを実装してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety