前言
前一段时间,我的同事跳槽,入职了一家2000人左右的电商公司(其中研发15人),研发人员主要开发公司的仓储管理平台,项目是21年启动的。而他一个二本毕业的,在研发人员中学历最高。
他吐槽说,有一个同事不是计算机相关专业的,参加了java培训班,现在有4年工作经验,代码写得跟屎一样,并且给我发了一张代码截图。
这段代码大约40行,不工整的地方就有10+,主要存在两个问题:1、运算符两侧不加空格;2、无效的空行。
在我的认知中,编写整洁的代码是一个程序员的基本素养。那么什么样的代码才算是好的代码呢?结合最近买的《代码整洁之道》一书,以及我大学和工作中学到的一些东西,以下是我的一些见解。
1.空格
赋值等号两侧必加空格
// 等号两侧加空格intscore=100;运算符两侧必加空格
// 算数运算符两侧加空格 + - * / %doubletriangleArea=0.5*a*h// 为了表示运算的优先级,有时乘除不加空格 * /doublediscriminant=b*b-4*a*c;// 关系运算符两个加空格 == != > >= < <=if(score>=60){}// 逻辑运算符两侧加空格 && ||if(student!=null&&student.studentName!=null){}方法、构造方法的定义及其调用,参数逗号之后空格
Circle(intcenterX,intcenterY,doubleradius){// ...}doublegetArea(doublea,doubleb,doubleh){return0.5*(a+b)*h;}for循环的分号之后加空格
for(inti=0;i<100;i++){}2.空行
方法和方法之间加一行空行,属性和属性之间不加空行。
publicclassPoint{privateIntegercenterX;privateIntegercenterY;Point(IntegercenterX,IntegercenterY){this.centerX=centerX;this.centerY=centerY;}publicIntegergetCenterX(){returncenterX;}publicvoidsetCenterX(IntegercenterX){this.centerX=centerX;}publicIntegergetCenterY(){returncenterY;}publicvoidsetCenterY(IntegercenterY){this.centerY=centerY;}}不合理的空行
// 加空行的目的是为了让代码阅读更清晰,乱加空行导致代码看起来很长,无用行可以删除。while(b==0){System.out.println("分母不可以为0,请重新输入!");b=scanner.nextDouble();}合理的空行
// 如果在业务中有两件或者多件要处理的事,可以在这之间加个空行,这是可以理解并且合理的publicstaticvoidmain(String[]args){Catcat=newCat("汤姆");cat.eat();cat.run();Dogdog=newDog("旺财");dog.eat();dog.run();}3.命名
list 命名以 xxxList 结尾
map 命名以 xxxMap 结尾
List<Student>studentList=newArrayList<>();Map<String,Student>studentMap=newHashMap<>();全大写下划线(HELLO_WORLD):通常用于常量声明
帕斯卡命名法(HelloWorld):通常用于类名
驼峰命名法(helloWorld):类的属性,方法,方法参数,变量
菜鸟教程官网也有马虎的时候 ↓
4.边界
行边界:显示器的大小是有限的,若是一行代码太长,需要拖动滚动条才可以查看行尾的代码,非常不方便,行边界以编译器右侧的竖线为准(一般是120个字符)
一行代码过长可以适度换行
publicStudentgetStudent(StringpkStudent,StringstudentName,StringstudentPhoneNumber,Integersex,IntegerisDelete){// TODO}行数:同样,代码行数也不宜过长,方法的大小应该尽可能短小。
5.循环
减少循环层数,以减少时间复杂度。
点击查看代码示例
6.无用代码和死代码
未被使用到的包、类、方法、接口、变量等,在编译器中代码颜色会变深色,应该删除
死代码就是永远不会运行的代码,用软件测试的话说,就是路径覆盖永远不会走到的地方,应该删除
publicclassDeadCodeExample{publicstaticvoidmain(String[]args){booleansomeCondition=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相比
publicvoiddemoMethod(booleanisStudent){if(isStudent==true){System.out.println("Student");}}优化后:
publicvoiddemoMethod(booleanisStudent){if(isStudent){System.out.println("Student");}}示例2:常量.equals(变量)√,变量.equals(常量)×,
if(name.equals("阿祖")){// TODO}优化后:
if("阿祖".equals(name)){// TODO}示例3:即使if后只有一条要执行的语句,也应该加上{}
publicvoiddemoMethod(Stringsex){if("男".equals(sex))System.out.println("我是男生");elseif("女".equals(sex))System.out.println("我是女生");elseSystem.out.println("我是谁?我在哪?")}优化后:
publicvoiddemoMethod(Stringsex){if("男".equals(sex)){System.out.println("我是男生");}elseif("女".equals(sex)){System.out.println("我是女生");}else{System.out.println("我是谁?我在哪?")}}循环内只有一条语句也一样加上{}
publicvoiddemoMethod2(){for(inti=1;i<10;i++){for(intj=1;j<=i;j++)System.out.print(j+"*"+i+"="+i*j+"\t");System.out.println();}}优化后:
publicvoiddemoMethod2(){for(inti=1;i<=9;i++){for(intj=1;j<=i;j++){System.out.print(j+"*"+i+"="+j*i+"\t");}System.out.println();}}总结
(本文持续更新中。。。)