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语句中引入新变量而不引入范围,某些编译器会发出警告,即使以后没有使用该变量的情况也可能未初始化switch- 显然是一个函数 - 意味着剩下的列是有价值的.同样的class/ struct:
class关键字,但它确实有助于使它们在视觉上与成员不同(如果类/结构多于几行,我还预先添加一个空行)/当我引入一个private或protected说明符时,我不想更改现有的类结构成员缩进总而言之:许多小因素都会影响人们的缩进偏好,如果你想成为企业环境中的C++程序员 - 尤其是承包商 - 你只需要顺其自然,并且有时也能改变自己的风格. (例如,我现在卡在了camelCaseLand中,公共成员变量以大写字母开头 - yikes!).不要流汗 - 这不值得.
Joh*_*ing 13
访问说明符实际上只是标签(如使用的那些goto).人们通常不会缩进标签,或者在周围代码中将其标记为一级.所以我想说这根本不矛盾.
标准也将此样式用于访问说明符.第10章第2段的例子:
class Base {
public:
int a, b, c;
};
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)
(对于很多人来说,这看起来并不那么好,特别是如果"隐含"部分足够长).
我个人更喜欢这种说明符的半缩进:
class SomeClass {
void ImplicitlyPrivateMethod();
public:
void someMethod();
private:
int someMember;
};
Run Code Online (Sandbox Code Playgroud)
但这是个人品味的问题.
与许多其他事情一样,重要的是不要将规则误认为是有目的的.缩进的目的是通过提供关于属于何处的额外视觉提示,使代码更清晰,更易于阅读.现在,在特殊情况下,您提到的,与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覆盖整个源文件的内容很可能不会缩进,而只占用源文件的名称空间将缩进 -理由是,在前一种情况下,它没有增加实际价值,而在第二种情况下则没有.
因为public和private是不引入新范围的标签,所以我不想给它们任何特殊的缩进,因此:
class foo {
public:
void something();
void something_else();
private:
int top_secret;
};
Run Code Online (Sandbox Code Playgroud)
这样,一致的缩进规则就是“缩进等于范围”。