我将在此扩展我对When a method has too many parameters?所做的评论,其中OP与其他人的函数有轻微问题,其中有97个参数。
我非常相信编写可维护的代码(编写通常比阅读更容易,因此Steve McConnell(赞美他的名字)的短语“只写代码”)。
由于统计数据显示大多数车祸发生在路口并且我的经验(ymmv)显示大多数“异常”发生在接口处,我会列出一些我要做的事情以试图避免接口上的误解并邀请您的评论如果我我错了。
但是,更重要的是,我邀请你提出更具预防性的建议(看,毕竟还有一个问题 - 如何改进?)。
我还#define一些空的宏来使声明更容易阅读:
#
定义INPUT
#
定义OUTPUT
#
定义MODIFY
bool DoSomething(INPUT int howOften,MODIFY Wdiget * myWidget,OUTPUT WidgetPtr * const nextWidget)
只是一些想法。我怎样才能改进这些?感谢。
答案 0 :(得分:4)
按顺序解决您的要点:
至于我认为实际上很好的想法:
编辑:回复评论:
f(param1, param2, 0,0,0);
这样的调用也很容易被视为具有默认参数。在某种程度上,按使用顺序排序很方便,但是当您执行订单时,您选择的顺序几乎与简单一致无关紧要。void *
参数对您没有多大帮助 - 但MODIFY void *
稍微好一些。 const
的实际类型和一致使用提供了更多信息,并由编译器进行检查。其他语言可能没有/使用const,但它们可能也没有宏。 OTOH,有些人直接支持你想要的东西 - 例如,Ada有in
,out
和inout
说明符。答案 1 :(得分:2)
我不确定我们是否会就此达成一致意见,每个人都会提出不同的想法(彼此视角的好坏)。话虽如此,我发现 Code Complete 是我遇到这类问题的好地方。
答案 2 :(得分:1)
我的一个很大的痛苦是控制功能之间的耦合。 (控制耦合是指一个模块控制另一个模块的执行流程,通过传递标志告诉被调用函数该做什么。)
例如(从我刚刚处理的代码中剪切和粘贴):
void UartEnable(bool enable, int baud);
而不是:
void UartEnable(int baud);
void UartDisable(void);
换句话说 - 参数用于传递“数据”,而不是“控制”。
答案 3 :(得分:0)
我会使用鲍勃叔叔在他的“清洁代码”一书中提出的“规则”。
这些我认为我记得的那些: