Modo chiaro per saltare il primo elemento in un indice basato sul ciclo

9

Ho un ciclo for in cui devo saltare il primo elemento in un array a base zero.

Quale di questi mostra le mie intenzioni in modo più chiaro?

for($i=1 ; $i < count(array) ; $i++){
    array[$i];
}

o

for($i=0+1 ; $i < count(array) ; $i++){
    array[$i];
}
    
posta Tomas Zubiri 07.10.2016 - 18:03
fonte

9 risposte

22

Odio entrambi.

Chi ha detto che potresti usare numeri magici? Se inizierai con un offset di 1 come dire di dirci PERCHÉ stai iniziando con un offset di 1. Aggiungere uno zero altrettanto magico non mi spiega nulla.

È questo l'offset del payload? Questa è una stringa Pascal che stai convertendo in una stringa c terminata da null? Per favore, dicci cosa sta succedendo.

Mi dispiace, ma ho sprecato gran parte della mia carriera decodificando misteri inutili come questo e la mia pazienza per loro si è esaurita. una variabile con un nome decente è davvero tanto da chiedere?

Per nome decente intendo un nome che spiega PERCHÉ stiamo saltando il primo elemento. Non è qualcosa che dice semplicemente che stiamo saltando il primo elemento. Il 1 me l'ha detto per conto suo.

    
risposta data 07.10.2016 - 19:51
fonte
12

Risposta breve: la prima opzione è migliore.

La seconda opzione aggiunge solo rumore. È molto improbabile che 0 + 1 aiuti il lettore a capire che potrebbe essere stato 0 ma è 1. Molto più probabilmente sarà perplesso per un breve istante e distratto da ciò che riguarda il ciclo. Soprattutto in una lingua in cui tutti gli array partono da 0.

Come già detto, se vuoi sottolineare il fatto che il ciclo inizia da 1, non da 0, basta aggiungere un commento.

    
risposta data 07.10.2016 - 18:34
fonte
9

Non dirci che stai saltando il primo oggetto: possiamo vederlo. Ciò che non è ovvio è perché . Quindi .. se non è ovvio dal contesto, dicci perché:

// array[0] is just a header
for($i=1 ; $i < count(array) ; $i++){
    array[$i];
}

Oppure, se sei contrario al commento, qualcosa del tipo:

$lastHeaderIndex = 0;
for($i = $lastHeaderIndex + 1 ; $i < count(array) ; $i++){
    array[$i];
}

Non utilizzare commenti e trucchi per ricordarci come funziona la lingua.

    
risposta data 11.10.2016 - 20:45
fonte
6

Il tuo esempio sembra artificioso. Nel codice del mondo reale, il fatto che i loop debbano iniziare dal secondo elemento dell'array è molto probabilmente ovvio dalle seguenti linee di codice. Ad esempio, se il codice reale è simile a questo

for($i=1 ; $i < count(array) ; $i++){
    array[$i-1]=array[$i];
}

non ci sarebbe nessuna spiegazione o costrutto "0 + 1" necessario a chiarire il motivo per cui il ciclo inizia a 1 invece di 0.

Tuttavia, se il codice all'interno del ciclo non spiega le ragioni in modo così ovvio (forse array[0] ha un significato speciale e deve essere trattato diversamente dagli altri elementi), quindi aggiungere un commento esplicativo. Ma prima di farlo, pensaci due volte se puoi evitare di avere array[0] questo significato speciale e riorganizzare il codice circostante, che probabilmente sarebbe l'alternativa migliore.

    
risposta data 07.10.2016 - 22:35
fonte
5

Opzione mai vista n. 2, ma mi piace. Perché? Con l'opzione n. 1 mi chiedo se il programmatore abbia dimenticato che gli array partono da 0. L'opzione n. 2 chiarisce che stanno deliberatamente iniziando a 1.

Detto questo, è meglio in entrambi i casi aggiungere un commento perché stai saltando un elemento.

Oppure, se puoi facilmente descrivere il motivo per cui stai iniziando, usa una costante. Ad esempio, se si considerano gli argomenti della riga di comando, qualcosa di simile a

define ('FIRST_REAL_ARGUMENT', 1);
for ($i=FIRST_REAL_ARGUMENT; ...)

Personalmente, probabilmente userò un commento, YMMV.

    
risposta data 07.10.2016 - 20:05
fonte
2

Dubito che qualcuno sarebbe stato confuso dal primo. Abbiamo tutti dovuto farlo. Tanto che il secondo è molto più probabile che confondere. "Perché c'è un 0+ lì? Hanno in qualche modo scavalcato l'operatore +?"

Un compilatore decente trasformerà comunque il secondo nel primo, ma sembra che tu stia usando PHP, che viene interpretato. Quindi ogni volta che l'interprete raggiunge quel ciclo, deve effettivamente aggiungere 0 e 1. Non è un grosso problema, ma perché fare l'interprete a fare il lavoro?

    
risposta data 07.10.2016 - 18:54
fonte
2

Utilizza una variabile che spiega il punto di partenza.

Devi " saltare il primo elemento in un array a base zero ", quindi ad esempio:

skipFirstElement = 1;

for($i=$skipFirstElement ; $i < count(array) ; $i++){
    array[$i];
}
    
risposta data 11.10.2016 - 09:42
fonte
1
//We are skipping the first element because...    
if ($i==0)  
{    continue;      } 

Se uno è ossessivo con tutti i cicli che iniziano da zero, potresti usare un'istruzione continue. Aggiungi un commento al motivo per cui stai saltando poiché normalmente non lo faresti.

    
risposta data 07.10.2016 - 22:55
fonte
-2

Quello che farei è rimuovere il primo elemento prima del ciclo. Crea un nuovo array se necessario. Spiega in un commento perché lo stai facendo. E poi fai un semplice foreach.

$arrayCopy = $array; // in case you don't want to touch the original array
array_shift($arrayCopy); // removing first element because of X reason.
foreach($arrayCopy => $element) { 
    // do stuff
}

In questo modo il tuo intento è perfettamente chiaro.

Per chiarire ulteriormente, puoi avvolgere il codice in un metodo con un nome appropriato per renderlo più chiaro.

function doStuffToAllButTheFirst($array) { // this copies the original array, so there are no sideffects
    array_shift($array);
    foreach($array => $element) { // do stuff }  
}

Tuttavia tutto questo manca ancora il contesto. Cosa vuoi fare con gli elementi? Restituirai il nuovo array? Ti interessa l'originale e il nuovo array dopo doStuff() ?

Ad ogni modo, non c'è una risposta chiara qui, e decidere come rendere leggibile il codice dipende molto dal contesto.

    
risposta data 07.10.2016 - 21:19
fonte

Leggi altre domande sui tag