前言
前一段时间,我的同事跳槽,入职了一家2000人左右的电商公司(其中研发15人),研发人员主要开发公司的仓储管理平台,项目是21年启动的。而他一个二本毕业的,在研发人员中学历最高。
他吐槽说,有一个同事不是计算机相关专业的,参加了java培训班,现在有4年工作经验,代码写得跟屎一样,并且给我发了一张代码截图。
这段代码大约40行,不工整的地方就有10+,主要存在两个问题:1、运算符两侧不加空格;2、无效的空行。
在我的认知中,编写整洁的代码是一个程序员的基本素养。那么什么样的代码才算是好的代码呢?结合最近买的《代码整洁之道》一书,以及我大学和工作中学到的一些东西,以下是我的一些见解。
1.空格
赋值等号两侧必加空格
// 等号两侧加空格
int score = 100;
运算符两侧必加空格
// 算数运算符两侧加空格 + - * / %
double triangleArea = 0.5 * a * h
// 为了表示运算的优先级,有时乘除不加空格 * /
double discriminant = b*b - 4*a*c;
// 关系运算符两个加空格 == != > >= < <=
if(score >= 60) {
}
// 逻辑运算符两侧加空格 && ||
if(student != null && student.studentName != null) {
}
方法、构造方法的定义及其调用,参数逗号之后空格
Circle(int centerX, int centerY, double radius) {
// ...
}
double getArea(double a, double b, double h) {
return 0.5 * (a + b) * h;
}
for循环的分号之后加空格
for (int i = 0; i < 100; i++) {
}
2.空行
方法和方法之间加一行空行,属性和属性之间不加空行。
public class Point {
private Integer centerX;
private Integer centerY;
Point(Integer centerX, Integer centerY) {
this.centerX = centerX;
this.centerY = centerY;
}
public Integer getCenterX() {
return centerX;
}
public void setCenterX(Integer centerX) {
this.centerX = centerX;
}
public Integer getCenterY() {
return centerY;
}
public void setCenterY(Integer centerY) {
this.centerY = centerY;
}
}
不合理的空行
// 加空行的目的是为了让代码阅读更清晰,乱加空行导致代码看起来很长,无用行可以删除。
while(b == 0) {
System.out.println("分母不可以为0,请重新输入!");
b = scanner.nextDouble();
}
合理的空行
// 如果在业务中有两件或者多件要处理的事,可以在这之间加个空行,这是可以理解并且合理的
public static void main(String[] args) {
Cat cat = new Cat("汤姆");
cat.eat();
cat.run();
Dog dog = new Dog("旺财");
dog.eat();
dog.run();
}
3.命名
list 命名以 xxxList 结尾
map 命名以 xxxMap 结尾
List<Student> studentList = new ArrayList<>();
Map<String, Student> studentMap = new HashMap<>();
全大写下划线(HELLO_WORLD):通常用于常量声明
帕斯卡命名法(HelloWorld):通常用于类名
驼峰命名法(helloWorld):类的属性,方法,方法参数,变量
4.边界
行边界:显示器的大小是有限的,若是一行代码太长,需要拖动滚动条才可以查看行尾的代码,非常不方便,行边界以编译器右侧的竖线为准(一般是120个字符)
一行代码过长可以适度换行
public Student getStudent(String pkStudent, String studentName,
String studentPhoneNumber, Integer sex, Integer isDelete) {
// TODO
}
行数:同样,代码行数也不宜过长,方法的大小应该尽可能短小。
5.循环
减少循环层数,以减少时间复杂度。
点击查看代码示例
6.无用代码和死代码
未被使用到的包、类、方法、接口、变量等,在编译器中代码颜色会变深色,应该删除
死代码就是永远不会运行的代码,用软件测试的话说,就是路径覆盖永远不会走到的地方,应该删除
public class DeadCodeExample {
public static void main(String[] args) {
boolean someCondition = false;
// 下面的if语句中的代码块由于someCondition为false,因此是死代码
if (someCondition) {
System.out.println("这段代码是死代码,因为someCondition为false");
// 这里还可以有更多的代码,但都不会被执行
}
}
}
7.if条件和语句放在同一行
有一些人写代码会压行,把if条件和语句写在同一行,这样是不利于代码阅读的,也不利于调试
if (StringUtils.isEmpty(studentName)) studentName = String.valueOf(po.getStudentName());
应该为语句加上括号,并且换行。优化:
if (StringUtils.isEmpty(studentName)) {
studentName = String.valueOf(po.getStudentName());
}
8.常见的糟代码及其优化
示例1:布尔值不应该和true或者false相比
public void demoMethod(boolean isStudent) {
if(isStudent == true) {
System.out.println("Student");
}
}
优化后:
public void demoMethod(boolean isStudent) {
if(isStudent) {
System.out.println("Student");
}
}
示例2:常量.equals(变量)√,变量.equals(常量)×,
if(name.equals("阿祖")) {
// TODO
}
优化后:
if("阿祖".equals(name)) {
// TODO
}
示例3:即使if后只有一条要执行的语句,也应该加上{}
public void demoMethod(String sex) {
if("男".equals(sex))
System.out.println("我是男生");
else if ("女".equals(sex))
System.out.println("我是女生");
else
System.out.println("我是谁?我在哪?")
}
优化后:
public void demoMethod(String sex) {
if("男".equals(sex)) {
System.out.println("我是男生");
} else if ("女".equals(sex)) {
System.out.println("我是女生");
} else {
System.out.println("我是谁?我在哪?")
}
}
循环内只有一条语句也一样加上{}
public void demoMethod2() {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++)
System.out.print(j + "*" + i + "=" + i * j + "\t");
System.out.println();
}
}
优化后:
public void demoMethod2() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + "\t");
}
System.out.println();
}
}
后记
后来,这位老兄干了一个月就跑路了,离职那天,下班路上,碰到了招他进来的hr妹妹。
“你为什么也是没转正就要离职呀,是因为通勤太长吗?”
“不是。”
“工作压力太大?还是薪资不满意?”
“都不是。”
他看了看身后的公司,又看了看远处的夕阳和脚下这条年久失修的石板路,点起了一支烟。
“我想成为更优秀的程序员。”
“那,祝你成功吧!”
(本文持续更新中。。。)