Comunicazione dei dettagli del risultato del metodo?

1

Ho un codice come questo (pseudocodice)

foreach(Box box in boxes)
{
    if(boxFilter.PassesFilter(box))
    {
      // do something useful
    }
    else
    {
      Log.Log(format("Box %s was rejected", box.BoxId))
    }
}

Ma ora penso che mi piacerebbe che il messaggio di registro avesse più informazioni come "Riquadro 1 rifiutato perché troppo alto" o "Riquadro 549 respinto: altezza 25" supera l'altezza massima di 24 "".

Qual è l'idioma migliore per ottenere queste informazioni nel registro? Devo creare un oggetto FilterResult che viene restituito dal metodo PassesFilter ? O credo che potrei anche lanciare un'eccezione e prenderla e registrarla? O qualcos'altro?

Mi capita di usare C ++.

Aggiorna

Oltre alla registrazione, potrei voler anche presentare un messaggio all'utente nell'interfaccia utente.

    
posta User 09.03.2012 - 00:55
fonte

3 risposte

2

Posso vedere due opzioni principali qui; potrebbe essere restituito un enum o potresti usare un'eccezione.

Personalmente, userei un'eccezione, ma non sono un programmatore C ++ di esperienza, quindi non sono sicuro che si adatti all'idioma comune della lingua.

    
risposta data 09.03.2012 - 01:19
fonte
1

In definitiva, la registrazione è strumentazione; qualcosa di un po 'più umano del debugging di simboli o strumentazione di profilazione; la registrazione non dovrebbe avere un effetto sul flusso del programma, dovrebbe solo riportare fedelmente su di esso.

Do I have to create a FilterResult object that is returned from the PassesFilter method?

Se vuoi registrare a quel livello, allora dovrebbe essere il metodo PassesFilter che registra effettivamente un messaggio. Per associare il risultato del filtro a una casella particolare, basta emettere un messaggio di registro con l'identificatore di casella appena prima (o dopo) il metodo di filtro viene chiamato. Spetta al sistema di registrazione associare i due messaggi e fare qualcosa di elaborato con loro, oppure no.

Or I guess I could also throw an exception and catch it and log it?

Non lo farei; Almeno, non ai fini della registrazione. Le eccezioni sono grandi, se rappresentano un flusso di programma significativo. È anche possibile impostare le eccezioni in un file di registro, ma la procedura per creare un'eccezione ai fini della strumentazione non renderà il tuo codice migliore.

bool BoxFilterClass::PassesFilter(const Box & box){
    if (box.height > BoxFilterClass::MAX_HEIGHT) {
        Log.Debug(format("Box %s to tall, expected %s, actual: %s", box.id, BoxFilterClass::MAX_HEIGHT, box.height));
        return false;
    }
    else if (box.weight > BoxFilterClass::MAX_WEIGHT) {
        Log.Debug(format("Box %s to heavy, expected %s , actual: %s", box.id, BoxFilterClass::MAX_WEIGHT, box.weight));
        return false;
    }
    // and so on
    return true;
}
    
risposta data 09.03.2012 - 01:59
fonte
0

Per queste situazioni, puoi creare una classe Response con un elenco di avvisi, errori e messaggi di informazione.

In questo modo, puoi continuare ad aggiungere errori a questa risposta e restituirla al chiamante.

Inoltre non devi aggiungere codice in tutti i metodi per la registrazione degli errori. In un livello superiore (chiamante facciata), puoi aggiungere un controllo che se la risposta contiene errori o avvisi, puoi registrarli tutti.

Qualcosa di simile a questo (pseudo)

Risposta di classe pubblica {

List<String> errors;
List<String> warnings;
List<String> infos;

}

Nel tuo codice

foreach(Box box in boxes)
{
    if(boxFilter.PassesFilter(box))
    {
      // do something useful
    }
    else
    {
      response.addError(format("Box %s was rejected", box.BoxId))
      return response;
    }
}

--- In un livello più alto per tutti i chiamanti

If(response.hasErrors or warnings) {

logger.log(response.getErrors());
logger.log(response.getWarnings());


}
    
risposta data 09.03.2012 - 21:17
fonte

Leggi altre domande sui tag