Early Returns
Parte de la sección Lógica y Flujo del Journey de C# de Coddy — lección 18 de 66.
Los retornos tempranos son una técnica donde salimos de un método tan pronto como tenemos la respuesta o encontramos una condición inválida, en lugar de anidar condicionales.
Comparemos dos enfoques para validar un nombre de usuario:
Sin retornos tempranos (condicionales anidados):
public bool ValidateUsername(string username)
{
bool isValid = false;
if (username != null)
{
if (username.Length >= 3)
{
if (username.Length <= 20)
{
isValid = true;
}
}
}
return isValid;
}Con retornos tempranos:
public bool ValidateUsername(string username)
{
// Retornar temprano si username es null
if (username == null)
return false;
// Retornar temprano si username es demasiado corto
if (username.Length < 3)
return false;
// Retornar temprano si username es demasiado largo
if (username.Length > 20)
return false;
// Si llegamos aquí, username es válido
return true;
}Los retornos tempranos hacen que el código sea más legible y reducen los niveles de indentación.
Desafío
FácilEscribe un método llamado ProcessPayment que determine si un pago puede ser procesado basado en:
- El monto del pago debe ser positivo
- El saldo de la cuenta debe ser suficiente
- La cuenta no debe estar bloqueada
Usa retornos tempranos para verificar cada condición y retornar mensajes de error apropiados.
El método debe:
- Tomar tres parámetros:
decimal paymentAmount,decimal accountBalance, ybool isAccountLocked - Retornar una cadena con ya sea "Payment processed successfully" o un mensaje de error
- Usar retornos tempranos para la validación
Imprime mensajes de error en exactamente estos formatos:
- "Error: Payment amount must be positive"
- "Error: Insufficient funds"
- "Error: Account is locked"
Hoja de referencia
Los retornos tempranos salen de un método inmediatamente cuando se cumple una condición, evitando condicionales anidados y reduciendo la indentación.
Sin retornos tempranos (condicionales anidados):
public bool ValidateUsername(string username)
{
bool isValid = false;
if (username != null)
{
if (username.Length >= 3)
{
if (username.Length <= 20)
{
isValid = true;
}
}
}
return isValid;
}Con retornos tempranos:
public bool ValidateUsername(string username)
{
// Return early if username is null
if (username == null)
return false;
// Return early if username is too short
if (username.Length < 3)
return false;
// Return early if username is too long
if (username.Length > 20)
return false;
// If we get here, username is valid
return true;
}Los retornos tempranos hacen que el código sea más legible y reducen los niveles de indentación.
Pruébalo tú mismo
using System;
public class Program
{
public static string ProcessPayment(decimal paymentAmount, decimal accountBalance, bool isAccountLocked)
{
// Escribe tu código aquí
}
public static void Main(string[] args)
{
decimal paymentAmount = decimal.Parse(Console.ReadLine());
decimal accountBalance = decimal.Parse(Console.ReadLine());
bool isAccountLocked = bool.Parse(Console.ReadLine());
string result = ProcessPayment(paymentAmount, accountBalance, isAccountLocked);
Console.WriteLine(result);
}
}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