你喜欢包装代码行的首选方法是什么,特别是涉及长参数列表时?
有几个与包装线有关的问题(例如When writing code do you wrap text or not?和Line width formatting standard),但我找不到一个涵盖包含一行代码的地方。
假设我们有一行代码可以像这个例子一样继续前进:
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2, Argument3, Argument4);
应如何包裹?
以下是我能想到的几种方式,以及它们的一些缺点:
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2,
Argument3, Argument4);
我个人不喜欢这个选项,因为格式化似乎在视觉上将参数列表与我试图调用的方法分开,特别是因为在上面的orphanged参数正上方有一个赋值等号(“=”)。新行。
所以,有一段时间我采用了以下方法:
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1,
Argument2,
Argument3,
Argument4);
这里,参数都捆绑在一起,都在方法的第一个参数的一边。但是,一个问题是,由于选项卡缩进的空格数,参数列表不会总是在第二行中排列。 (为格式化输入额外的空格会非常耗时。)
上述问题之一中的answer建议采用以下格式:
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1,
Argument2,
Argument3,
Argument4
);
我实际上喜欢这种格式,因为它的视觉吸引力,但它也可以在视觉上将参数与列表所属的方法分开。另外,我更喜欢单个方法调用而不占用太多行。
所以,我的问题是,没有遇到阻止行代码在一开始就变得太长的问题,你会如何推荐包装代码行?具体来说,在长参数列表中,哪里是打破一行代码的好地方?
答案 0 :(得分:13)
int SomeReturnValue = SomeMethodWithLotsOfArguments
( Argument1,
Argument2,
Argument3,
Argument4
);
答案 1 :(得分:11)
选项3建议
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1,
Argument2,
Argument3,
Argument4
);
是一种更好的方式,因为它给人一种良好的感觉。 如果参数的长度或多或少相同,那么我们可以将它们放在一起,以便它们排成一个表格,例如
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1, Argument2, Argument3, Argument4,
Argument005, Argument006, Argument7, Argument8
);
答案 2 :(得分:7)
我更喜欢这种方式:
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2,
Argument3, Argument4);
线条最接近当前最大线宽(无论是什么),下一条线相对于等号缩进通常的缩进级别(无论是什么)。
不确定原因,但我认为在大多数情况下它是最易读的选项。但是,我选择不对这些事情迂腐,我总是喜欢给定代码段最可读的东西,即使这可能会破坏一些缩进或格式化规则(当然也在限制范围内)。
这方面的一个例子是,如果函数需要许多参数或者它们本身很复杂的参数,那么我可能会选择这样的东西:
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1 + Expression1 + Expression2,
Argument2 - Expression3 * Expression4,
Argument3,
Argument4 * Expression5 + Expression6 - Expression7);
当然,如果参数表达式很长或很复杂,最好在函数调用之前进行计算,并使用临时值来存储结果。
答案 3 :(得分:6)
我尽量保持线条简短。在这种情况下,我会在赋值之前和每个参数之后断开。我还将逗号放在行的开头,以便于添加新参数:
int SomeReturnValue
= SomeMethodWithLotsOfArguments(
Argument1
, Argument2
, Argument3
, Argument4
);
在Visual Studio中使用这种布局是很多工作,但Emacs让我自动化。
答案 4 :(得分:1)
就我个人而言,我不喜欢第二种选择,太接近Ascii艺术,它在代码中有不便之处:更改函数的名称,你必须重新缩进所有参数。不知怎的,它膨胀了文件。如果在代码中使用硬标签,它也无法正常工作。
大多数时候,我使用第一个选项,但是我采用了两个缩进的Eclipse规则用于连续行,因为它比正常缩进更突出(特别是如果你拆分条件指令)。
有时我使用第二个选项,例如。如果左括号已接近我的行长限制...
优点:您可以在每个参数后添加一行注释
或者我喜欢Dheer,将参数分组,直到它们填充线宽。
参数与函数名称分离的事实从未打扰过我,它们仍然接近并且完全分组。在最坏的情况下,我可以在函数调用周围添加空行。
答案 5 :(得分:1)
如果离开右下方不间断的话,我总是在作业前休息。 这在像Java这样的语言中非常有用,你必须明确地声明所分配的值的类型。
SomeVeryVerboseTypeName SomeReturnValue
= SomeMethodWithLotsOfArguments(Argument1, Argument2, ...);
答案 6 :(得分:1)
对我来说,这取决于参数列表的长度。我不太喜欢行尾布局,并且几乎需要编辑器支持(例如emacs)来做得好。
如果方法调用足够短以使其在一行上,我会这样做:
int SomeReturnValue =
SomeMethodWithLotsOfArguments(Argument1, Argument2, ...);
如果方法和变量适用于一行,而参数适用于另一行,我已经这样做了:
int SomeReturnValue = SomeMethodWithLotsOfArguments
(Argument1, Argument2, ... );
这让我的LISPy心中微笑,但是让同事们疯了,所以我心软了:
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1, Argument2, ... );
我想我只是想说我没有找到一个我真的很满意的解决方案,尽管这对于真正过长的案例有一些吸引力,因为它与我们如何布置curlies相似:
int SomeReturnValue = SomeMethodWithLotsOfArguments(
Argument1,
Argument2,
);
答案 7 :(得分:1)
警告:我使用IDE。如果您不是IDE用户,请跳过此步骤。
与他人合作时:
我倾向于坚持团队目前采用的任何惯例。如果团队使用支持代码格式的IDE,那就更好了。始终坚持团队/ IDE格式约定。不能告诉你有多少次我被“版本控制 - 差异 - 地狱 - 重新格式化”烧毁了
独自工作时:
我打开方法,行长度对我来说不是问题。我有一个漂亮的宽屏显示器和水平滚动条是出于某种原因发明的。最重要的是,导航源代码不仅仅是可视化滚动,因为许多IDE都具有调用树,查找引用和重构工具等实用程序。
答案 8 :(得分:1)
对此我没有明确的答案。我是根据具体情况来做的。如果函数名称很长,我肯定不会将与前一个参数相同的列的其他参数缩进。如果函数名称很短,我通常会在同一列的参数后面缩进,在一行中收集尽可能多的参数(不是一个参数=一行)。但如果有一些令人愉悦的对称性,比如
int a = foo(a + b,
c + d);
我可能会违反该规则,并且每行都有相同数量的参数。
答案 9 :(得分:1)
大多数人都提出了有关缩进的好建议,这对于您无法控制的API函数非常有用。如果您确实控制了API,我建议一旦您有超过3个参数,您应该创建某种形式的结构并将结构传递给例程。一旦你获得了超过3个参数,那么以错误的顺序传递它们的可能性就会越来越大。它还提供了对参数类型和含义的更多可见性。
someStruct.x = somevalue;
somestruct.y = someothervalue;
int someResturnValue - SomeMethod(somestruct);
答案 10 :(得分:1)
如果args足够短并且(几乎)具有相似的长度,我认为在视觉上足够好
int variable_with_really_long_name = functionWhichDoMore(Argument1, ArgumentA2,
ArgumentA3, Argument4,
ArgumentA5, Argument6);
当它变得更糟时,一列论据确实有帮助
int variable_with_really_long_name = somefunctionWhichDoMore(Argument_Expand1,
Argument2,
Argument_Expand3,
Argument_Expand4,
Argument_Expand5,
Argument6);
但是,现在,如果它恶化了!现在怎么办?试试这个
int variable_with_really_long_name = someFunctionWhichDoMore
(
Argument_Expand_More1,
Argument_Expand_More2,
Argument_Expand3, Argument4,
Argument_Expand_More5, Argument6
);
顺便说一下,如果你想要一致的外观,请使用上面所有条件中的第三个。
Justify:整齐地穿上,我们知道它是一个带有很多(6)args的函数调用。我喜欢我的代码看起来很整洁!(so_ugly)
。
欢迎评论家。请评论。
答案 11 :(得分:0)
在具有长参数列表的函数中,为了便于阅读,我在每一个或两个参数之后进行换行(总是在每一行上保持相同数量的参数):
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1,
Argument2,
Argument3,
Argument4);
OR
int SomeReturnValue = SomeMethodWithLotsOfArguments(Argument1, Argument2,
Argument3, Argument4);
取决于列表/参数长度。
答案 12 :(得分:0)
我还使用Edward Kmett引用的'一致缩进选项'。如果存在 lot 参数,我倾向于在可能的情况下按相关性对它们进行行分组。
但是对于这个特殊的例子,我可能会把它放在一行上, 。
我无法忍受'悬空包装'格式,因为它很容易提供与(更重要的)缩进冲突的视觉混淆。悬挂包裹被认为是目前许多语言的“默认”风格,但我不知道它是如何形成的。这是恕我直言,可怕。
答案 13 :(得分:0)
我更喜欢以下
int variable_with_really_long_name = functionWhichDoMore(
Argument1, ArgumentA2, ArgumentA3, Argument4,
ArgumentA5, Argument6);
int i = foo(Argument1, ArgumentA2, ArgumentA3, Argument4,
ArgumentA5, Argument6);
两者都是相互一致的,当达到80个字符时,我走下一行并放置2个每个4个空格的缩进。我对此的论证如下:
我使用2个缩进,每个缩进4个空格,以便清楚地看到它涉及包裹线而不是缩进代码块的事实。
这种缩进方式可以很好地缩进代码,因为它总是遵循相同的缩进模式,2行用于换行,1用于代码块缩进。
将每个参数放在一个单独的行上可能会导致非常大的方法,因此我更喜欢在一行或多行上依次创建参数。
这种换行方式可以在Eclipse等IDE中配置,提供自动格式化功能。
然而,有一个重要的注意事项,可能会出现以下情况:
int variable_with_really_long_name = functionWhichDoMore(arg1,
arg2)
我会尽量避免这种情况,如果发生这种情况我会做以下事情
int variable_with_really_long_name = functionWhichDoMore(arg1, arg2)
是的,我会把我的120 char最大化。代码行长度约定,我的惯例实际上是灵活的,最多120到140个字符,通常我在120之后换行,但是在这种情况下我会去最大。 140个字符。这样做的缺点当然是它无法配置为在诸如eclipse之类的IDE中进行自动格式化。
PS。我知道有些人认为120个字符对代码行长度来说很重要,但这是另一个讨论。上述惯例当然也适用于80/100字符。