使用纤程简化枚举器2:对调用者友好的一种实现

使用纤程简化枚举器2:对调用者友好的一种实现

作者:BlogUpdater |  时间:2022-02-22 |  浏览:233 |  评论已关闭 条评论

在上一篇文章中,我们演示了一个枚举器的实现者(生产者)如何编写代码来实现一个目录树结构的枚举。在今天的文章中,我们来看看从消费者的角度如何实现一个简单的枚举器,直接看下图:

在这个设计下,枚举器会循环输出文件,调用者可以告诉枚举器,何时移动到下一个,也可以指示枚举器跳过某个目录。

值得注意的是,上述代码中,并没有定义FER_STOP。 如果消费者想要停止枚举,它只需要停止调用Next()。

通过这种设计,我们计算每个目录的大小的测试函数将会非常简单,如下图所示:

当然,这种设计将所有工作都放在了枚举器上。 调用者不是让生产者遍历树并在找到内容时调用回调,而是调用者自己反复调用 Next(),每次枚举器都必须找到下一个文件并返回它。 由于枚举器返回,它不能将其状态存储在调用堆栈中; 相反,它必须使用堆栈数据结构来手动模拟调用堆栈。

下面我们来看看枚举器代码的实现,看起来会有些复杂:


正如你所看到的,简单的递归函数变成了上图中的可怕的状态机管理。
如果我们可以两者兼得,那不是很好吗? 调用者会看到一个简单的枚举器,它会吐出文件(或目录)。 但是枚举器会接收一个回调,它可以将文件放入其中。

我们后面会进行改造改造,让世界变得更美好一些。

总结
我就想编写简单的代码,可不可以。
可以,但你需要明白:总有人替你负重前行。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Using fibers to simplify enumerators, part 2: When life is easier for the caller》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。