clean_code总结

有意义的命名
1、名副其实
2、避免误导,eg:
1)用accountList来指称一组账号,但是并非是list类型。
2)用小写字母l和大写字母O,容易和1、0误导。
3、做有意义的区分,eg:
1)多个对象命名为a1、a2、a3,完全没有提供正确信息。
2)有一个Product类,还有一个ProductInfo或ProductData,意思没有区别。
4、不要废话
1)table一词永远不要出现在表名中
2)Name比NameString好,因为Name一看就知道会是String类型。
3)程序员怎么知道要调用哪个函数

getAccount()。
getAccounts()。
getAccountInfo()。

4)使用读的出来的名称,
5)使用可搜索的名称,比如,一个变量为e,而e在很多词中包含,在搜索时就要搜索很多了。
6)成员变量前不要加前缀。
7)接口和实现类中,接口用前导字母I被滥用了。宁可对实现类编码。
8)类名和对象名应该是名词,不应该是动词。
9)方法名应该是动词或动词短语。

函数
1、函数应该尽量短小,且只干一件事。
2、if、else、while的代码块中,应该只有一行,多行应抽成一个函数。
3、函数中的语句都要在同一抽象层级上。
4、对于swicth语句,天生就是做多件事,解决方案是将其隐藏在抽象工厂中。
5、函数参数数量应尽量少,为0最好。
6、参数多了,对测试人员各种组合运行案例也很麻烦。
7、如果一个函数的参数有多个,就说明一些参数应该封装为类了。
8、避免使用输出参数。
9、使用异常代替错误码,因为可以从错误处理代码从主路径中分离。
10、把try catch中的代码块抽出来形成函数。
11、使用错误码就意味着某个枚举类,会被很多代码依赖,修改时,所有这些类都需要重新编译和部署。
12、大函数中,应遵循结构化编程规则,代码块只有一个入口、一个出口,意味着每个函数只能有一个return语句,循环中部能出现break、continue,永远不能有goto。

注释
1、不应该通过注释来解决烂代码的难度,应该优化代码。
2、想办法不去写注释。尽量用函数名称传达信息。
3、TODO注释,认为应该做但还没做的注释。

格式
1、package、import、函数与函数间要有空格。
2、函数A调用函数B,则函数A应该放在B的上面。
3、赋值操作,左右两边和运算符之间要有空格。
4、乘法因子间没加空格,是因为它们有较高的优先级,加减间要有空格。
5、制定团队编码风格
1)在什么地方放置括号。
2)缩进几个字符。
3)类、变量、方法等的命名。

异常
1、别返回null值。因为调用者必须添加检查null的逻辑。
2、返回null值,不如抛出异常或是返回特例对象。
3、这样返回list类型的对象,可以避免调用方出现空指针异常。
在这里插入图片描述
4、Collections.emptyList()方法,返回了一个空的List,但是和我们平时用的List是不一样的。这个List是Collections类的静态内部类,继承AbstractList后并没有实现add()、remove()等方法,因此并不能对元素做增删改查。那有什么用呢?主要目的是返回一个不可变的列表,从而不需要自行创建一个新空对象,可以减少内存开销。也使得调用者不需要校验返回值是否为null,所以建议使用。emptySet()、emptyMap()方法同理。

单元测试
1、测试代码和生产代码一样重要。
2、测试代码应整洁,好看。有的时候性能不要求到极致,比如StringBuffer在字符串拼接时,比String好看,但是性能差一点,不要差太多也可以在测试代码中用。
3、每个测试函数只测一个概念。
4、测试的FIRST原则
1)快速(FASF)
2)独立(Independent)
测试函数不能相互依赖
3)可重复(Repeatable)
4)自足验证(Self-Validating)
测试结果要有布尔值输出,不应该依赖自己的判断。
5)及时(Timely)
测试代码应先于生产代码前编写。


1、从上到下,依次是:公共静态常量、私有静态变量、私有实体变量、公共函数。公共函数调用的私有工具方法紧接在这个函数之后。
2、类应只有一条修改的理由。
3、类尽量短小。
4、从一个大函数中抽出一个小函数时,如果这个小函数用到了4个变量,是否要将这些变量都作为形参传递到小函数呢?其实不用,只需要将这4个变量提升为类的实体变量即可。可惜这也让类丧失了内聚性,因为这几个新的实体变量只为这一两个函数所使用,何不把这一两函数拥有自己的类呢。
5、当类丧失了内聚性,就得拆分他。
6、对类的任何修改都有可能破坏类中的其他代码,必须全面再测试。
7、对增加开放,对修改封闭。

迭进
1、测试
2、消除重复
抽取共同代码,甚至采用模板方法模式
3、表达力
4、使类和函数的数量尽量少
这个优先级最低

并发
1、并发缺陷并非总能复现,所以常被看作偶发事件而被忽略。
2、掌握concurrent、atomic、locks这三个包。
3、不同的操作系统有着不同的线程策略。

总结
1、什么方法定义为静态,什么又不应该定义为静态。比如Math.max(double a,double b)被定义为静态方法,因为该方法用到的全部数据来自己传入的两个参数,而不是来自所属对象。但是没机会用到静态方法的多态特征。
2、什么时候将方法定义为静态
1)参数不依赖于所属对象
2)不会用到多态

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值