阅读更多

8顶
3踩

研发管理

翻译新闻 哪种编码风格是你的“菜”

2013-02-01 17:21 by 副主编 wangguo 评论(40) 有22839人浏览
每个程序员都有自己的编码风格,这基本上都是由他们的喜好决定的,此外,程序员还乐于争论各种编码风格的优劣,比如关于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();
   }
}

你的编码风格是什么样?欢迎评论。

英文原文:Reprogramming My Brace Style Mind
8
3
评论 共 40 条 请登录后发表评论
40 楼 shiluodemantuoluo 2013-07-04 11:09
gundumw100 写道
ctrl+shift+F
我的风格!

39 楼 gundumw100 2013-02-05 14:30
ctrl+shift+F
我的风格!
38 楼 上官车月 2013-02-05 10:26
确实,不管咋的 在一个项目这中 所有人统一了,其它不存在多大问题


不过一行很多代码,看的时候要左右拖动很不爽
37 楼 ahack 2013-02-05 10:04
Tyrion 写道
这个是项目里面统一的吧,反正我觉得不要有那左右拉的滚动条就行,其他都可以接受。

哈哈,还有多少人有这种感受。
36 楼 Shen.Yiyang 2013-02-04 20:00
团队开发,肯定是在IDE里面使用统一的格式啊; 使用哪种风格是无所谓的事情,关键是能不能方便地统一,比如Eclipse Code Template。
35 楼 MyJavaHouse 2013-02-04 15:12


装个啥子插件哦。
美工给的html,有时候就乱的
我在eclipse里面又不能轻易格式化,怕影响到样式啥的

吧长度调长点在用自动格式化就不会乱了

哦,java代码中调过,解决过这个问题,html中没整过
效果应该是一样的哈
34 楼 at1943 2013-02-04 15:09
MyJavaHouse 写道
icefishc 写道
MyJavaHouse 写道
第一种,我感觉我有强迫症了,java代码风格必须是第一种,不然看到不舒服,现在看到html代码总要用TAB把每个标签对整齐才开始编码,不然心里难受!!!!!

不给你的编辑器装个插件么。。。 


装个啥子插件哦。
美工给的html,有时候就乱的
我在eclipse里面又不能轻易格式化,怕影响到样式啥的

吧长度调长点在用自动格式化就不会乱了
33 楼 MyJavaHouse 2013-02-04 14:54
icefishc 写道
MyJavaHouse 写道
第一种,我感觉我有强迫症了,java代码风格必须是第一种,不然看到不舒服,现在看到html代码总要用TAB把每个标签对整齐才开始编码,不然心里难受!!!!!

不给你的编辑器装个插件么。。。 


装个啥子插件哦。
美工给的html,有时候就乱的
我在eclipse里面又不能轻易格式化,怕影响到样式啥的
32 楼 jeschou 2013-02-04 12:28
第一种风格,8过...
tab只是一个字符而已,至于显示几列要看编辑器

现在主流的编辑器都可以设置tab显示为几列

第一种风格,还有变体,就是使用4个空格的
31 楼 oaklet 2013-02-04 12:26
宽屏用80列多蛋疼,用120列至少,
经常写脚本一般都用空格对齐,例如python,很少见有人用tab的
要是写java,c#一类,用IDE的自动
格式化就顶好
30 楼 kjj 2013-02-04 12:20
lection.yu 写道
我的风格
if(a == b){
#tab#缩进
}

飘过
29 楼 icefishc 2013-02-04 11:46
MyJavaHouse 写道
第一种,我感觉我有强迫症了,java代码风格必须是第一种,不然看到不舒服,现在看到html代码总要用TAB把每个标签对整齐才开始编码,不然心里难受!!!!!

不给你的编辑器装个插件么。。。 
28 楼 guozhen_168 2013-02-04 11:41
我是第一种风格的
27 楼 hpjianhua 2013-02-04 10:57
看了这几种,看得顺眼的就是第一种;
26 楼 MyJavaHouse 2013-02-04 10:39
第一种,我感觉我有强迫症了,java代码风格必须是第一种,不然看到不舒服,现在看到html代码总要用TAB把每个标签对整齐才开始编码,不然心里难受!!!!!
25 楼 Tyrion 2013-02-04 09:57
这个是项目里面统一的吧,反正我觉得不要有那左右拉的滚动条就行,其他都可以接受。
24 楼 z3558646 2013-02-04 09:56
第一种 不过 tab是4字符宽度
23 楼 岭岭睡不醒 2013-02-04 08:52
eclipse  8.6  默认的  format code (快捷键 ctrl+shift+f)。这是eclipse中的一套机制,也可以自定义配置。

