关于golang结束了编程风格中对于左大括号要不要换行之争.
golang规定了左大括号必须紧跟在语句后面,这样一下子就结束了各种代码风格之争.
其实golang是继承了早期的C语言,为了节省空间,才将左括号放到代码后面.
每个程序员都有自己的编码风格,这基本上都是由他们的喜好决定的,此外,程序员还乐于争论各种编码风格的优劣,比如关于Tab和空格(见《Tab v.s. 空格:一个永恒的神圣战争》、《空格“异教徒”去死》)、80列规则(见《保卫80列规则》),还有大括号的缩进风格等。
一致的编码风格,更便于阅读。因此程序员都想极力说服别人认同并使用与自己一致的编码风格。下面来了解一下我的编码风格变化历程吧。
1980/1990年代的紧凑风格
当我开始编程时,我使用tab字符,因为使用它保存的文件更小,还可以将代码限制到80列。我还遵循Kernighan和Ritchie的《C Programming Language》一书中约定的“大括号放在同一行”规则,代码看起来是这样的:int main(int argc, char *argv[]) {
int a = rand() % 100;
if (a > 25) {
call_a_function();
call_another_function();
} else {
call_b_function();
} // end if
} // end main
当时Tab缩进默认为8个字符宽度,这意味着你不能缩进过多,以免打破“80列”宽度的限制,这也迫使你写更少、更精简的函数名或代码(这是好事)。大括号在同一行上,意味着可以在一页中显示更多的代码。
但也有一些不好的事情。我们开始使用更短的变量名,这使代码更难以阅读和维护。我们在代码行之间没有添加任何空白行,结果很难找到代码块开始和结束标记(因此我们必须在代码块结束的地方加上注释)。由于缩进太宽,留给我们的编码空间就少了。
2000年的宽松风格
在2000年,我以及周围的程序员基本上都已经切换到了微软的C/C#约定上,即使用4个空格,而不是Tab,不限制代码行的长度,大括号单独一行。如下:int main(int argc, char *argv[])
{
int a = rand() % 100; if (a > 25)
{
call_a_function();
call_another_function();
}
else
{
call_b_function();
}
}
空格缩进意味着我们不必处理不同编辑器中Tab大小(Tab大小可以根据用户喜好进行设置)。我们使用空行,以使代码更易于阅读。单独一行的大括号使代码块更加明显(可以很快找出开始和结束点)。
但是,这也导致了一些问题。由于行长度(大屏幕)无限制,我们不再感觉必须要限制缩进的数量,并开始创建更大更长的代码。由于当时的编辑器无法很好地格式化代码,程序员经常会在水平滚动时无法看到左侧的代码。代码变得难以阅读,并排比较更困难。
因此,在2000年初,我选择使用4个空格来缩进,依然遵循80列规则,将大括号单独放在一行中,以改善可读性。
2010年的典型风格
现在,我开始使用Xcode 4。Xcode中默认为4个空格缩进,保持不变,还可以智能格式化代码,不会出现滚动到右边看不到左边代码的情况。但是,令我郁闷的是,默认代码片段中大括号竟然不一致,有时单独一行,有时和代码共用一行。
看看默认的initWithNibName代码片段:- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"Detail", @"Detail");
}
return self;
}
事实证明,苹果没有弄错。它使用了正确的Kernighan & Ritchie风格,在早期C语言书籍中是为了节省空间才将所有大括号放在代码后面的。根据维基百科,K&R风格是:
“当秉承K&R时,每一个函数左括号都应在下一行中,并与开头行有相同的缩进。括号中的语句应该缩进,右括号应该与函数开头有相同的缩进,并单独一行。对于代码块内的控制语句,左括号应与控制语句在同一行中,右括号单独一行(除非有else或while关键字)。”
事实上,这是典型的K&R风格,针对所有的C衍生语言,包括C++、C#和Objective-C。这是语言本身的设计者所遵循的风格。
因此,我也改变了我的括号使用风格,我仍然使用空格缩进,仍然遵循80列宽度原则,但现在更多依赖于编辑器来进行代码格式化。不过,我现在坚持真正的K&R括号风格。int main(int argc, char *argv[])
{
int a = rand() % 100; if (a > 25) {
call_a_function();
call_another_function();
} else {
call_b_function();
}
}
关于golang结束了编程风格中对于左大括号要不要换行之争.的更多相关文章
- Google Java编程风格指南
出处:http://hawstein.com/posts/google-java-style.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Comm ...
- Google Java编程风格指南中文版
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- (转)google Java编程风格中文版
转:http://www.hawstein.com/posts/google-java-style.html 目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 ...
- Google Java 编程风格指南 —— 见微知著
目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...
- Google Java编程风格指南中文版(转)
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- Google Java编程风格指南(转)
目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...
- Google的Java编程风格指南
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- Google Java编程风格指南(中文+原始)
目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...
- Google的Java编程风格指南(Java编码规范)
这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格. 与其它的编程风格指南一样,这里所讨论的不仅仅是 ...
随机推荐
- C语言运算符(关系运算符)+(逻辑运算符)
下表显示了 C 语言支持的所有关系运算符.假设变量 A 的值为 10,变量 B 的值为 20,则: 实列: 1 #include <stdio.h> 2 3 int main() 4 { ...
- Android开发失业50天,面了10家公司,唯二的offer也主动拒了
最近在论坛看到这样一个帖子: 坐标深圳. 4 月上旬公司解散.(现在想想好像是假解散,真裁员) 这一个半月以来,从朋友内推,到拉勾.Boss 直聘,再到猎聘.智联招聘. 从开始的精准投递,到后来的海投 ...
- C++STL——vector类
vector容器 1.1 vector容器的基本概念 Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬 ...
- C++STL—string类
string容器 1.1 string容器的基本概念 string容器是一个类 这个容器中有一个指针,指针维护了一个数组 string容器提供copy.find.insert.replace等等功能 ...
- MapReduce框架原理-MapTask和ReduceTask工作机制
MapTask工作机制 并行度决定机制 1)问题引出 maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度.那么,mapTask并行任务是否越多越好呢? 2)MapTa ...
- MyBatis学习05(多对一和一对多)
8.多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` IN ...
- NOIP 模拟 $13\; \text{卡常题}$
题解 一道环套树的最小点覆盖题目,所谓环套树就是有在 \(n\) 个点 \(n\) 条边的无向联通图中存在一个环 我们可以发现其去掉一条环上的边后就是一棵树 那么对于此题,我们把所有 \(x\) 方点 ...
- Windows莫名内存到百分之百,需要修改虚拟内存
借鉴别人的操作: https://blog.csdn.net/xjpdf10/article/details/82849112
- C++面试题(四)——智能指针的原理和实现
C++面试题(一).(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了. 1,你知道智能指针吗?智能指针的原理. 2,常用的智能指针. 3,智能指针的 ...
- Linux 替换^M字符
Linux 替换^M字符 在Linux下使用vim 来查看一些在Windows下创建的文本文件,有时会发现在行尾有一些"^M". 1.使用dos2unix命令.一般的分发版本中都带 ...