概括
将纯函数拆分为描述算法的被动对象和可以执行这些算法的主动对象有什么优缺点?请注意,由于函数没有副作用,这种情况大大简化了。
细节
我正在编写的代码部分(在 Python 3 中)将在很大程度上遵循函数式编程。
有一些(不可变的)数据。有一些算法。我需要将这些算法应用于数据,并得到结果。
算法可以表示为常规函数,这些函数将使用标准操作进行转换(例如,我可以组合两个函数,然后使用 冻结一些参数functools.partial
,然后将结果函数作为参数传递给另一个函数)。出于性能原因,许多较低级别的函数将被记忆。
但是我想到了一个想法,也许我应该将算法表示为被动对象。这样的对象自己将无法执行任何操作。当我准备好执行时,我会将算法对象和它期望的所有输入提供给一个特殊的“计算”对象。这将更好地匹配我对算法的心理模型,但我担心我可能会遗漏这种方法的一些问题。
算法对象可以以多种方式实现;也许甚至可以允许多个实现。假设我的算法是抽象类算法的实例;那么它的子类可以代表:
- 我将创建的特定领域语言的文本字符串
- 我将构建的某种执行树
- 甚至是常规的 Python 函数
我以前从未这样做过,所以我想就这个想法得到一些反馈。除了我的主观感觉它更“自然”之外,它是否提供任何真正的设计优势?它会导致任何问题吗?