java程序一点问题没有,但是jsp中如果有<%%>这种脚本,格式化出来的挺蛋疼。哈哈
22 楼 nighthawk 2013-02-04 00:04
哪有什么风格,非要强加一个风格,那就是ctrl+shift+F
21 楼 dingherry 2013-02-03 23:32
80/90风格 中枪了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • java种菜源码-Nuget:营养蔬菜检测器,从图像中进行简单的平均颜色检测

    java种菜源码纽吉特 这是一个 Nuget (营养蔬菜检测器) ...编码风格 Java 内置 - 用于构建安卓应用程序的工具 作者 Karen D. -开发人员- 执照 这个项目是在 MIT 许可下获得许可的 致谢 LKTA 团队:Amnia、Afrida

  • kr编码风格

    每个程序员都有自己的编码风格,这基本上都是由他们的喜好决定的,此外,程序员还乐于争论各种编码风格的优劣,比如关于Tab和空格(见《Tab v.s. 空格:一个永恒的神圣战争》、《空格“异教徒”去死》)、80列规则...

  • 类(创建和使用类、使用类和实例、继承、导入类、类编码风格)

    如何编写类;如何使用属性在类中存储信息,以及...你见识了如何修改实例的属性——包括直接修改以及通过方法进行修改。你还了解了:使用继承可简化相关类的创建工作;将一个类的实例用作另一个类的属性可让类更简洁。

  • 有关代码风格的问题

    之前读同学的代码,发现很多人的代码风格很成问题,读起来很费劲,这里作为一个菜鸡想发表一下自己对于代码风格的一些看法。 为啥非要按某个格式,自成一家不好嘛? 书法画作自成一家完全没问题,但在信息时代下的...

  • 用炒菜的思路搞定你的复杂分析

    在多维分析这个领域里,大体有两种风格的食客: 其一曰固定报表,可类比作去食堂吃饭,能点什么菜都固定,而且菜色不会很多,菜谱就相对好设计;   其二曰灵活查询,可类比为海鲜集市里的代客加工,一开始...

  • 【笔记】python标准库(模块random、函数randint()、函数choice())、类编码风格

    文章目录一、python标准库二、类编码风格 一、python标准库 二、类编码风格

  • 风格迁移篇---重用鉴别器进行编码:朝向无监督的图像到图像转换

    图像风格迁移

  • pythonic风格_如何编写高质量的Pythonic风格代码

    每一种语言都有它的编程风格,打个比方就像各种菜系,粤菜,川菜,淮扬菜每一种都有自己的独特风格.Python的开发者用Pythonic这个词来形容那种符合python风格的代码.这种pythonic风格的代码,既不是非常严格的规范,也...

  • 什么是真正的程序员

    文章略长,但是耐心读完,你肯定会受益良多! 第一章 (推荐看完整篇文章,再回过头看一遍第一章) 我非常幸运出生在一个电脑和电子游戏还没有普遍的时代。所以我可以和我的小伙伴们一起玩耍,同时发明属于我们的...

  • iOS开发编码规范小结

    规范编码可以提高代码的可读性,降低维护成本。作为一个程序员,要对自己写的代码负责,虽然bug无可避免,但是写代码时最基本的编码规则还是应该遵守的,否则不是坑自己就是坑别人,因为代码肯定是要维护的。 下面...

  • 汉字风格迁移篇--KAGAN:一种中国诗歌风格转换的方法

    汉字体例转移方法备受关注,如基于卷积神经网络(cnn)的方法,如Rewrite[7]和作者后来改进的方法Zi2zi[8],该方法使用...这些方法大多集中在单个汉字形象上,而忽略了像中国诗歌形象那样对汉字整体形象风格转换的需求。

  • 《鸟哥的Linux私房菜》简评

    《鸟哥的Linux私房菜》简评 这段时间都在阅读和学习《鸟哥的Linux私房菜》,到今天总算是通读了一遍,并将学习新得总结为一个系列博文Linux 之旅。 现在可以总结下这本书了,或许会为想通过这本书学习Linux的同学...

  • 图像风格迁移-DSTN

    为了克服这一限制,我们提出了一种统一的体系结构,即领域感知风格传输网络(DSTN),它不仅从给定参考图像传输风格,还传输域的属性(即域性)。为此,我们设计了一种新的域性指标,该指标从参考图像的纹理和结构...

  • 《python爬爬乐》入门篇:语法基础和编码规范

    python爬虫 这一篇有点枯燥,如果现在没兴趣或看不下去,也没关系,在后面的编程中,我们会反复使用这些基础语法。...标识符类似日常生活中给菜取名字,土豆丝炒肉丝取名叫“土豆肉丝”,土豆和肉...

  • 技术栈:小菜前端的技术栈是如何规划和演进的

    本文 Scott 以管理者的视角,与大家分享下我自 2017 年 7 月入职小菜后,与前端同学一起是如何规划团队的技术栈的,这条技术栈上的技能点又是如何在不同童鞋不同业务中生长出来的。 Scott 近两年无论是面试还是线...

  • Python3,掌握这20个小技巧,小菜鸡瞬间变成老码农~

    日常编码过程中,总结的一些小技巧,涉及到: csv文件,迭代工具,计数器,模块耗时,定向输出等操作

  • 软件工程(C编码实践篇)学习总结

    班级:软设4班 学号:SA17225449 姓名:杨双 网易云昵称:youyouyouyouyou 原创作品转载请注明出处 我的Github地址:...《软件工程(C编码实践篇)》MOOC课程:http://mooc.study.163.com/course/USTC-100000

  • Java swing + socket + mysql 五子棋网络对战游戏FiveChess.zip

    五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

  • 纯C语言实现的控制台有禁手五子棋(带AI)Five-to-five-Renju.zip

    五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

Global site tag (gtag.js) - Google Analytics