我们在阅读一些优秀项目的源码时,一定会感叹他们代码的整洁和一致性。而作为第一印象,代码格式的整齐是让人能够继续阅读下去的动力。今天我们分别从垂直格式和横向格式两个方面来讨论代码的格式。修正格式的方法有:间隔、靠近和调整顺序。

垂直格式

在垂直格式方面,我们要向报纸的排版学习。

首先有一个标题告诉你这栏新闻要讲什么,好让你知道是否要继续阅读下去。对应到代码中就是类的名字,我们要力求只通过名字就可以知道这个类要描述什么事情;然后,代码的第一段往往都交代了整个故事的概要,类似于代码中的接口,我们往往通过接口了解类中有哪些函数,每个函数都是干什么的。了解了这些之后,才会去读详细的内容。

newspaper code
标题 类名
第一段 接口
内容 方法体

此外,还需要注意的就是报纸的排版、段落和段落之间用空行做间隔。写代码也可以用同样的方式,例如,我们习惯于在包声明、导入声明和每个函数之间用空白行来分隔。我们直接拿代码来解释。

package com.thoughtworks.selenium;import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.internal.IResultListener;import java.io.File;public class ScreenshotListener implements IResultListener {File outputDirectory;Selenium selenium;public ScreenshotListener(File outputDirectory, Selenium selenium) {this.outputDirectory = outputDirectory;this.selenium = selenium;}public void onTestFailure(ITestResult result) {Reporter.setCurrentTestResult(result);try {outputDirectory.mkdirs();File outFile = File.createTempFile("TEST-" + result.getName(), ".png", outputDirectory);outFile.delete();selenium.captureScreenshot(outFile.getAbsolutePath());Reporter.log("<a href='" +outFile.getName() +"'>screenshot</a>");} catch (Exception e) {e.printStackTrace();Reporter.log("Couldn't create screenshot");Reporter.log(e.getMessage());}Reporter.setCurrentTestResult(null);}
}
package com.thoughtworks.selenium;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.internal.IResultListener;
import java.io.File;
public class ScreenshotListener implements IResultListener {File outputDirectory;Selenium selenium;public ScreenshotListener(File outputDirectory, Selenium selenium) {this.outputDirectory = outputDirectory;this.selenium = selenium;}public void onTestFailure(ITestResult result) {Reporter.setCurrentTestResult(result);try {outputDirectory.mkdirs();File outFile = File.createTempFile("TEST-" + result.getName(), ".png", outputDirectory);outFile.delete();selenium.captureScreenshot(outFile.getAbsolutePath());Reporter.log("<a href='" +outFile.getName() +"'>screenshot</a>");} catch (Exception e) {e.printStackTrace();Reporter.log("Couldn't create screenshot");Reporter.log(e.getMessage());}Reporter.setCurrentTestResult(null);}
}

是不是适当增加空白行就提高了代码的可读性呢,这里说的是适当增加空白行,并不代表随意增加。事实上,如果增加一些无意义的空白行反而会使代码的可读性变差。

我们习惯于使有关联的代码彼此靠近,无明显关联的代码相互分隔。因此我们不但需要使用空白行间隔代码,还要调整代码位置,把有关联的代码放在一起,通常我们把被调用的函数放在调用函数的下面。这样别人在读我们的代码的时候再也不用经历来回“跳跃”的痛苦了。

最后,我们通常把实体变量定义在类的顶部,这个只是我们Java程序员的习惯操作,如果突然在类的中间位置出现一个变量声明会让人觉得很奇怪。如果你想说,定义在中间是不想让定义位置和调用位置离太远,那么只能说明你的类定义出现了问题。建议你看一下旧文代码洁癖系列(三):整洁的类和函数。

横向格式

介绍完垂直格式,紧接着自然要来介绍一下它的兄弟,横向格式。或许你会问为什么不叫水平格式,我的回答是:也可以叫水平格式,只要你喜欢。横向格式也是需要间隔和靠近的,这里的间隔主要是为了起到强调的效果。举个例子。

int lineSize = line.length();

这里等号两边的空格分别是为了强调左右两边的元素。横向格式另一个比较重要的元素就是缩进,Java程序对缩进没有强制性要求,而Python程序对缩进的要求非常严格,稍有不慎,执行的结果就会不同。但是Java程序员也要注意缩进,因为我们的代码是层级关系,而缩进可以帮我们快速理清层级关系。

最后,横向代码格式对每行代码长度是有要求的,如果代码过长,那么在阅读的时候就需要左右滑动,而这个操作其实是不受人喜欢的。虽然现在代码编辑器可显示的长度变大了,但我们还是习惯每行代码最多100个字符。

团队的规则

