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

jwu*_*ler 23 c++ coding-style indentation

我经常看到这样的东西:

class SomeClass {
public:
    void someMethod();
private:
    int someMember;
};
Run Code Online (Sandbox Code Playgroud)

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

class SomeClass {
    public:
        void someMethod();
    private:
        int someMember;
};
Run Code Online (Sandbox Code Playgroud)

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

Ton*_*roy 29

增加缩进通常反映进入一个新的嵌套的范围,而这两个访问说明和开关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_;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 我不想强调一般switch/ case缩进,因为在视觉上传达开关的范围对于快速理解代码很重要
  • 我很高兴只是把{}周围现有case的代码-更像是一个注释:"嘿,我需要一个范围" -而不是感情的吸引力,进一步缩进的一切,这并没有太大的意义,甚至给我,但那种感觉不错- 我喜欢为每一case行提供代码
  • 如果在case语句中引入新变量而不引入范围,某些编译器会发出警告,即使以后没有使用该变量的情况也可能未初始化
  • 我一般是一个80列编码器,通常有4个空格缩进,所以在里面switch- 显然是一个函数 - 意味着剩下的列是有价值的.

同样的class/ struct:

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

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

  • 我同意关于范围的事情.我发现更深层次的缩进级别也意味着范围更深. (2认同)

Joh*_*ing 13

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

编辑:

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

class Base {
public:
  int a, b, c;
};
Run Code Online (Sandbox Code Playgroud)

  • @pax:我的侮辱是为了帮助贬低者解释自己. (4认同)
  • 我想你可能会发现它被downvoted,因为访问说明符与标签有_nothing_,除了它们最后都有一个冒号的事实.但是侮辱那些你一无所知的动机的人 - 你肯定会把它们放在原位:-)实际上,在我使用标签的极少数情况下,我也会缩进它们. (3认同)
  • @pax:我最近从权威人士那里读到访问说明符的外观和感觉就像是标签.我没有把它拉出我的帽子.但是我现在无法找到这个参考... (2认同)

Vla*_*lad 8

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

class SomeClass {
    void ImplicitlyPrivateMethod();
public:
    void someMethod();
private:
    int someMember;
};
Run Code Online (Sandbox Code Playgroud)

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

class SomeClass {
        void ImplicitlyPrivateMethod();
    public:
        void someMethod();
    private:
        int someMember;
};
Run Code Online (Sandbox Code Playgroud)

(对于很多人来说,这看起来并不那么好,特别是如果"隐含"部分足够长).


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

class SomeClass {
    void ImplicitlyPrivateMethod();
  public:
    void someMethod();
  private:
    int someMember;
};
Run Code Online (Sandbox Code Playgroud)

但这是个人品味的问题.

  • 在这里,我要说,不要在没有访问说明符之前编写定义.我知道它是有效的代码,但它们只属于类. (3认同)
  • @Sean:在定义`struct`时,通常根本不使用访问修饰符.你是否建议对`struct`s采用不同的缩进规则? (2认同)

Dav*_*eas 7

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

switch ( var ) {  
case 1:          // if ( var == 1 ) {
   code;
case 2:          // } else if ( var == 2 ) {
   code;
}
Run Code Online (Sandbox Code Playgroud)

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

class test {
public:
   void foo();
private:
   int member;
};
Run Code Online (Sandbox Code Playgroud)

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

就个人而言,我从不缩进case或访问修饰符,在namespaces 的情况下,它取决于......一个namespace覆盖整个源文件的内容很可能不会缩进,而只占用源文件的名称空间将缩进 -理由是,在前一种情况下,它没有增加实际价值,而在第二种情况下则没有.


小智 6

两个可能的原因:

  • 这就是Bjarne Stroustrup在书中缩进的原因

  • 大多数文本编辑器会自动缩进它们


Kar*_*tel 6

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

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

    private:
    int top_secret;
};
Run Code Online (Sandbox Code Playgroud)

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