迭代器中的副作用被认为是有害的?

5 c# oop iterator

我今天写了我的第一个C#迭代器.哇噢.

有趣的是,它有副作用.我的迭代器从目录中过滤掉无效文件,并返回一系列要处理的有效文件.当它遇到一个invlaid文件时,它会将它移动到另一个目录.

我尝试将其实现为LINQ查询,但实际上并不喜欢where子句的谓词具有副作用的事实.那是一种确定的气味.

我可以明确地实现它,循环遍历所有文件并依次处理好坏,但它不是很优雅.更好的解决方案是将其拆分为两个列表(好的和坏的)并依次处理每个列表.

但后来我想起了迭代器.我现在有一个迭代器,它产生有效的文件并处理(移动)无效的文件.

所以,我的问题是:迭代器有这样的副作用是不是一个坏主意?我是否在迭代器中隐藏了太多功能?

Jon*_*eet 3

我想说,在迭代器中产生副作用通常是一个坏主意,但这并不是完全禁止的。如果有副作用,调用者就很难/不可能以纯功能性的方式工作。根据您的使用情况,这可能是问题,也可能不是问题。

我建议您有两种获取迭代器的方法 - 一种有副作用(基本上可能是一种优化),另一种没有副作用(速度较慢,但​​更容易推理)。这可能只是通过将一个标志传递到该方法中,或者让两个方法以不同的方式命名。