Devo spostare le attività che sono solo per un elemento specifico solo per ciclo chiuso?

2

Ad esempio, ho un ciclo for, che l'elemento 0 ha una funzione aggiuntiva da eseguire rispetto ad altri elementi, la mia domanda è, se la funzione aggiuntiva è:

1.place inside for loop

for(int i=0;i<this.arr.length;i++){
    this.arr[i].a();
    if(i==0){
      this.arr[i].b();
    }
}

2.handle separatamente da loop

this.arr[0].a();
this.arr[0].b();
for(int i=1;i<this.arr.length;i++){
    this.arr[i].a();
}

quale dovrei usare?

    
posta mmmaaa 28.08.2018 - 05:39
fonte

2 risposte

5

C'è un'enorme differenza in entrambi i frammenti di codice: se this.arr.length è 0 allora l'opzione 1 funziona come progettato, mentre l'opzione 2 fallisce nel tentativo di eseguire operazioni su elementi non esistenti.

L'opzione 2 sarebbe un'alternativa solo se aggiungi un controllo preliminare per verificare se la condizione del ciclo non è falsa dall'inizio. Puoi farlo solo se è garantito che l'espressione non abbia effetti collaterali.

In considerazione dei rischi di introdurre inavvertitamente alcuni bug durante l'ottimizzazione manuale, ti consiglio di mantenere l'opzione 1.

Premature optimization is the root of all evil
- Donald Knuth

Inoltre, penso che l'opzione 1 comunichi meglio gli intenti: l'opzione corretta 2 ha la metà della sua dichiarazione per ottimizzare l'elaborazione della prima iterazione, in modo che il futuro manutentore debba pensarci due volte se mai lui / lei ha per cambiare le istruzioni interne del ciclo.

    
risposta data 28.08.2018 - 14:06
fonte
0

A mio avviso, dovresti usare l'opzione 2 ogni volta che è possibile, ma con un piccolo aggiustamento se ciò porta allo stesso risultato. Vorrei rimuovere la chiamata a .a () per il primo elemento e far iniziare il ciclo all'indice 0.

if (this.arr.length > 0)
{
    this.arr[0].b();
}
for(int i=0;i<this.arr.length;i++){
    this.arr[i].a();
}

Se questo cambia il comportamento, potrebbe essere possibile spostare la chiamata a .b () per l'elemento 0, quindi è dopo il ciclo for.

Prima di tutto, questo rende il tuo codice più facile da leggere. Esegui chiaramente qualcosa sul primo elemento dell'array quando quell'istruzione non è in un ciclo for per quell'array, perché tutte le informazioni che lo rendono chiaro si trovano su una riga di codice. L'indice 0 e l'esecuzione del metodo sono sulla stessa riga. Se si usasse l'opzione 1, le informazioni sarebbero divise su due righe. L'istruzione if contiene le informazioni che stai cercando di fare qualcosa con l'elemento indice 0 e l'esecuzione del metodo sarebbe su una linea diversa.

Inoltre, il fatto che tu abbia bisogno di un'istruzione if nell'opzione 1, aggiunge alla complessità del codice.

Un motivo secondario per questo è la prestazione. Nel tuo esempio, questo non è un fattore dato che stai confrontando solo una variabile int con una costante, ma voglio includerla qui in quanto gli esempi sono facilmente estrapolati in scenari molto più complessi, nel qual caso le prestazioni potrebbero diventare un fattore significativo .

    
risposta data 28.08.2018 - 10:20
fonte

Leggi altre domande sui tag