为什么人们不缩进C ++访问说明符/ case语句?

时间:2010-11-28 23:23:29

标签: c++ coding-style indentation

我经常看到这样的东西:

class SomeClass {
public:
    void someMethod();
private:
    int someMember;
};

这对我来说似乎完全不自然(同样适用于case - 使用switch时的语句。我期待这样的事情,当我开始使用C ++时(从那时起已经很长时间了,但我仍然想知道):

class SomeClass {
    public:
        void someMethod();
    private:
        int someMember;
};

是否有资金理由打破(否则)一致的缩进规则?

10 个答案:

答案 0 :(得分:29)

增加缩进通常反映了对新嵌套作用域的输入,而访问说明符和switch case语句都不会改变作用域(通常标签也是如此)。访问说明符可以是可选的,因为您可以开始实现类或结构,并且所有成员只需要隐含访问(即分别是私有和公共访问),但随后代码会发展,您需要为非隐含访问者添加说明符 - 访问成员:是否真的值得突然改变所有成员的缩进?同样,没有嵌套的范围,所以我认为这会产生误导。

如果你在固定宽度的终端上工作并相应地包裹你的线条,那么重新定位是一种痛苦。但是,让访问说明符从成员中脱颖而出是有用的,这意味着将它们放回到某处 - 与class关键字一致或在那里分开。

就个人而言,我这样做:

class X
{
  public:
    int member_function()
    {
        switch (expression)
        {
          case X:
            return 6;

          default:
          {
            int n = get_value() / 6;
            return n * n;
          }
        }
    }

  private:
    int member_variable_;
};

为什么我不进一步缩进每个case的代码?我无法宣称我做的事情特别合乎逻辑,但因素包括:

  • 我不想强调一般switch / case缩进,因为在视觉上传达切换范围对于快速理解代码非常重要
  • 我很高兴将{}放在现有的case代码周围 - 更像是评论“嘿,我需要一个范围” - 而不是感到有吸引力的缩进一切都进一步,即使对我来说也没有多大意义但感觉有点 - 我喜欢为每个case排队的代码
  • 如果在case语句中引入新变量而不引入范围,则某些编译器会发出警告,即使以后没有使用该变量的情况也可能未初始化
  • 我一般是一个80列编码器,通常有4个空格缩进,因此位于switch内 - 因此显然是一个函数 - 意味着剩下的列很有价值。

class / struct

相同
  • 我想扫描左栏并快速找到课程的结尾,或者轻松计算屏幕上或打印输出中的小班级;在完全相同的缩进级别访问说明符会强调class关键字,但它确实有助于使它们在视觉上与成员不同(如果类/结构多于几行,我还预先添加一个空行)
  • 当我引入/private说明符
  • 时,我不想更改现有的类protected结构成员缩进

总之:很多小因素都会影响人们的缩进偏好,如果你想成为企业环境中的C ++程序员 - 特别是承包商 - 你只需要顺其自然,就能改变自己的想法。风格有时也是(例如我现在卡在了camelCaseLand中,公共成员变量以大写字母开头 - 呀!)。不要冒汗 - 这不值得。

答案 1 :(得分:13)

访问说明符实际上只是标签(如goto所使用的那些)。人们通常不会缩进标签,或者在周围代码中将其标记为一级。所以我想说这根本不矛盾。

编辑:

标准也将此样式用于访问说明符。第10章第2段的例子:

class Base {
public:
  int a, b, c;
};

答案 2 :(得分:8)

想象一下这样一个类定义:

class SomeClass {
    void ImplicitlyPrivateMethod();
public:
    void someMethod();
private:
    int someMember;
};

根据你提出的缩进风格,人们需要将其改为

class SomeClass {
        void ImplicitlyPrivateMethod();
    public:
        void someMethod();
    private:
        int someMember;
};

(对许多人来说看起来不太好,特别是如果“隐含”部分足够长的话)。


我个人更喜欢这种说明符的半缩进:

class SomeClass {
    void ImplicitlyPrivateMethod();
  public:
    void someMethod();
  private:
    int someMember;
};

但这是个人品味的问题。

答案 3 :(得分:7)

与许多其他事情一样,重要的是不要将规则误认为是有目的的。缩进的目的是通过提供关于属于何处的额外视觉提示,使代码更清晰,更易于阅读。现在,在您提及的特定情况下,与namespace一起,在许多情况下,额外的缩进对可读性没有帮助。交换机中的case可以理解为if-else s,您不会在其中添加额外的缩进。这些案例是块分隔符,与花括号类似。

switch ( var ) {  
case 1:          // if ( var == 1 ) {
   code;
case 2:          // } else if ( var == 2 ) {
   code;
}

在类级别,可以将访问修饰符视为与类所支持的级别相同的块分隔符。添加额外级别的缩进不会使代码更清晰:

class test {
public:
   void foo();
private:
   int member;
};

命名空间也是如此,有些人避免缩进整个命名空间级别。在所有三种情况下,添加额外缩进没有明显的优势,如果您遵守短代码行(80/100字符)和足够大的缩进级别(8或甚至4个字符),那么不缩进可能有一个优势

就我个人而言,我永远不会缩进case或访问者修饰符,在namespace s的情况下,它取决于......涵盖整个源文件的namespace很可能不会缩进,而只占用源文件一部分的命名空间将缩进 - 理由是在前一种情况下它不会增加实际值,而在第二种情况下它会增加。

答案 4 :(得分:6)

两个可能的原因:

  • 这就是Bjarne Stroustrup在他的书中缩进的方式

  • 大多数文字编辑器会自动缩进

答案 5 :(得分:3)

这完全是关于分支的范围和分组。如果这些不受影响,则不要添加缩进级别。

举例如下:

if( test == 1 ) {
    action1( );
} else if( test == 2 ) {
    action2( );
} else {
    action3( );
}

记下语句块的级别。现在重写它作为带有缩进情况的case语句:

switch( test ) {
    case 1:
        action1( );
        break;
    case 2:
        action2( );
        break;
    default:
        action3( );
        break;
}

这在功能上完全相同,但缩进与我的动作不匹配。我认为正是这种不一致最终使我改变了删除额外的虚假缩进。 (即使我不介意别人提出的半缩进,请注意。)

答案 6 :(得分:1)

每个类的访问修饰符行很少,并且大多数编辑器的颜色修饰符与其他所有颜色不同。他们自己脱颖而出,为什么要添加不必要的标签呢?

答案 7 :(得分:1)

由于publicprivate是不引入新范围的标签,因此我不想给它们任何特殊的缩进,因此:

class foo {
    public:
    void something();
    void something_else();

    private:
    int top_secret;
};

这样,一致的缩进规则是“缩进等于范围”。

答案 8 :(得分:0)

大多数编辑器会自动缩进它们,对我来说,我将它们保留为小类或小文件或短切换语句,但对于长文件或带有许多长切换语句的长文件,我使用更多缩进以便于阅读

我有时这样做,我觉得它是旧式

Class CClass
    {
            CClass();
            ~CClass();
        Public:
            int a;
        Private:
            int b;
     };
CClass::CClass
      {
           TODO code;
      }

当文件包含超过20或50个函数时,这有时会更容易,因此您可以轻松找到每个函数的开头

答案 9 :(得分:0)

如前所述(虽然主张非缩进访问修饰符),访问修饰符形成逻辑块。虽然它们与类括号处于同一水平,但它们很特殊。

因此,缩进可以清楚地显示每个块的开始和结束位置。

我个人认为它使代码更清晰。其他人不同意。

这是一个相当主观的问题。