Il modo migliore per codificare le azioni e i loro criteri / controlli

1

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.

    
posta Matster2 30.03.2018 - 16:51
fonte

1 risposta

-1

Scusa se il mio C ++ si rivela un po 'arrugginito da qualche parte, ma questo potrebbe essere un buon caso per lasciare che questo tipo di informazione (per esempio, il motivo dell'errore di cancellazione) - per il tuo Ordine :: cancel ()' s conoscenza mantenendo la separazione delle preoccupazioni sul posto - grazie a qualcosa sulla falsariga di, ad esempio:

void Order::cancel()
{
    // Check if order exists

    // Start of issue ----------
    Client client = getClient();

    CancellationException cancellationException = queryForCancellationException();
    if (cancellationException != NULL)
    {
        throw cancellationException;
    }

    cancelOrderLines();

    setState(OrderState::Cancelled);
    update();
}

CancellationException Order::queryForCancellationException()
{
    OrderState lastCancellableOrderState = client.getLastCancelOrderState();

    if (lastCancellableOrderState > OrderState::Released && getState() != OrderState::Pending)
    {
        return new CancellationException("order not pending and client doesnt allow");
    }

    if (getState() > lastCancellableOrderState)
    {
        return new CancellationException("client doesnt allow state to cancel order");
    }

    return NULL;
}

'Spero che questo aiuti.

    
risposta data 30.03.2018 - 18:24
fonte

Leggi altre domande sui tag