一群猴子在森林上窜下跳,抓着几个酸桃子,得意洋洋的坐在树上,却对自己造成的混乱熟视无睹。
—《代码整洁之道》
很荣幸的告诉大家,对于刚入编程大门的我们就是这么一群 code monkey
,包括笔者自己在内,当然这不是瞧不起大家,而是每一位步入编程这一"大坑"的同学必须经历的,从一名 code monkey
到一名 “童子军”。
童子军军规: 让营地比你来的时候更整洁
也许大家听过这么一个段子,“一位程序员在写代码时,有两个人可以看懂,一个是上帝,一个是他本人,但是过了一个月后,只有上帝可以看懂他的代码。”如果是一位不懂编程的人听到可能就会想,这个程序员的记忆力也太差了吧,自己写的东西自己都看不懂...... 事实上,这种情况在现实编码中确是时有发生,而且记忆代码本省并不可取,相反的,我们应该编写整洁的代码,让代码本身可以表达出我们本该想要表达的东西,也就是让代码更加的语义化。
所以,在入门的一开始就编写“干净的代码”是非常有必要的,我们可以准守软件开发中的 5S 原则:
- 整理:命名的规范
- 整顿:把你的代码放在它应该在的地方
- 清楚:整洁代码
- 清洁:代码风格、实践手段
- 身美:不断改进
对于萌新来说,我们可能时常可以看到这样的命名
var a = 1;
var b = 2;
var c = 3;
...
虽然看起来非常的“有序”、“整洁”,但是这样会第一时间暴露自己的“萌新”身份,而且当你写完这些代码,第二天可能就只有上帝才能看的懂你的代码了。
其实,定义一个好的名字是非常烧脑的,但却是非常非常重要的,一个好的命名并不一定是一开始就想好的,一旦有了更好的名字,请立刻重构它。
对于命名大致有以下几种类别:
-
变量名、方法名:使用小驼峰法 --- 除第一个单词之外,其他单词首字母大写
eg: var myStudents; function getStudentById(){}
-
类名:使用大驼峰法 --- 所有单词的首字母都大写
eg: class BaseUser{}
-
常量名:每个单词的所有字母都大写,单词与单词之间用
_
连接eg: const BASE_USER = ''
一个好的命名遵循下列的规范:
- 名副其实:不需要被注释也应该被理解、看懂。一个名副其实的命名可以告诉读者:
- 怎么用
- 做什么事
- 为什么存在
- 避免误导:(I 、O),这到底是 I 还是 1,是 O 还是 0;(傻傻分不清)
- 做有意义的区分:
- 不要使用
a1、a2、a3
- 不要说废话(
student
就不要再写成studentInfo
或者studentData
了)
- 不要使用
- 使用读得出来的名称:你应该不想让你的小伙伴把方法名一个字母一个字母的读出来吧
- 使用可搜索的名称:不要使用硬编码,尽量使用常量替代
- 一致的命名规则:比如查找都用
find**
- 不要使用双关语
还记得你写过的几十行甚至上百行的函数吗?也许你没写过,那你一定听过这样一个段子,“又要给××擦屁股了,修改他的代码还不如自己重新写。”其实很大的原因就是函数的语义化做的不够好,导致在读代码的时候更多的是靠猜,而不能像读故事一样愉悦。对于一个整洁的函数,它应该:
- 短小:一个函数不应该超过20行代码,如果超过需要考虑抽取函数
- 每一个函数/方法应该只干一件:这样做也更加有利于命名,当我们看到函数名的时候就可以知道这个方法的功能是什么
- 函数参数:
- 一元参数:有输入应该也有输出
- 二元参数:尽量不要使用,除非参数是有序组成的(new Point(x,y))
- 如果参数个数超过两个,考虑下把参数封装一下在传过去
- 别重复自己:在程序中如果有两个位置用到了相同的代码,那么就要考虑下把相同的代码提取出来在调用这个抽取出来的方法
对于萌新和刚入门编程的我们来说,我们可能会认为应该多写注释,甚至是每一行代码都写注释,下次我们在阅读我们的代码的时候读起来就会更容易。这样听起来其实是非常有道理的,但这也是在变相的“打脸”,告诉别人自己写的代码不怎么样,所以需要用注释来辅助阅读代码。值得肯定的是这样做的目的是好的,为了提高代码的可读性,但是方法上我们可以采取更好的方法来实现这一目标,编写一手具有高可读性的代码。
初次之外,对代码过多的注释其实是在增加我们的编码量,然后这种工作量的增加并不能起到应该起到的作用,因为在维护代码的时候就已经焦头烂额了,更何况是注释了,有谁愿意去长期维护呢?而一旦没人维护,那么当初写的注释就会产生意想不到的“灾难”。
但并不是所有的注释都是“坏”注释,比如
- 法律信息
- 提供信息的注释(时间格式...)
- 对意图的解释
- 警告
- TODO
- 公共 API
-
下面哪几种命名是比较好的命名?
- var aaa;
- var b4;
- var name;
- var student;
- var MY_STUDENTS;
- var mY_Student;
- function findUserById(){}
- function finduserbyid(){}
- class Person{}
- class PERSON{}
-
下面的代码哪一种的可读性更强呢,并思考为什么?
假如一家商场对商品正在进行打折,价格在 100 - 200 之间的打八折,其它的按原价出售
第一种
function calculatePrice(price){
var result;
if (price >= 100 && price < 200) {
result = price * 0.8;
} else {
result = price;
}
return result;
}
第二种
function calculatePrice(price) {
let result;
if (isDiscount(price)) {
result = discount(price);
} else {
result = price;
}
return result;
}
function isDiscount(price) {
return price >= 100 && price < 200;
}
function discount(price) {
return price * 0.5;
}
第三种
function calculatePrice(price) {
if (isDiscount(price)) {
return discount(price);
} else {
return price;
}
}
function isDiscount(price) {
return price >= 100 && price < 200;
}
function discount(price) {
return price * 0.5;
}