Come pulire un refactor Java per-if-try-catch-else tipo di codice disordinato [duplicato]

-2

Spesso mi sono imbattuto in situazioni come questa, come scrivere questo codice in modo pulito e ordinato. Un altro problema che trovo qui è la performance perché sto iterando un elenco e poi le sue proprietà.

Modifica: - mentre il suggerito come affrontare un indirizzo postale "a forma di freccia" ramificato " fa riferimento al nidificato if-elseif-if per una estensione estesa. Sto ancora cercando una risposta su come gestire più tentativi di cattura (se ce ne sono) nel codice e su come migliorare le prestazioni.

for (String item : someList) {
    IResultOne resultOne = doSomething(item);

    if (resultOne != null) {
        for (SomeObject obj :resultOne.getSomeOtherList) {
            IResultTwo resultTwo = doMegaProcessing(obj);

            if(resultTwo != null) {
                try {
                    doSomeMoreProcessing(resultTwo);
                } 
                catch (CanNotProcessingException ex) {
                    errorObj.addError("can't process reason");
                }
            } 
            else {
                errorObj.addError("item does not have {} error ");
            }
        }
    } 
    else {
        errorObj.addError("item is invalid "+item)
    }
} 
    
posta SumanP 27.06.2018 - 20:39
fonte

1 risposta

1

Per prima cosa, utilizzerei le condizioni sentinella invece di annidare quei blocchi if/else . Questo riduce il rientro e renderà il blocco di codice già più leggibile. Secondo, il blocco try/catch è probabilmente meglio refactored ad una funzione che restituisce direttamente solo la stringa di errore invece di generare un'eccezione.

In totale, questo porta a qualcosa di simile a questo:

for (String item : someList) {
    IResultOne resultOne = doSomething(item);
    if (resultOne == null) {
        errorObj.addError("item is invalid "+item)
        continue;
    }
    // ...
    for (SomeObject obj :resultOne.getSomeOtherList) {
        IResultTwo resultTwo = doMegaProcessing(obj);
        if(resultTwo == null) {
            errorObj.addError("item does not have {} error ");
            continue;
        }

        String errorText = trySomeMoreProcessing(resultTwo);
        if(errorText!=null)
            errorObj.addError(errorText);
    }
}

 String trySomeMoreProcessing(IResultTwo resultTwo) {
     try {
        doSomeMoreProcessing(resultTwo);
     } 
     catch (CanNotProcessingException ex) {
          return "can't process reason";
     }
     return null;
 }

Inoltre, prenderei in considerazione la possibilità di ridefinire parti come il ciclo interno in una funzione da sola e dare a tale funzione un nome ragionevole.

    
risposta data 27.06.2018 - 21:09
fonte

Leggi altre domande sui tag