38

有时你必须在你的源代码中写很长的行,这更好地打破。你如何缩进受此影响的东西。

你可以同样缩进:

very long
statement;
other statement;

如示例中所示,这使得与以下代码区分开来变得更加困难。另一方面,您可以将其缩进一级:

very long
   statement;
other statement;

这使得它更容易,但它可能会发生,长行是嵌套块的开始,您想要缩进,如下所示:

if ((long test 1) &&
   (long test 2) &&
   (long test 3)) {
   code executed if true;
}

在这种情况下,又很难阅读。我能想到的第三种可能性是根本不换行,现代编辑器可以处理它并创建软换行符。但是对于另一个编辑器,您必须横向滚动并且您不能影响位置,编辑器会打破您的长线。

你更喜欢哪种可能性?你有其他想法来解决这个问题吗?你能用充分的理由支持你的偏好吗?

4

14 回答 14

43

我喜欢自己的大括号,因为我可以更容易地将条件和内部块视为一个项目(如果你知道我的意思):

if ((long test 1)
    && (long test 2)
    && (long test 3)) 
{
    code executed if true;
}

我喜欢用条件开始附加条件行,因为我发现“加入”条件非常重要,并且在前一行的末尾往往会被忽略。

我还尝试缩进以使括号的效果显而易见(尽管尝试避免长条件通常是一件好事)。

我尝试构建东西,以便我可以轻松地“扫描”“东西”:)

于 2009-03-30T22:45:30.020 回答
31

你应该尽量避免写超过 80 个字符的行,而不是打断它们:

  • 尝试通过转换条件和封装代码来最小化缩进。

Linus Torvalds:如果你需要超过 3 级的缩进,无论如何你都搞砸了,
应该修复你的程序。

除了条件是您封装的其他内容准备好在其他地方使用之外,这还具有使您的代码更具可读性的副作用。

bool encapsulatedLongCondition() // Add some parameters
{
  if (!condition1)
    return false;

  if (!condition2)
    return false;

  // ... (Other conditions)

  return true;
}    

if (encapsulatedLongCondition())
{
  // ... (Call some methods, try not to introduce deeper if/loop levels!)
}

通过布尔代数简化条件并尝试反转条件和返回值会很有帮助。:-)

另见:你能简化这个算法吗? 另请参阅 2:Refactor for C# 能够帮助您解决此问题。;-)

  • 使用类型定义并尽量避免长名称

一个简单的例子,想象一下在另一个容器中使用没有 typedef 的 Days 和更长的名称需要多长时间。

struct Day
{
  // Some data
};
struct Event
{
  // Some data
};
typedef list<Event> Events;
typedef map<Day, Event> Days;
// Some other container that would else be long...
  • ...(您应该尝试分析为什么您的线路很长并找到解决方案)

希望您了解总体思路,这样您就不需要提出肮脏的换行符。;-)

我会看到出现长行的唯一地方是在您的函数原型中,或者在调用它们时,您应该尝试在最后一个可能的逗号之后中断并继续下一行。而不是在每一个之后都这样做并浪费多行使滚动膨胀并且您的函数过于突出......如果您碰巧经常看到这些长行,您可以将返回类型放在函数名称之前的行上。

void longFunctionName(ParameterType1 parameter1, ParameterType2 parameter2,
                      ParameterType3 parameter3, ParameterType4 parameter4)  
于 2009-03-30T22:51:56.773 回答
9

一般来说,我会:

if (condition) {
     something;
}

用于块分隔符。但是,如果遇到长线我要分手的情况,我用这个:

if (
    (long test 1) &&
    (long test 2) &&
    (long test 3)
) {
    code executed if true;
}

与 rbobby 的回答的主要区别:

  1. 每行末尾的运算符而不是后续行的开头,以非常清楚地在视觉上指示该行不完整
  2. 在条件元素之前的第一行换行 - 这有助于保持代码“形状”一致。
  3. 右括号不缩进。

这具有使参数/条件列表看起来有点像代码块的视觉效果(但使用括号而不是花括号。我发现对称性令人愉悦。它还避免了一行裸露的开口花括号(我认为这看起来很糟糕) .

于 2009-11-17T15:12:01.040 回答
7

我有两个简单的规则:

  1. 语句块:一个缩进;
  2. 续行:两个缩进或括号对齐,无论进一步缩进。

因此,在 if 情况下:

if ((long test 1) &&
        (long test 2) &&
        (long test 3)) {
    code executed if true;
}
于 2009-03-30T22:36:02.337 回答
3

我对这里已经写的内容略有不同:

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) 
{
    code executed if true;
}

