我有一个复杂的算法.它使用许多变量,在初始化时计算辅助数组,并沿途计算数组.由于算法很复杂,我将其分解为几个函数.
现在,我实际上并没有看到这可能是一种习惯性的方式; 我的意思是,我只是习惯将算法作为函数.用法只是:
Calculation calc(/* several parameters */); calc.calculate(); // get the heterogenous results via getters
另一方面,将它放入类中具有以下优点:
我不必将所有变量传递给其他函数/方法
在算法开始时初始化的数组在每个函数的整个类中都是可访问的
我的代码更短,(imo)更清晰
混合方式是将算法类放入源文件中,并通过使用它的函数访问它.算法的用户不会看到该类.
有没有人有宝贵的想法可以帮助我?
非常感谢你提前!
我认为将算法(或者更好的是,计算)表示为类是非常惯用的.OOP中对象类的定义之一是"对该数据进行操作的数据和函数".具有输入,输出和中间数据的compex算法完美匹配此定义.
我已经多次自己完成了这项工作,它简化了(人工)代码流分析,使整个事情更易于推理,调试和测试.
我有一个复杂的算法.这使用了许多变量,在初始化时计算辅助数组,并且还沿途计算数组.[...]
现在,我实际上并没有从惯用的方式看出这可能是一个类
事实并非如此,但许多人做同样的事情(我也做了几次).
不要为算法创建类,而是考虑将输入和输出转换为类/结构.
也就是说,而不是:
Calculation calc(a, b, c, d, e, f, g); calc.calculate(); // use getters on calc from here on
你可以写:
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
这不会产生任何问题,并执行相同(实际上更好)的数据分组.
如果客户端代码的抽象是算法,那么您可能希望保留纯粹的功能接口,而不是在那里引入其他类型.另一方面,这种功能在源文件中实现是很常见的,该源文件为内部使用定义了公共数据结构或类,因此您可能具有:
double calculation( /* input parameters */ ) { SupportClass calc( /* input parameters */ ); calc.part1(); calc.part2(); // etc... return calc.results(); }
根据代码的组织方式,SupportClass
将位于源文件中的未命名命名空间(可能是最常见的情况),或者位于"私有"标头中,仅包含在算法中涉及的源中.