每一个优秀的团队都已一套属于自己的代码格式要求,有些是特定的,有些是使用公共的。我们team所用的代码规范就是Google的代码规范,阿里的代码规范也是比较被大家认可的。这里给大家一个小福利,在我的公众号后台回复【代码规范】,就可以获得一份阿里的Java开发手册。

代码洁癖系列(五):外在的格式美相关推荐

  1. 代码洁癖系列(八):迭代的原则

    我们都知道,一个软件的维护成本往往要高于其研发成本.在维护过程中,我们的代码需要不断的进行迭代.迭代的目的有两个:修复bug和增加新特性.但是迭代也会带来一系列新的问题,比如新的bug,或者是破坏代码 ...

  2. 代码洁癖系列(一):什么是整洁代码

    作为一个代码洁癖患者,我最大的愿望就是世界和平--对不起,拿错剧本了,最大的愿望就是将对代码的洁癖传播给每一个人,净化所有的代码.这是一个宏大的愿望,但我会一直努力净化我所看到的每一行代码,并且希望能 ...

  3. 代码洁癖系列(六):处理错误

    程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一.那么处理错误和代码整洁有什么关系呢? 前面我们提到过,try-catch代码块会破坏代码的结构 ...

  4. 代码洁癖系列(三):整洁的类和函数

    前面我们讨论了什么样的命名更能够让你赏心悦目,今天来讨论一下面向对象编程过程中最重要的环节,编写类和函数.我们仍然用Java来演示,什么样的类和函数才算是整洁的. 首先讨论函数,函数定义好了,类也就容 ...

  5. 代码洁癖系列(七):单元测试的地位

    在许多程序员眼中,单元测试似乎是可有可无的,觉得这应该是测试人员的工作.实际上,测试代码和生成代码同样重要.我们不但需要测试代码,而且需要的是整洁的测试代码. 测试为什么要整洁 我们对待测试代码需要像 ...

  6. 代码洁癖系列(四):可忽略的注

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  7. 代码洁癖系列(四):可忽略的注释

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  8. 代码洁癖系列(二):命名的艺术

    不知道大家还记不记得<家有儿女>里有这么一段经典台词:"我叫夏雪","我叫夏雨","我叫夏冰雹". 刘星自己给自己起的名字承包了 ...

  9. 代码洁癖症的我,学习 Lint 学到心态爆炸

    本文由 GitCode8 授权投稿 原文链接:https://juejin.im/post/5d307615f265da1b6b1d0dd9 前言 以前对下面的问题,我的态度是,不报错就是没问题,报错 ...

最新文章

  1. 【SQL Server学习笔记】SQL SERVER 视图
  2. 百度如何能实时检索到15分钟前新生成的网页?--转
  3. spark Rdd 操作transformaction和action等
  4. 自动机理论、形式语言和计算导论提纲
  5. 【代码收集】提前载入贴图
  6. wxpython 优秀的界面_wxPython图形用户界面
  7. [原]浅谈几种服务器端模型——反应堆模式(epoll 简介) - _Boz - 博客园
  8. Drug X跨越鸿沟:一个生物科学家的新药研发跋涉记
  9. Appfuse 开发环境搭建
  10. 人机交互-10-交互设计模型
  11. word 文档密码 html,Word文档密码解决打开方法
  12. 简信CRM:超实用的移动CRM选型参考指南
  13. 每天记账,是穷人才会做的事?
  14. FBI网站被黑致数据泄露?官方称这根本是个骗局
  15. 微信小程序radio单选框如何修改宽高及选中样式
  16. matlab如何看线性趋势线,matlab自动画趋势线指标公式
  17. 关于遇到PermissionError: [Errno 13] Permission denied:···这个问题
  18. 安徽师范大学计算机与信息学院院长,罗永龙
  19. 天猫精灵 python_树莓派通过snowboy唤醒引擎(Python2、Python3的都可以),自定义唤醒词、关键字,达到小爱同学、天猫精灵一样的唤醒方式的全套教程...
  20. matlab培训2018年暑假,2016暑假建模培训Matlab小作业

热门文章

  1. 如何进行系统性能优化
  2. 初涉iOS逆向工程:免越狱修改微信(外观篇)
  3. video 标签 禁止下载 亲测有效 隐藏按钮 三个点 亲测有效
  4. NLP自然语言处理之基于BiLstm的短文本情感分析
  5. python赋值语句(解包赋值、多目标赋值及共享引用)
  6. 第四十五章 SQL函数 DATEPART
  7. STK使用(一):时间系统说明
  8. 单片机控制LCD1602显示屏动态显示字符串
  9. 单片机人体感应灯c语言,单片机光控人体感应灯案例.doc
  10. java大顶堆小顶堆使用案例