我与某人合作,每当他们调用一个函数时,他们会将参数放在换行符上,例如
aFunction(
byte1,
short1,
int1,
int2,
int3,
int4,
int5
) ;
我觉得这很烦人,因为这意味着代码不是很紧凑,因此我必须上下扫描更多内容才能真正理解逻辑。我很想知道这是否真的是不好的做法,如果是,我如何说服他们不要这样做?
我与某人合作,每当他们调用一个函数时,他们会将参数放在换行符上,例如
aFunction(
byte1,
short1,
int1,
int2,
int3,
int4,
int5
) ;
我觉得这很烦人,因为这意味着代码不是很紧凑,因此我必须上下扫描更多内容才能真正理解逻辑。我很想知道这是否真的是不好的做法,如果是,我如何说服他们不要这样做?
Answers:
这只是您可能喜欢或不喜欢的编码指南。重要的是您和您的同事同意使用或不使用它。
显然,提高可读性的最佳方法是限制参数的数量。
这是一个偏好问题。对于要在其中记录每个参数的复杂函数调用,或者在变量相当长且变量很多的地方,这可能会很好。
例如:
do_complex_op(
0, //Starting state, always 0, ask Joe why
X, //X-coord of thingy
y, //Y-coord of thingy
73, //in this case, we don't want to use Z but want constant
dlogMessageTitle, //message for dialogue title
dlogMessageText, //message for dialogue contents, don't care about this.
SomethingIP, //IP of something-or-other server, can be NULL, won't crash.
someObject.childObject.getValue(key1).HVAL, //very long path to HVAL
someObject.childObject.getValue(key1).LVAL, //very long path to LVAL
this.parentWindow.owner.mainTextBox.text.value.trim, //get the trimmed text, untrimmed text causes weird output
pvrMainSettingForLongBlahs.getObjectByPath(somePath),
pvrMainSettingForLongBlahs.K_TCA_UPPER_LIMIT,
pvrMainSettingForLongBlahs.K_ENDPOINT_COMPLIANCE_LEVEL,
);
对于允许使用命名参数的语言,如果使用参数名称(在PL / SQL中为示例),则这种情况更为常见:
PKG_SOME_TEST_CODE.FN_DO_SOMETHING( in_text => 'test text',
in_id => v_id,
in_ref_id => v_ref_id,
out_array_for_storage => v_bArray);
但是我同意您的观点,如果函数调用简单且参数太多,这可能会很烦人,例如:
setColour (
r,
g,
b
);
我发现更容易阅读为
setColour(r,g,b);
对于@ammoQ:
rc=a(b,c(d,e(f)))
rc=a(
b,
c(
d,
e(
f
)
)
)
do_complex_op(new paramStruct { StartingState = 0, XCoord = xcoord })
,然后它变得可以自我记录并且更容易阅读
国际海事组织(IMO)所有不常见的东西都是不好的做法,除非可以肯定地证明它比通常的样式优越。“品味的东西”是编写代码的可怜借口,比大多数程序员所需要的要难读,因为有一天,一个不习惯这种风格的可怜的灵魂将不得不维护该代码。
证明它不常见相对容易,显示MSDN或类似网站中的示例源,显示大型开源代码库等。显示代码美化器的输出。最终,展示如何在感到沉沦还有你的团队在做。不要因为别人太固执而接受不良的风格。
好吧,这里有一些诱饵。我从来没有被指控做流行的事情。显然,如果事物适合于一行,那么就可以将它们适合于一行。
但是我主要关心的不是代码是“丑陋”还是“漂亮”。我主要关心的是理解和进行更改而不犯错误的难易程度。
如果参数很长并且有很多参数,为什么不将它们放在单独的行上呢?在我看来,这使得更容易查看它们是什么,并且在需要时更容易对其进行更改。如果需要的话,它还给我留出了空间,可以对每个参数附加评论。
我还想最大程度地减少在函数中添加或删除参数时出错的可能性,这种情况更可能发生在参数列表的末尾而不是开头。因此,我宁愿将逗号(,)放在行的开头,而不是结尾。然后,例如,如果我想在列表的末尾删除或添加一个参数,那就是单行编辑。我不必摆弄所有行末尾的逗号,而最后一行必须以括号结尾。
所以(男孩,我会为此而被激怒)我是这样写的:
nameOfFunction(firstArgument
, secondArgument // optional comment
...
, lastArgument // optional comment
);
当一个函数有五个到二十个参数时,该函数不会一次全部获得。随着时间的流逝,这意味着需要进行大量编辑。任何未完成的编辑是语法错误或错误。所以我不认为这很漂亮。我声称它有助于正确进行编辑。
(对于那些说我应该传递结构的人,所有要做的就是替换问题,因为您需要一堆代码来填充结构,更不用说额外的代码来声明和分配它了。)
我要说的是,函数调用应该全部放在一行上,除非它们大大超出了标准代码宽度(通常为80个字符,通常是引起参数的原因:-)。
我认为这种风格没有任何优势。它主观上看起来很丑陋,我在搜索代码时感到很痛苦。例如,您可能想快速搜索并查看是否曾经使用传递为NULL的特定参数来调用该函数。当所有参数都在一行上时,这在视觉上很容易,而在像这样拆分它们时则更难。
我经常在函数声明或定义中看到该样式,但从未在调用中看到(直到现在)。有时这很有意义,因为它使您可以更清楚地为单个参数添加注释。好像他在没有真正了解其背后的根本原因的情况下将该样式复制到了呼叫中。您有一个很好的论据,而他似乎没有一个很好的论据,所以您有我的一票,但我不是您必须说服的人。