Ho cercato di rendere il mio codice più pulito e mi sono imbattuto in un problema che non so quale sia la soluzione migliore.
Questo è il codice che voglio "pulire". Si prega di tenere a mente che sto refactoring questo codice e il suo non è completo. Ho sostituito il codice con i commenti per concentrarmi sul problema di destinazione.
void Order::cancel()
{
// Check if order exists
// Start of issue ----------
Client client = getClient();
OrderState lastCancellableOrderState = client.getLastCancelOrderState();
if (lastCancellableOrderState > OrderState::Released && getState() != OrderState::Pending)
{
//throw exception"e.g. order not pending and client doesnt allow.."
}
if (getState() > lastCancellableOrderState)
{
//throw exception"e.g. client doesnt allow state to cancel order "
}
// End of issue ----------
cancelOrderLines();
setState(OrderState::Cancelled);
update();
}
Fattori come il livello di astrazione che non sono ancora sicuro di fare. Il problema che sto riscontrando è che il codice problema dovrebbe preferire i dettagli delle eccezioni su una storia più ordinata.
Il cambiamento su cui sto andando avanti è quello di spostare questo codice in un altro metodo chiamato qualcosa come isInCancellableState () che restituirebbe un bool. Quindi potrei quindi chiamarlo dall'interno della funzione cancel come:
if (!isInCancellableState())
{
throw exception e.g."order not in a cancellable state"
}
Mi piace perché sta facendo una bella domanda, e farebbe la funzione di cancellazione (penso allo stesso livello di astrazione) e puoi vedere chiaramente cosa sta succedendo e leggerlo. Il problema però è che se fallisce, perché isInCancellableState sta controllando più di una cosa, non mi dice più cosa ha fallito sotto forma di un bel messaggio di eccezione. Non è male perché è stato un fallimento, isInCancellableState è anche abbastanza pulito e si potrebbe andare in fondo a controllare i dati per vedere perché fallisce.
anche se dovessimo usare questo codice originale, se volessi semplicemente porre la domanda di isOrderCancellable, non lo avrei, quindi dovrei duplicare il codice.
Quindi questo è il mio problema, quando hai un'azione, ma hai i criteri per quell'azione, va bene perdere la granularità delle eccezioni per cambiarle in questo formato.
Qual è la soluzione migliore. Potrebbe esserci un'altra soluzione tutti insieme. Qualsiasi aiuto sarebbe apprezzato.