【发布时间】:2016-02-19 13:32:36
【问题描述】:
我正在用 C 语言构建一个库,该库中的一个函数类似于:
void myFunction(double *inPtr, double start, double step, double *outPtr, int N, t_shape shape)
{
int i;
switch (shape) {
default:
case ShapeLinear:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) = *(inPtr++) * start;
start += step;
}
/* more stuff going on */
break;
case ShapeExponential:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) = *(inPtr++) * start;
start *= step;
}
/* more stuff going on */
break;
case ShapeSquared:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) = *(inPtr++) * start * start;
start += step;
}
/* more stuff going on */
break;
case ShapeCubed:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) = *(inPtr++) * start * start * start;
start += step;
}
/* more stuff going on */
break;
}
}
这是一个简化版本,仅用于演示。
库中的实际函数有更多的案例,每个案例都更长,更复杂。
现在我想创建一个完全相同的函数的另一个版本,唯一的区别是我想添加和分配 它。
void myFunctionAdd(double *inPtr, double start, double step, double *outPtr, int N, t_shape shape)
{
int i;
switch (shape) {
default:
case ShapeLinear:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) += *(inPtr++) * start;
start += step;
}
/* more stuff going on */
break;
case ShapeExponential:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) += *(inPtr++) * start;
start *= step;
}
/* more stuff going on */
break;
case ShapeSquared:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) += *(inPtr++) * start * start;
start += step;
}
/* more stuff going on */
break;
case ShapeCubed:
/* more stuff going on */
for (i = 0; i < N; i++) {
*(outPtr++) += *(inPtr++) * start * start * start;
start += step;
}
/* more stuff going on */
break;
}
}
正如我所说,我正在处理的真正功能更长、更复杂,因此必须将相同的代码重写两次确实是我不想做的事情。
这将是一种糟糕的编程习惯,并且更难以维护。
是否有 C 编程技术来处理这个问题?
块(闭包)在这种情况下有用吗?
我需要以某种方式重构代码吗?
你会如何解决这个问题?
【问题讨论】:
标签: c operators semantics code-reuse