Se me ocurrió hacer una serie de consejos que a mi parecer hacen el código más sencillo. Desde el vamos comento que es mi criterio y cualquier persona es bienvenida para opinar y estar en desacuerdo. Voy a tratar de proponer siempre un ejemplo bien concreto de aplicación.
Supongamos que tenemos un sistema que trabaja con otro externo. Nuestro sistema maneja ciertas transacciones que cambian de estado en este otro. Entonces tenemos un método de consulta de estado como sigue:
public TransactionStatus QueryAndProcces(int transactionId)
{
Transaction localTransaction = this.Repository.GetById(transactionId);
if (localTransaction.Status != TransactionStatus.Complete)
{
this.Log("Consulto el estado de la transacción en el servicio externo");
TrasactionStatus newStatus = this.ExternalService.QueryStatus(transactionId);
// Múcho código complicado sobre manejo del estado una vez obtenido
return newStatus;
}
else
{
this.Log("No se busca en el servicio porque está completa");
return TransactionStatus.Complete;
}
}
Se entiende que el método realiza algún trabajo cuando recibe un nuevo estado. Eso está representado en el comentario del código.
Bien, en esta oportunidad lo que quiero proponer es usar la técnica llamada “early return”. La idea es cortar el flujo cuando sabemos que la transacción está completa. A continuación el código después de ser refactorizado:
public TransactionStatus QueryAndProcces(int transactionId)
{
Transaction localTransaction = this.Repository.GetById(transactionId);
if (localTransaction.Status == TransactionStatus.Complete)
{
this.Log("No se busca en el servicio porque está completa");
return TransactionStatus.Complete;
}
this.Log("Consulto el estado de la transacción en el servicio externo");
TrasactionStatus newStatus = this.ExternalService.QueryStatus(transactionId);
// Múcho código complicado sobre manejo del estado una vez obtenido
return newStatus;
}
Ventajas:
- Claridad. Me parece que el código escrito así deja bien claro que cuando la transacción está completa el flujo debe terminar.
- Complejidad. Si la parte del comentario es muy complicada, en el código original nos veríamos inmersos en su lógica. Cuando llegáramos al final veríamos un “else” que poco tiene que ver con el manejo del nuevo estado. Es más, con esta técnica se puede bajar un nivel la complejidad ciclomática del método.
- Legibilidad. Una vez leído el código ya he comprendido el primer “if” y no necesito releerlo para entenderlo, me alcanza con un golpe de vista. En el código original es probable que deba releer el “if” para interpretarlo y luego saber cuál es la parte que me interesa.
- Estética. Me parece más bonito XD