尽管我知道可以使用多个参数,但我只是想知道是否建议使用多个参数,我的意思是多个〜20。我的几个函数将使用约20个参数。
我正在用这些替换全局变量,是否可以使用任何选项。但是,我们不允许使用数组。
示例代码:(鉴于给定的代码,它返回一个项目的数量,我认为实现此功能是主要功能,但这并不理想,因为我需要多次getItemQty代码。
long getItemQty (int nItemCode, int* lQty1001, int* lQty1002, int* lQty1003, int* lQty1004, int* lQty1005, int* lQty1006, int *lQty1007, int* lQty2001, int* lQty2002, int* lQty2003, int* lQty2004, int* lQty2005, int* lQty2006, int *lQty2007, int* lQty3001, int* lQty3002, int* lQty3003, int* lQty3004, int* lQty4001, int* lQty4002, int* lQty4003, int* lQty4004, int* lQty4005, int* lQty4006) {
switch (nItemCode) {
case 1001: return *lQty1001;
case 1002: return *lQty1002;
case 1003: return *lQty1003;
case 1004: return *lQty1004;
case 1005: return *lQty1005;
case 1006: return *lQty1006;
case 1007: return *lQty1007;
case 2001: return *lQty2001;
case 2002: return *lQty2002;
case 2003: return *lQty2003;
case 2004: return *lQty2004;
case 2005: return *lQty2005;
case 2006: return *lQty2006;
case 2007: return *lQty2007;
case 3001: return *lQty3001;
case 3002: return *lQty3002;
case 3003: return *lQty3003;
case 3004: return *lQty3004;
case 4001: return *lQty4001;
case 4002: return *lQty4002;
case 4003: return *lQty4003;
case 4004: return *lQty4004;
case 4005: return *lQty4005;
case 4006: return *lQty4006;
}
}
这个问题很好奇,我怀疑还有什么要揭晓的。因此,这个答案也很好奇,我怀疑它可以揭开新的面纱。
我想到的一个(较差的)想法是使事情更具可读性,例如:
long getItemQty(int nItemCode, int q1, int q2, int q3, int q4, int q5, int q6, int q7) {
switch (nItemCode % 1000) {
case 1: return q1;
case 2: return q2;
case 3: return q3;
case 4: return q4;
case 5: return q5;
case 6: return q6;
case 7: return q7;
}
}
if (nItemCode < 5000) res = getItemQty(nItemCode, lQty4001, lQty4002, lQty4003, lQty4004, lQty4005, lQty4006, 0);
if (nItemCode < 4000) res = getItemQty(nItemCode, lQty3001, lQty3002, lQty3003, lQty3004, 0, 0, 0);
if (nItemCode < 3000) res = getItemQty(nItemCode, lQty2001, lQty2002, lQty2003, lQty2004, lQty2005, lQty2006, lQty2007);
if (nItemCode < 2000) res = getItemQty(nItemCode, lQty1001, lQty1002, lQty1003, lQty1004, lQty1005, lQty1006, lQty1007);
在这两种情况下,原始版本都具有较长的开关和许多参数,而该版本具有较少的参数,则可以使用一些宏;对于短参数版本,此宏:
#define FUNC(code, nf) \
if (code < 5000) res = nf(code, lQty4001, lQty40002... \
...(basically the same four lines above)...
可以用
res = FUNC(nItemCode, getItemQty);
但是,一切都取决于最终的应用程序。宏也可以用于生成长声明和getItemQty()中的长开关,或者用OR代替。宏可以(并且应该)用于避免过多重复。
- 编辑 -
实际上,宏可能会更通用:它可以避免引用可能未声明的“ res”变量;但似乎不太好。
有两种可能的方法:
将该宏保持不变,并在主体中使用类似以下内容的宏:
int res; FUNC(itemcode_im_interested_in,func_to_call)//将扩展为res = func_to_call(...)
重新定义宏,如下所示:
#define FUNC(res, code, nf) \ if (code < 5000) res = nf(code, lQty4001, lQty40002... \ ...
然后用
int res = FUNC(res, nItemCode, getItemQty);
出于审美原因,我更喜欢第一种形式,但是第二种形式更干净,用途更广。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句