Skip to content

Latest commit

 

History

History
198 lines (133 loc) · 6.69 KB

clean-code.md

File metadata and controls

198 lines (133 loc) · 6.69 KB

代码整洁

一群猴子在森林上窜下跳,抓着几个酸桃子,得意洋洋的坐在树上,却对自己造成的混乱熟视无睹。

​ —《代码整洁之道》

很荣幸的告诉大家,对于刚入编程大门的我们就是这么一群 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

本节练习

  1. 下面哪几种命名是比较好的命名?

    • var aaa;
    • var b4;
    • var name;
    • var student;
    • var MY_STUDENTS;
    • var mY_Student;
    • function findUserById(){}
    • function finduserbyid(){}
    • class Person{}
    • class PERSON{}

  2. 下面的代码哪一种的可读性更强呢,并思考为什么?

假如一家商场对商品正在进行打折,价格在 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;
}