我喜欢将布尔运算符放在行尾。

长方法名,或者有很多参数的方法是这样的:

reallyLongMethodName (paramA,
                      paramB,
                      paramC);

位与上面的参数名称对齐;不是括号...

此外,为了减少缩进,我已经开始在我的代码中使用多个返回点,以及在我的循环中继续和中断。例如

for(int i = 0; i < MAX; i++)
{
    if(!isPrime(i)) // predefined prime finding func
        continue;

    //now we have only prime values of i
}
于 2009-03-30T22:59:22.217 回答
2

总是缩进,但 if 语句是特殊的;我喜欢排列测试,我把额外的&&运算符放在左边:

if (  (long test 1)
   && (long test 2)
   && (long test 3)) 
{
    code executed if true;
}

也可以将其拉到&&左侧以对齐if,但我发现这种替代方法更难阅读。

于 2009-03-31T00:17:09.660 回答
2

我支持“不要与 IDE 对抗”。

但是,我的 IDE(Eclipse、Visual Studio)想要断行是它们的断行方式。

这可能意味着语言之间的不一致,这没关系。

于 2009-03-30T22:36:03.943 回答
1

我想说的是,只要符合以下标准,您使用哪种方法并不重要:

  • 这是明智的
  • 您在整个代码中应用相同的约定。

如果您在团队开发中,尝试通过某种神秘的投票机制就你们之间的约定达成一致,如果您无法达成一致并且没有人可以发号施令。

于 2009-03-30T22:55:50.587 回答
1

以特定方式格式化代码的唯一原因是使其可读。这本质上是主观的 - 以一种看起来不错的方式进行操作,并且您觉得对于第一次查看代码的人来说更具可读性。我要打破传统观点,说,不要担心任何共同的标准 - 有两个原因

1)在这种情况下很难,因为虚线有很多不同的可能性

2)它不买你什么。时期。再一次,代码格式化只是为了让你的代码可读,有一种格式化代码细节的标准方法并不会给你带来可读性。

于 2009-03-30T23:23:43.780 回答
1

使用 astyle 或您正在使用的任何自动压头。它似乎做得足够好,通常还有更重要的事情需要考虑。

于 2009-03-30T22:34:41.777 回答
1

我将括号中的表达式保持在开头的级别:

if ((long test 1) &&
    (long test 2) &&
    (long test 3)) {
  code executed if true;
}

这使得每个表达式处于哪个级别变得很明显。

于 2009-03-30T22:35:44.287 回答
0

在我看来,78 或 80 个字符的行宽很有用,因为它可以更容易地在同一个屏幕上打开多个文件。

理由,Linus Torvalds 的一句话怎么样?:)

答案是,如果你需要超过 3 级的缩进,无论如何你都搞砸了,应该修复你的程序。

我通常遵循Google C++ 编码风格(我猜你也可以适应 Java)和这种 C++ 编码风格

于 2009-03-30T22:43:40.850 回答
0

我几乎从不在同一行缩进。但是,我在非常罕见的情况下重新初始化了一堆像这样的变量

a 
= b
= c
= d
= e
= f
= 0;

不过,这样做的一个关键是将赋值运算符保留为下一行的第一个字符。这将给maint。当他们看到它时,程序员一个 WTF 时刻,迫使他们看,而不仅仅是掩饰它。

包装一个很长的声明,我会在我认为有意义的地方做......不一定在第一个缩进。所以 :

reallyLongMethodName (paramA,paramB,paramC);

不会像这样被格式化

reallyLongMethodName (paramA,
    paramB,
    paramC);

但最终会更像

reallyLongMethodName (paramA,
                    paramB,
                    paramC);

所有参数都与左括号对齐。

对于if's and whiles,我会做类似的事情

if((long test 1) 
&& (long test 2) 
&& (long test 3))
{
    code executed if true;
}
于 2009-03-30T22:43:47.637 回答
0

对于 Java,Oracle 提供了这些约定。Java 代码约定 - Oracle。

  • 逗号后中断
  • 在操作员之前休息
  • 更喜欢高级别的中断而不是低级的中断
  • 将新行与上一行同一级别的表达式开头对齐
  • 如果上述规则导致代码混乱或代码被挤压到右边距,只需缩进 8 个空格

例如,

longName1 = longName2 * (longName3 + longName4 - longName5)
            + 4 * longname6; // PREFER
longName1 = longName2 * (longName3 + longName4
                        - longName5) + 4 * longname6; // AVOID

其他 :

//DON’T USE THIS INDENTATION
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { //BAD WRAPS
    doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
}

该文档中给出了更多示例。

于 2018-03-09T06:14:12.323 回答