我想知道将算法封装到类中是多么(不)常见?更具体地说,不是使用许多单独的函数来转发彼此之间的公共参数:
void f(int common1, int param1, int *out1); void g(int common1, int common2, int param1, int *out2) { f(common1, param1, ..); }
将公共参数封装到类中并完成构造函数中的所有工作:
struct Algo { int common1; int common2; Algo(int common1, int common2, int param) { // do most of the work } void f(int param1, int *out1); void g(int param1, int *out2); };
看起来非常实用,不必通过函数参数转发常见参数和中间结果.但我还没有看到这种"模式"被广泛使用..有什么可能的缺点?
有一种设计模式可以解决这个问题; 它被称为"战略设计模式" - 你可以在这里找到一些好的信息.
关于"策略"的好处是,它允许您定义一系列算法,然后可以互换使用它们,而无需修改使用算法的客户端.
这根本不是一个糟糕的策略.实际上,如果您具有使用您的语言(在C++中执行)的能力来定义某种类型的抽象超类,它定义了底层功能的不透明接口,您可以在运行时交换不同的算法(想想排序算法,例如).如果您选择的语言具有反射,您甚至可以拥有无限可扩展的代码,允许加载和使用算法,这些算法在编写所述算法的使用者时可能根本不存在.这也允许您松散地耦合您的其他功能类和算法类,这有助于重构和在处理大型项目时保持完整性.
当然,无论何时开始构建复杂的类结构,都需要构建和维护额外的体系结构 - 因此需要代码.但是,在我看来,长远来看的好处超过了这种轻微的不便.
最后一个建议:不要在构造函数中完成工作.构造函数应该仅用于将类内部结构初始化为合理的默认值.是的,这可能包括调用其他方法来完成初始化,但初始化不是操作.这两者应该是分开的,即使它需要在您的代码中再调用一次来运行您正在寻找的特定算法.