科学计算中使用的许多算法具有与数学密集程度较低的软件工程形式中通常考虑的算法不同的固有结构。特别是,个别数学算法往往非常复杂,通常涉及数百或数千行代码,但仍然不涉及任何状态(即不作用于复杂的数据结构)并且通常可以归结为 - 就编程而言接口——作用于一个(或两个)数组的单个函数。
这表明一个函数,而不是一个类,是科学计算中遇到的大多数算法的自然接口。然而,这个论点对于如何处理复杂的多部分算法的实现几乎没有提供任何见解。
传统的方法是简单地让一个函数调用许多其他函数,并在此过程中传递相关参数,而 OOP 提供了一种不同的方法,其中算法可以封装为类。为了清楚起见,通过将算法封装在一个类中,我的意思是创建一个类,其中将算法输入输入到类构造函数中,然后调用公共方法来实际调用算法。C++ 伪代码中多重网格的这种实现可能如下所示:
class multigrid {
private:
x_, b_
[grid structure]
restrict(...)
interpolate(...)
relax(...)
public:
multigrid(x,b) : x_(x), b_(b) { }
run()
}
multigrid::run() {
[call restrict, interpolate, relax, etc.]
}
那么我的问题如下:与更传统的没有课程的方法相比,这种做法的优点和缺点是什么?是否存在可扩展性或可维护性的问题?需要说明的是,我不是打算征求意见,而是为了更好地理解采用这种编码实践的下游影响(即,在代码库变得非常大之前可能不会出现的影响)。