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

标签 c# oop iterator

我今天编写了我的第一个 C# 迭代器。哇哦。

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

我尝试将其实现为 LINQ 查询,但真的不喜欢 where 子句的谓词有副作用这一事实。那是一种明确的气味。

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

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

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

最佳答案

有副作用的迭代器不好吗? :)

如果你有包含所有文件的序列,你可以有一些东西 visitor -ish 访问所有项目并为每个案例调用一个函数。访客的歧视可以是您可以提供的谓词,也可以是访客固有的。

所以,我不会说 C#,而是像这样的伪代码:

good_handler = new FileHandler() {
  handle(File f) { print "Yay!"; }
}

bad_handler = new FileHandler() {
  handle(File f) { print "Nay!"; }
}

files = YourFileSequence();
visitor = new Visitor(good_handler, bad_handler);
visitor.visit(files);

关于c# - 迭代器中的副作用被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/320396/

相关文章:

ruby - 将目录表示为对象

c++ - it = map.find (element) == map.end() have it->second 是否正常?

c# - Visual Studio - 使加载项在构建后自动运行

c# - GZIP Compression Java/C# 在压缩问题上的区别

javascript - 一遍又一遍地将相同的选项传递给 jQuery 函数

reference - 将 &T 的迭代器收集到 T 集合中的惯用方法是什么?

javascript - 在所有可迭代对象上懒惰地调用过滤器、查找(数组方法)

c# - WebOperationContext.current 和 HttpContext.Current 之间的区别

c# - 未处理的异常 : System. FormatException

c++ - 将加法运算符重载为非成员函数是否更好?