Eu tenho um loop for, onde devo pular o primeiro elemento em uma matriz baseada em zero.
Qual destes mostra minhas intenções mais claramente?
for($i=1 ; $i < count(array) ; $i++){
array[$i];
}
ou
for($i=0+1 ; $i < count(array) ; $i++){
array[$i];
}
$i=2-1
é o caminho superior. : /foreach ($i in range(1, count))
(seja lá o que for que parece em PHP). Ou algo parecidoforeach ($item in array.skip(1))
com o que uma pessoa C # faria.Respostas:
Eu odeio os dois.
Quem disse que você poderia usar números mágicos? Se você vai começar com um deslocamento de 1, que tal nos dizer POR QUE você está começando com um deslocamento de 1. Adicionar um zero igualmente mágico não explica nada para mim.
Esse é o deslocamento da carga útil? É alguma string pascal que você está convertendo em uma string c terminada nula? Por favor, diga-nos o que está acontecendo.
Desculpe, mas perdi muito da minha carreira decodificando mistérios inúteis como esse e minha paciência com eles se esgotou. É uma variável com um nome decente realmente muito para pedir?
Por nome decente, quero dizer um nome que explica POR QUE estamos pulando o primeiro elemento. Não é algo que simplesmente diz que estamos pulando o primeiro elemento. O 1 me disse isso por conta própria.
fonte
static final int LONELIEST_NUMBER = 1
em todo o meu código Java. :-) Dito isso, pensando melhor, gostaria de cancelar sua resposta, mas não posso, a menos que você a edite. Regra tão boba?Resposta curta: a primeira opção é melhor.
A segunda opção apenas adiciona ruído. É muito improvável que 0 + 1 ajude o leitor a entender que poderia ter sido 0, mas é 1. Muito mais provavelmente ele ficará intrigado por um breve momento e distraído do significado do loop. Especialmente em um idioma em que todas as matrizes começam em 0.
Como mencionado anteriormente, se você quiser enfatizar o fato de que o loop começa em 1, não em 0, basta adicionar um comentário.
fonte
Não nos diga que você está pulando o primeiro item - podemos ver isso. O que não é óbvio é o porquê . Então .. se não for óbvio no contexto, diga-nos por que:
Ou, se você não gosta de comentar, algo como:
Não use comentários e truques para nos lembrar como o idioma funciona.
fonte
Seu exemplo parece artificial. No código do mundo real, o fato de os loops precisarem iniciar no segundo elemento da matriz é provavelmente mais óbvio nas seguintes linhas de código. Por exemplo, se o código real se parecer com isso
não haveria explicação ou construção "0 + 1" necessária para esclarecer por que o loop inicia em 1 em vez de 0.
No entanto, se o código dentro do loop não explicar os motivos de maneira tão óbvia (talvez
array[0]
tenha um significado especial e deva ser tratado de maneira diferente dos elementos restantes), adicione um comentário explicativo. Porém, antes de fazer isso, pense duas vezes se puder evitararray[0]
esse significado especial e reorganize o código ao redor, o que provavelmente seria a melhor alternativa.fonte
Nunca vi a opção 2, mas eu gosto. Por quê? Com a opção 1, gostaria de saber se o programador esqueceu que as matrizes começam em 0. A opção 2 deixa mais claro que eles estão deliberadamente começando em 1.
Dito isto, melhor nos dois casos, adicionar um comentário por que você está pulando o elemento.
Ou, se você pode descrever facilmente por que está começando uma, use uma constante. Por exemplo, se analisar os argumentos da linha de comando, algo como
Pessoalmente, eu provavelmente usaria apenas um comentário, YMMV.
fonte
Duvido que alguém se confunda com o primeiro. Todos nós tivemos que fazer isso. Tanto é assim que o segundo é muito mais provável que confunda. "Por que existe um 0+? Eles substituíram o operador + de alguma forma?"
Um compilador decente transformará o segundo no primeiro de qualquer maneira, mas parece que você está usando PHP, que é interpretado. Então, toda vez que o intérprete atingir esse loop, ele precisará adicionar 0 e 1. Não é grande coisa, mas por que fazer o intérprete fazer o trabalho?
fonte
Use uma variável que explique o ponto inicial.
Você precisa " pular o primeiro elemento em uma matriz baseada em zero ", portanto, por exemplo:
fonte
Se alguém é obsessivo com todos os loops começando em zero, você pode usar uma instrução continue. Adicione um comentário ao motivo pelo qual você está pulando, pois normalmente não o faria.
fonte
if first then skip
com um comentário dizendo o porquê. Ainda sem contexto, nenhuma das soluções é "melhor"O que eu faria é remover o primeiro elemento antes de fazer o loop. Crie uma nova matriz, se necessário. Explique em um comentário por que você está fazendo isso. E então apenas faça um foreach simples.
Dessa forma, sua intenção é perfeitamente clara.
Para esclarecer melhor, você pode agrupar o código em um método com um nome apropriado para tornar as coisas mais claras.
No entanto, tudo isso ainda está faltando no contexto. O que você quer fazer com os elementos? Você retornará a nova matriz? Você se importa com o original e o novo array depois de você
doStuff()
?De qualquer forma, não há uma resposta clara aqui, e decidir como tornar o código legível depende muito do contexto.
fonte
$array[$i-1] = $array[$i]
ou algo semelhante, conforme a resposta do @ DocBrown?1
(veja o comentário de Kevin Lee), ele não torna o código mais claro. O leitor deve entender array_shift, o que faz, como funciona. Talvez essa linha de código seja um bug? Modifica a matriz ou retorna uma nova? Ele insere um elemento ou remove um? Isso muda os índices ou não? Não vejo como o uso de um loop de base única não seria uma grande melhoria nessa função (e, devido ao nome, instantaneamente compreensível).