假设我有变量counter
。如果我需要:
- 从代码中的许多地方访问和修改变量
- 确保以"正确"的方式修改变量,
这个解决方案是足够的,还是有更有效/更干净的方法?
int counter_access(int value) {
static int counter = 0;
if (value > 100) {
printf("there is a bug in the code");
return counter;
}
counter += value;
return counter;
}
然后当我需要修改变量时:
counter_access(10); /* increase counter by 10 */
counter_access(-2); /* decrease counter by 2 */
当我需要访问变量:
if (counter_access(0) == 100) do_something();
这个解决方法在我看来相当笨拙。然而,我想不出很多好的方法来做到这一点。我可以使用全局变量(这会导致bug)。我可以将counter
的地址传递给需要它的函数,但这并不能确保变量不会以不正确的方式被修改(在上面的例子中,如果counter
增加了100以上,则存在错误)。
从本质上讲,使用函数访问变量的问题在于,没有一种令人满意的方法来告诉调用者该值是不正确的。
对于单线程程序来说,使用单个函数是一个很好的选择,您只需要以适当的方式设置。
可以使用一些"out of the range"的值来表示出错了。在您的情况下,计数器范围是0 ..100 .
你可以这样写:
#define COUNT_OVERFLOW -1
#define COUNT_UNDERFLOW -2
#define counter_get() counter_add(0)
int counter_add(int incr)
{
static int counter = 0;
int counter_temp;
counter_temp = counter +incr;
if (counter_temp < 0) return COUNT_UNDERFLOW;
if (counte_temp > 100) return COUNT_OVERFLOW;
counter = counter_temp;
return counter;
}
现在,要检测错误,您可以检查返回值是否为<0:
cnt = counter_add(x);
if (cnt < 0) {
fprintf(stderr,"There is a bug in the coden");
}
....
if (counter_get() == 100) {
printf("DONE!n");
}
注意,即使出现错误,counter
的值也会保留。此外,最好不要让像counter_access()
这样的函数打印错误消息,最好检查返回值并让调用者打印它(如果有这种倾向)。
我添加了宏counter_get()
,以避免让用户记住添加0有返回当前计数器值的副作用。
如前所述,在更复杂的情况下不应该使用静态变量(或等价的全局变量)。在这些情况下,正确的方法是为每个线程建立一个struct
,并保留与该线程状态相关的变量。你必须传递一个指向该结构体的指针,并让counter_access()
函数接受它作为参数。
仔细观察,您可以看到这里我们试图模仿封装数据和操作的面向对象方法。在本例中,我们(隐式地)实现了对象(计数器)的单个实例,该实例有两个方法:一个用于更改值,一个用于获取值。