4

私は大規模な古いプロジェクトをリファクタリングしようとしていますが、気づいたことの 1 つは、さまざまな 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
}   

または、許可するStandardPHPLibrary (SPL)イテレータでさえも

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

非常に多くの異なるイテレータ (コレクションをループするための異なる方法) を持つことは、強いコード臭のように思えます。私はすべてを SPL にリファクタリングする傾向があります。これらの Iterator の実装のいずれかに魅力的な利点はありますか?それとも純粋に個人的な好みの問題ですか?

4

2 に答える 2

9

SPL バージョンは間違いなく進むべき道です。最も読みやすいだけでなく、現在では PHP の一部になっているため、より多くの人に親しまれています。

他のバージョンに「問題」はありませんが、あなたが述べたように、これらすべての異なるバージョンを 1 つのプロジェクトに含めることは、誰の助けにもなりません。

于 2008-12-11T12:01:46.737 に答える
1

Imo では、1 つまたは複数の SPL ライブラリをインターフェイスとして使用するだけで、フロント エンドでの使用が見苦しくなる傾向があります。ただし、実装の背後にある裏づけは、少し醜いものになる可能性があります。

たとえば、データベースの結果セットを効率的に反復する反復子を作成したため、要求されなかった結果が要求ポインターからフェッチされることはなく、アイテムが途中でフェッチされた場合 (IE: $obj[ 5 ] ) 、すべて必要な結果を内部バッファーに入れます。

見事に機能しました。配列のように見えるものを使用しているのを見ると人々を混乱させ、失敗する可能性のある「魔法」を実行するため、舞台裏の魔法を作成するコードが決して失敗しないことを祈るだけです:)

魔法は人々を火あぶりにしました。したがって、慎重かつ賢明に使用し、おそらくそれがどのように機能するかを明らかにしてください。

私の個人的な好みは、

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

一般に、表記法の方が一貫性があり、予測可能です。

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

}

スタイル表記は機能的には同じですが、少なくとも表面上でどのように機能するかについて推測する必要はありません.

于 2008-12-11T12:04:28.993 に答える