是否可以将算法放入类中?

Ice*_*ire 28 c++ algorithm class

我有一个复杂的算法.它使用许多变量,在初始化时计算辅助数组,并沿途计算数组.由于算法很复杂,我将其分解为几个函数.

现在,我实际上并没有看到这可能是一种习惯性的方式; 我的意思是,我只是习惯将算法作为函数.用法只是:

Calculation calc(/* several parameters */);
calc.calculate();
// get the heterogenous results via getters
Run Code Online (Sandbox Code Playgroud)

另一方面,将它放入类中具有以下优点:

  • 我不必将所有变量传递给其他函数/方法
  • 在算法开始时初始化的数组在每个函数的整个类中都是可访问的
  • 我的代码更短,(imo)更清晰

混合方式是将算法类放入源文件中,并通过使用它的函数访问它.算法的用户不会看到该类.

有没有人有宝贵的想法可以帮助我?

非常感谢你提前!

utn*_*tim 33

我有一个复杂的算法.这使用了许多变量,在初始化时计算辅助数组,并且还沿途计算数组.[...]

现在,我实际上并没有从惯用的方式看出这可能是一个类

事实并非如此,但许多人做同样的事情(我也做了几次).

不要为算法创建类,而是考虑将输入和输出转换为类/结构.

也就是说,而不是:

Calculation calc(a, b, c, d, e, f, g);
calc.calculate();
// use getters on calc from here on
Run Code Online (Sandbox Code Playgroud)

你可以写:

CalcInputs inputs(a, b, c, d, e, f, g);
CalcResult output = calculate(inputs); // calculate is now free function
// use getters on output from here on
Run Code Online (Sandbox Code Playgroud)

这不会产生任何问题,并执行相同(实际上更好)的数据分组.

  • @IceFire一般不是问题.实际上,通常认为仅对其输入进行操作而不对任何其他状态(如纯函数)进行操作的函数更容易理解和"更清晰".它们也更容易让编译器理解和优化. (2认同)

Rei*_*ica 16

我认为将算法(或者更好的是,计算)表示为类是非常惯用的.OOP中对象类的定义之一是"对该数据进行操作的数据和函数".具有输入,输出和中间数据的compex算法完美匹配此定义.

我已经多次自己完成了这项工作,它简化了(人工)代码流分析,使整个事情更易于推理,调试和测试.

  • 好答案.实际上,我可能会强调数据和算法应该成为暴露更高级逻辑的类的*实现*.例如,不是使用"二进制搜索树的算法",而是制作高级"地图"等. (3认同)
  • 我相信你错了.这是*常见的*(由模仿Java的人) - 但不是惯用的.一个类有*interface*.只有一种方法的课程是愚蠢的 - 你已经重新发明了一个功能.有状态由闭包正确表示,而不是类.现在在C++中有一个特殊的例子,因为直到最近它还不支持闭包作为语言结构,因此人们通过仿函数来处理它 - 一个接口模仿函数的结构.那(和*只*那个)是好的和惯用的. (2认同)

Jam*_*nze 6

如果客户端代码的抽象是算法,那么您可能希望保留纯粹的功能接口,而不是在那里引入其他类型.另一方面,这种功能在源文件中实现是很常见的,该源文件为内部使用定义了公共数据结构或类,因此您可能具有:

double calculation( /* input parameters */ )
{
    SupportClass calc( /* input parameters */ );
    calc.part1();
    calc.part2();
    //  etc...
    return calc.results();
}
Run Code Online (Sandbox Code Playgroud)

根据代码的组织方式,SupportClass将位于源文件中的未命名命名空间(可能是最常见的情况),或者位于"私有"标头中,仅包含在算法中涉及的源中.