Retornos anticipados
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 procesarse basándose en lo siguiente:
- El importe del pago debe ser positivo
- El saldo de la cuenta debe ser suficiente
- La cuenta no debe estar bloqueada
Usa retornos anticipados para comprobar cada condición y devolver los mensajes de error correspondientes.
El método debe:
- Aceptar tres parámetros:
decimal paymentAmount,decimal accountBalanceybool isAccountLocked - Devolver una cadena con "Payment processed successfully" o un mensaje de error
- Usar retornos anticipados para la validación
Imprime los mensajes de error exactamente con estos formatos:
- "Error: Payment amount must be positive"
- "Error: Insufficient funds"
- "Error: Account is locked"
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
1Arrays multidimensionales
Conceptos básicos de arrays 2DDeclaración e inicialización de arrays 2DAcceso a elementos de arrays 2DBucles anidados con arrays 2DArrays irregularesOperaciones comunes con matricesRepaso: arrays multidimensionales4Técnicas de control de flujo
Retornos anticipadosCláusulas de guardaSentencias de salto (goto)Break y ContinueAplanar condicionales anidados7Operadores lógicos avanzados
Evaluación de cortocircuitoOperadores lógicos condicionalesPrecedencia de operadoresRepaso: operadores avanzados2Toma de decisiones avanzada
Múltiples condicionesLógica booleana complejaComparación entre If y SwitchSentencias Switch anidadasRepaso: decisiones avanzadas5Manejo de excepciones
Fundamentos de Try-CatchTipos de excepcionesMúltiples bloques CatchTrabajo con archivosBloque FinallyUso de Using frente a Try-FinallyExcepciones personalizadasRepaso: manejo de errores3Mejoras de bucles
Rendimiento de buclesIteración de estructuras complejasCada tipo de bucleRefactorización de buclesRepaso: bucles optimizados6Manejo de valores nulos
Conceptos básicos de referencias nulasTipos de valor anulablesPatrones de comprobación de valores nulosProgramación defensivaRepaso: seguridad frente a valores nulosPractica por tu cuenta: Compilador de C# online