Pergunta

Eu estou tentando refatorar um grande, projeto antigo e uma coisa que notei é uma gama de diferentes implementações Iterator:

while($iterator->moveNext()) {
    $item = $iterator->current();
    // do something with $item;
}   

for($iterator = getIterator(), $iterator->HasNext()) {
    $item = $iterator->Next();
    // do something with $item
}   

while($item = $iterator->fetch()) {
    // do something with item
}   

ou mesmo a StandardPHPLibrary (SPL) iterador que permite

foreach($iterator as $item) {
    // do something with $item
}   

Tendo tantos Iterators diferentes (com diferentes métodos para fazer loop para coleções) parece ser um cheiro de código forte, e eu estou inclinado a refactor tudo para SPL. Existe uma vantagem atraente para qualquer uma destas implementações de Iterator, ou é puramente uma questão de gosto pessoal?

Foi útil?

Solução

A versão SPL é definitivamente o caminho a percorrer. Não só é o mais fácil de ler, mas é uma parte do PHP agora, para será familiar para muitas mais pessoas.

Não há nada "errado" com os outros, mas como você disse, com todas essas versões diferentes em um projeto não está ajudando ninguém.

Outras dicas

Imo, simplesmente utilizando uma ou mais das bibliotecas SPL como uma interface tende a ser menos feio em uso na extremidade frontal. No entanto, o apoio por trás da implementação pode ficar um pouco feio.

Por exemplo, eu escrevi um iterador que eficientemente iterated um conjunto de resultados de banco de dados, para que os resultados que nunca foram solicitados nunca foi buscada a partir do ponteiro pedido, e se os itens foram prematuramente buscada (IE: $ obj [5]), ele procuraria todos os resultados requeridos para uma memória intermédia interna.

funcionou maravilhosamente, você só rezar para que o código que faz a mágica por trás das cenas nunca falha porque ele confunde as pessoas quando vêem você usar algo que se parece com um array, e isso "mágica" que pode falhar:)

Mágica tem pessoas queimado na fogueira. Para usá-lo com cuidado e sabedoria, possivelmente torná-lo óbvio como ele funciona.

A minha preferência pessoal é para o

for( $object as $i => $v ) 

notação para isso é geralmente mais consistente e previsível.

for( $dbresult->iterator() as $i => $v ){ 

}

notação estilo é funcionalmente idêntico, mas pelo menos você tem menos conjecturas como ele funciona na superfície.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top