Refactoring Loops
Parte de la sección Lógica y Flujo del Journey de C# de Coddy — lección 16 de 66.
La refactorización de bucles puede mejorar la legibilidad y mantenibilidad del código.
Reemplaza el bucle tradicional con foreach para mayor simplicidad:
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);
}Extraer lógica compleja de bucles en métodos:
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;
}Divide bucles grandes en bucles más pequeños y enfocados:
int[] data = { 1, 2, 3, 4, 5 };
// Antes: Un bucle grande que hace múltiples cosas
for (int i = 0; i < data.Length; i++)
{
// Procesar datos
data[i] = data[i] * 2;
// Imprimir resultados
Console.WriteLine(data[i]);
}
// Después: Bucles separados con propósitos claros
// Procesar datos
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i] * 2;
}
// Imprimir resultados
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
}Desafío
IntermedioCrea un método llamado refactorArrayFilter que:
- Toma un arreglo de enteros como parámetro
- Implementa dos versiones de código que cuenten números divisibles por 3:
- Original: Usa un bucle for tradicional con una sentencia if
- Refactorizado: Usa un bucle foreach con la lógica extraída a un método auxiliar
- Devuelve la cuenta de la versión refactorizada como un entero
Por ejemplo, dado el arreglo [3, 4, 6, 7, 9], el método debería devolver 3 porque hay tres números (3, 6 y 9) que son divisibles por 3.
Nota: No necesitas imprimir nada - solo devuelve la cuenta como un entero.
Hoja de referencia
Usa foreach en lugar de bucles for tradicionales para una iteración de arrays más simple:
// 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);
}Extrae la lógica compleja de bucles en métodos auxiliares:
// 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;
}Divide bucles grandes en bucles más pequeños y enfocados con responsabilidades únicas:
// 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
}Pruébalo tú mismo
public class RefactorArrayFilter
{
// Implementa el método refactorArrayFilter
public static int refactorArrayFilter(int[] numbers)
{
// Escribe tu código aquí
}
// Implementa cualquier método auxiliar que necesites
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
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