Early Returns
Parte da seção Lógica & Fluxo do Journey de C# da Coddy — lição 18 de 66.
Os retornos antecipados são uma técnica na qual saímos de um método assim que obtemos a resposta ou encontramos uma condição inválida, em vez de aninhar condicionais.
Vamos comparar duas abordagens para validar um nome de usuário:
Sem retornos antecipados (condicionais aninhados):
public bool ValidateUsername(string username)
{
bool isValid = false;
if (username != null)
{
if (username.Length >= 3)
{
if (username.Length <= 20)
{
isValid = true;
}
}
}
return isValid;
}Com retornos antecipados:
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;
}Retornos antecipados tornam o código mais legível e reduzem os níveis de indentação.
Desafio
FácilEscreva um método chamado ProcessPayment que determina se um pagamento pode ser processado com base em:
- O valor do pagamento deve ser positivo
- O saldo da conta deve ser suficiente
- A conta não deve estar bloqueada
Use retornos precoces para verificar cada condição e retornar mensagens de erro apropriadas.
O método deve:
- Receber três parâmetros:
decimal paymentAmount,decimal accountBalanceebool isAccountLocked - Retornar uma string com "Payment processed successfully" ou uma mensagem de erro
- Usar retornos precoces para validação
Imprima mensagens de erro exatamente nestes formatos:
- "Error: Payment amount must be positive"
- "Error: Insufficient funds"
- "Error: Account is locked"
Folha de consulta
Os retornos antecipados saem de um método imediatamente quando uma condição é atendida, evitando condicionais aninhadas e reduzindo a indentação.
Sem retornos antecipados (condicionais aninhadas):
public bool ValidateUsername(string username)
{
bool isValid = false;
if (username != null)
{
if (username.Length >= 3)
{
if (username.Length <= 20)
{
isValid = true;
}
}
}
return isValid;
}Com retornos antecipados:
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;
}Os retornos antecipados tornam o código mais legível e reduzem os níveis de indentação.
Experimente você mesmo
using System;
public class Program
{
public static string ProcessPayment(decimal paymentAmount, decimal accountBalance, bool isAccountLocked)
{
// Escreva seu código aqui
}
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
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