design-patterns - 将算法封装到一个类中

标签 design-patterns coding-style class-design

我想知道将算法封装到一个类中有多常见?更具体地说,不是有许多单独的函数在彼此之间转发公共(public)参数:

void f(int common1, int param1, int *out1);
void g(int common1, int common2, int param1, int *out2)
{
  f(common1, param1, ..);
}

将公共(public)参数封装到一个类中,并在构造函数中完成所有工作:
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);
};

不必通过函数参数转发公共(public)参数和中间结果似乎非常实用。但我还没有看到这种“模式”被广泛使用。可能的缺点是什么?

最佳答案

这根本不是一个坏策略。事实上,如果你有能力用你的语言(你在 C++ 中这样做)定义某种类型的抽象父类(super class),它为底层功能定义了一个不透明的接口(interface),你可以在运行时交换不同的算法(想想排序算法,例如)。如果您选择的语言具有反射功能,您甚至可以拥有无​​限可扩展的代码,允许加载和使用在编写所述算法的使用者时甚至可能不存在的算法。这也允许您松散地耦合您的其他功能类和算法类,这有助于重构和在处理大型项目时保持您的理智完好无损。

当然,无论何时你开始构建一个复杂的类结构,都会有额外的架构——因此也就是代码——需要构建和维护。但是,在我看来,从长远来看,好处超过了这种轻微的不便。

最后一个建议:不要在构造函数中做你的工作。构造函数只能用于将类内部结构初始化为合理的默认值。是的,这可能包括调用其他方法来完成初始化,但初始化不是操作。这两者应该是分开的,即使它需要在您的代码中再调用一次来运行您正在寻找的特定算法。

关于design-patterns - 将算法封装到一个类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/153974/

相关文章:

python - 指向另一个对象的属性并添加你自己的

c# - 静态工厂 - 好的做法吗?

java - JUnit 测试和 Google Guice

c# - WinForms - DataGridView 从 GroupBox 继承样式

java - 为了在 JavaFX 中的 ImageView 上进行转换

python - 使用样式解包多行

python - 在 emacs 中强制每行 79 个字符?

c# - 在一个文件中包含多个类定义是一种好习惯吗?

c++ - 将功能放入 API 或让开发人员自己制作的标准

python - 在 Python 中查找类的静态属性