编写程序——代码的排版

摘要:
有意思的是,在计算机发展的早期,那些程序员也会因为存储的限制而牺牲代码的排版,算是殊途同归。说白了,代码的维护者就你写的代码的用户,需要给他们提供好的用户体验。给阅读代码的人提供好的“用户体验”其实是个很大的命题,比如符号的命名、高质量的抽象数据结构和子程序的设计等等,这里只说说代码的排版问题,不然不仅要扯地天昏地暗,还可能会扯到蛋:)。
代码排版是每个软件工程师都要面对的问题。好的排版不仅可以让读代码的人感到赏心悦目,更重要的是可以从代码格式中发现程序的内在逻辑结构。这就好像文章、博客的一样,它们会通过分段、空白行、标点符号等各种元素来体现文章内在结构,从而提升读者的阅读体验。试想,阅读这两句话“子曰见贤思齐靥见不贤而内自省也”与“子曰,见贤思齐靥,见不贤而内自醒也”,有多大的差异。我们的古书没有版式和标点,有一部分原因是古书记录在在竹木简上,省去标点可以减少记录的成本。有意思的是,在计算机发展的早期,那些程序员也会因为存储的限制而牺牲代码的排版,算是殊途同归。幸好,现在这两个问题都已经不复存在。
编写程序——代码的排版第1张
其实有很多软件工程的经典书籍都会有专门的章节来讲这个问题,像《代码大全》、《简洁代码》及各种语言的入门书籍,维基百科上关于Programming Styles的词条甚至列出了大部分主流编程语言需要注意的风格。不过在我看来,最重要的一点是程序员在写代码时候,一定要以几及彼的想想当自己来阅读这样的代码时是什么感觉。我们写的代码最终不仅要发布给计算机的编译器、发布给我们的客户,还要发布给代码的维护者。他们拿到代码,首要目的是想花更少的时间、更快的理解这份代码有什么功能。说白了,代码的维护者就你写的代码的用户,需要给他们提供好的用户体验。

给阅读代码的人提供好的“用户体验”其实是个很大的命题,比如符号(函数、变量)的命名、高质量的抽象数据结构和子程序的设计等等,这里只说说代码的排版问题,不然不仅要扯地天昏地暗,还可能会扯到蛋:)。从我的定义,代码排版主要指的是通过使用空行、空白符,对单个源文件中代码组成元素进行空间布局——横向空间布局和纵向空间布局。横向空间布局上比较简单,我会遵循传统的原则——代码行的字符数不超过80个字符,这个很容易理解,主要是为了避免在阅读长代码时需要在编辑器中横向来回拖动窗口。对于纵向空间布局,这里以C语言为例,C代码代码的组成元素包括:
  • 注释文件头,File Header
  • 依赖头文件,Dependency File
  • 外部变量和函数,Extern Definition / Declaration
  • 宏定义,Macro Definition
  • 类型定义,Type Definition
  • 全局变量和函数定义和声明,Global Definition/ Declaration
  • 私有变量和函数定义和声明,Internal Definition / Declaration
  • 函数实现,Function Implementaion
通常我会在源文件中按照上诉列表的顺序依次布局各个部分的内容。具体到每个单独的部分,可遵循的有几个原则:1)按照首次使用的顺序来排放;2)并列关系按照字母序来排放;3)按照关系的亲疏排放位置。这样主要有几个好处,一是对代码的排版建立统一的约定,日后你自己或者维护你代码的同志看代码时,可以到文件对应的位置寻找相应的内容,例如你可能想看一下宏定义在哪里,就一个快速索引到它是在外部变量的声明后面,等等。其二是这样的布局也比较符合我们的思维习惯,通常我们首次打开某个源文件时,会看一下头文件的Revision History,然后跳到某个函数的入口,然后按照树的广度优先遍历依次看完代码调用树。按前述,函数的实现布局看起来像下面图示的那样:
编写程序——代码的排版第2张
这是我对于代码排版整体布局的一个经验,但代码排版可以讨论的内容远不止这一点。你肯定在BBS上见过很多人为了指针类型标识符’*'是靠近类型比较好呢、还是靠着变量符号比较好呢之类的问题争得面红耳赤,还比如还比如…太多了。更甚的是,在实际软件生产过程中,我们更多要面对的是你和其他人的排版美学产生冲突是,你如何在信仰与现实之间折中之类的问题

免责声明:文章转载自《编写程序——代码的排版》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇文件上传Linq 左连接 left join下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

GIS中的数据库.gdb与.mdb的区别

Gdb是文件地理数据库,mdb是个人地理数据库,两者都是数据库文件类型。个人地理数据库是基于access数据库的个人数据库格式mdb,可存储不超过2G的文件,仅适用于Windows系统;文件数据库是保存在文件系统文件夹中的各种类型的GIS数据集的集合。请参阅文章“GIS中database.gdb和.mdb之间的区别是什么?”,m892832piczpec5。...

JQuery 导入导出 Excel

正在做一个小项目,从数据库中查询数据放在HTMLTable中.现在想要从这个table中导出数据来.另外用户需要选择导出的列.使用jQuery的导出插件可以完成这个需求.jQueryPlugintoExportHTMLTables例子:导入插件:[javascript]viewplaincopy˂/scr...

wxparse使用(富文本插件)

优点:唯一已知的可以将HTML转换为小程序识别的插件缺点:转换HTML标签可能需要大量的微信小程序标签和样式配置:步骤1,下载https://github.com/icindy/wxParse第二步:把它放到项目中。我选择页面目录。步骤3:配置wxml以添加:需要时使用:...

通过QQ邮箱的SMTP服务器发送QQ邮件至163邮箱提示“发送邮件失败”的解决方案(三种可能性,不妨一试)

发件人:QQ邮箱收件人:163邮箱基于上述开发平台。下面列出了通过QQ邮箱的SMTP服务器向163邮箱发送QQ邮件的三种可能的解决方案,提示“发送邮件失败”。您可以尝试在163邮箱的反垃圾邮件选项中设置白名单。如果您取消SMTP服务,然后再次选中“启用”,或尝试使用该帐户在其他地方发送邮件,这可能有助于从QQ邮箱解锁帐户(待测试。我将不负责测试这种可能性导致...

Web.config

在本文中,我们将解决以下问题:什么是网络。配置文件?网络的影响是什么。部署时的配置?一般来说,网络。config文件包含运行ASP所需的所有配置信息。NET应用程序。当然,配置文件并不包含所有配置。服务器范围的配置文件还包含applicationHost.config。...

Windows 上的 C++ 编译器

Windows上的C++编译器主要有:MinGW(MinimalistGNUforWindows)TDM-GCC(TDM是TwilightDragonMedia的缩写)Mingw-w64(AWindowscompilersuitecombiningthemostrecentGCCcompilerwiththefreeandopen-sourceMinGWor...