4

我正在尝试重构一个大型的旧项目,我注意到的一件事是一系列不同的迭代器实现:

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 的一部分,因此会为更多人所熟悉。

其他的没有什么“错误”,但正如你所说,在一个项目中拥有所有这些不同的版本对任何人都没有帮助。

于 2008-12-11T12:01:46.737 回答
1

Imo,简单地使用一个或多个 SPL 库作为接口在前端使用中往往不那么难看。但是,实现背后的支持可能会有点难看。

例如,我编写了一个迭代器,它可以有效地迭代数据库结果集,因此从未请求过的结果永远不会从请求指针中获取,如果项目被过早获取(IE:$obj[5]),它会搜索所有所需的结果到一个内部缓冲区。

工作得非常好,你只是祈祷让幕后魔法永远不会失败的代码,因为当人们看到你使用看起来像数组的东西时,它会让人们感到困惑,而且它确实“魔法”可能会失败:)

魔术让人们在火刑柱上被烧死。因此,谨慎而明智地使用它,可能让它的工作原理一目了然。

我个人的偏好是

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

它的符号通常更一致和可预测。

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

}

样式符号在功能上是相同的,但至少你对它在表面上的工作方式的猜测更少。

于 2008-12-11T12:04:28.993 回答