当前位置:  开发笔记 > 编程语言 > 正文

将算法封装到类中

如何解决《将算法封装到类中》经验,为你挑选了2个好方法。

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

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);
};

看起来非常实用,不必通过函数参数转发常见参数和中间结果.但我还没有看到这种"模式"被广泛使用..有什么可能的缺点?



1> Esteban Aray..:

有一种设计模式可以解决这个问题; 它被称为"战略设计模式" - 你可以在这里找到一些好的信息.

关于"策略"的好处是,它允许您定义一系列算法,然后可以互换使用它们,而无需修改使用算法的客户端.



2> rpj..:

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

当然,无论何时开始构建复杂的类结构,都需要构建和维护额外的体系结构 - 因此需要代码.但是,在我看来,长远来看的好处超过了这种轻微的不便.

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有