整洁的代码,程序员的基本素养

前言

前一段时间,我的前同事跳槽,入职了一家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.命名

常量:全大写下划线,并且采用final修饰

final int DAYS_OF_LEAP_YEAR = 366;

类名:采用帕斯卡命名法
属性:驼峰命名法
方法:驼峰命名法
方法参数:驼峰命名法

public class Student {
	String studentName;
	
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
}

菜鸟教程官网也有马虎的时候 ↓

在这里插入图片描述

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.常见的糟代码及其优化

示例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(常量)×,

public void demoMethod(String name) {
	// 当name==null,以下代码会报空指针错误
	if(name.equals("阿祖")) {
		System.out.println("我是阿祖");
	} 
}

优化后:

public void demoMethod(String name) {
	// 即使name==null也不会报空指针错误
	if("阿祖".equals(name)) {
		System.out.println("我是阿祖");
	} 
}

示例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妹妹。
“你为什么也是没转正就要离职呀,是因为通勤太长吗?”
“不是。”
“工作压力太大?还是薪资不满意?”
“都不是。”
他看了看身后的公司,又看了看远处的夕阳和脚下这条年久失修的石板路,点起了一支烟。
“我想成为更优秀的程序员。”
“那,祝你成功吧!”

(《代码整洁之道》这本书我还没读完,之后会陆续补充完善这个文档,本文持续更新中。。。)

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值