我正在实现一个将对一组图像执行计算的类。但是,算法有一些参数。我还计划构建一个MATLAB接口来使用该类,并使用MATLAB进行计算。
我想知道如何更好地设计类,以及在调用成员函数或将它们作为类属性存储在类中时是否更好地传递参数。这是我在C ++中的高级设计:
class ComputationClass {
public:
ComputationClass(InfrastructureClass cl);
std::vector<float> computation_algorithm_1(std::vector<float> data);
std::vector<float> computation_algorithm_2(std::vector<float> data);
private:
InfrastructureClass cl_;
float computation_part_for_both_functions(std::vector<float> data);
};
该类需要另一个类的对象,该对象将一部分计算作为API执行。我无权访问其他类,我只是做了一些请求等等。
现在,两种计算算法(computation_algorithm_1
和computation_algorithm_2
)都有一组常见的参数。例如:
size_t max_allowed_iterations
float stopping_criterion
int power_of_Q
(提升其中一个算法参数的能力但是第二个算法有两个额外的参数,float step
定义每次迭代改变结果的程度,bool preprocess
定义是否需要预处理。这些算法彼此完全不同,但它们通过使用float computation_part_for_both_functions()
函数具有一些共同的功能。他们遵循相同的想法,但他们有不同的步骤。
set
和get
函数。在调用算法之前,用户(来自C ++或MATLAB API)必须有set
个参数。问题是这些函数接收的参数列表可能会在不久的将来发生变化,并且可能会添加更多参数。
编辑:我正在考虑提供一些public
嵌套类或struct
,以便我可以将我需要的参数传递给函数,因为你不能跳过C ++中的默认参数,但是我做了不知道这是不是一个好的设计。
答案 0 :(得分:2)
回答标题中的问题: 从计算的角度来看,如果你使用函数参数或类字段,我会说没关系。两者都同样有效。
然而,有一些边缘情况,其中一个或另一个有优势。this
,然后访问this->parameter
vs。 access {{ 1}}在堆栈上)。在这里,函数参数可能更好。在两种边缘情况下,如果核心算法非常快,它只会产生可测量的差异,主要的计算时间用于递归或访问参数。
如果有疑问,我更喜欢功能参数,因为它们更直观。 (这当然是完全主观的。但我也习惯于函数式编程以及R,其中参数很少在单独的状态变量中设置。)
如果您有许多参数,可以考虑使用类字段(或单独的parameter
)。然后,功能签名可能看起来很难看:
struct parameters
但是,如果使用类字段,则会在某处定义相同的参数集。因此,也可以重新格式化签名:
return_type algorithm(int parameter1, double parameter2, int parameter3, int parameter4, int parameter5, double parameter6, int parameter7, int parameter8, bool parameter9, double parameter10, bool parameter11, double parameter12, int parameter13, double parameter14, int parameter15, int parameter16, bool parameter17, double parameter18, int parameter19, double parameter20, int parameter21, int parameter22, bool parameter23, double parameter24)
要考虑的另一点(从代码维护的角度来看)是将参数传递给各种子例程。然后,拥有一个紧凑的return_type algorithm(
int parameter1,
double parameter2,
int parameter3,
int parameter4,
…)
对象可能肯定会更好。
从用户界面的角度来看,用户将参数传递给函数肯定更方便直观。但是,这不会阻止您在类中设置字段。但我只想补充一点这一点。
正如您在评论中所说,许多参数都有可选值;并且在C ++中不可能定义可选参数的任意子集。 由于您的函数是从Matlab调用的,我只是建议在Matlab中编写一个简单的包装器来处理所有可选参数,然后使用完整的集合调用C ++函数。