Domanda

Sto cercando di refactoring un grande, vecchio progetto e una cosa che ho notato è una gamma di diverse implementazioni 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
}   

o anche il StandardPHPLibrary (SPL) iteratore che permette

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

Avere così tanti Iteratori differenti (con differenti metodi per looping sugli incassi) sembra un forte odore di codice, e io sono incline a refactoring di tutto per SPL. Esiste un vantaggio convincente per una qualsiasi di queste implementazioni di Iterator, o è semplicemente una questione di gusto personale?

È stato utile?

Soluzione

La versione SPL è sicuramente la strada da percorrere. Non solo è il più facile da leggere, ma è una parte di PHP, in modo che sarà familiare a molte più persone.

Non c'è nulla di "sbagliato" con gli altri, ma come lei ha affermato, avendo tutte queste versioni differenti in un progetto non sta aiutando nessuno.

Altri suggerimenti

Imo, semplicemente utilizzando una o più delle librerie SPL come interfaccia tende ad essere meno brutta in uso presso il front-end. Tuttavia, il sostegno dietro la realizzazione può ottenere un po 'brutto.

Per esempio, ho scritto un iteratore che in modo efficiente iterata un set di risultati di database, in modo che i risultati che non sono mai stati richiesti non sono mai stati recuperati dal puntatore richiesta, e se gli articoli fossero prematuramente inverosimile (IE: $ obj [5]), è cercherebbe tutti i risultati necessari in un buffer interno.

funzionava meravigliosamente, è solo pregare che il codice che rende la magia dietro le quinte non manca mai perché confonde la gente quando vedono si utilizza qualcosa che assomiglia a un array, e lo fa "magia", che può fare a meno:)

Magic ha persone al rogo. In modo da utilizzare con attenzione e saggezza, forse rendere evidente come funziona.

La mia preferenza personale è per il

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

notazione per è generalmente più coerente e prevedibile.

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

}

notazione stile è funzionalmente identici, ma almeno si hanno meno congetture come funziona in superficie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top