Mi piacerebbe capire meglio le decisioni sul design di Iterator / Range (concentrandomi su InputIterators).
Fondamentalmente, questo è il modello java:
while (iter.hasNext()) {
Object o = iter.next();
// do something with o
}
Ma ecco una citazione di James Kanze:
Not that Java's iterators are perfect, either. The merge access and incrementing---as did the USL iterators. By the time Java was being developed, we'd already established that this wasn't a good idea, so it's hard to understand why they did it.
Afferma che la fusione dell'accesso e dell'incremento non è una buona idea. Stavo cercando di scoprire il "perché", ma non ho trovato nulla.
L'iteratore "fisso" assomiglia a questo (che è l'iteratore GoF):
while (!iter.isDone()) {
Object o = iter.element();
// do something with o
iter.next();
}
Per C ++ 1z, potremmo avere il nuovo modello di gamma. Per InputRange, end()
potrebbe restituire un tipo sentinella speciale, quindi la gestione della condizione di fine flusso può essere ottimizzata in modo ottimale.
Ora, supponiamo di voler creare un InputRange (che è un intervallo leggero: non memorizza l'elemento di lettura), che legge le righe da un file / socket. Qui, la condizione di fine flusso viene scoperta solo dopo aver provato a leggere. Un modello iteratore "ottimale" potrebbe essere questo:
string line;
while (iter.getNext(line)) { // getNext returns false at end-of-stream
// do something with line
}
Questo iteratore differisce da uno qualsiasi dei precedenti.
Le mie domande sono:
- quali sono gli aspetti negativi dell'accesso di Java + modello di iteratore incrementale (puoi dare un esempio di questo)?
- è possibile implementare l'iteratore leggero desiderato con uno dei tipi di iteratore menzionati (java / GoF / C ++)? In caso contrario, quali sono i vantaggi degli altri modelli iteratori, quindi non viene utilizzato il mio modello iteratore "ottimale"? O in altre parole, quali possono essere gli aspetti negativi del mio modello iteratore "ottimale", quindi non viene generalmente utilizzato?