代码整洁之道学习笔记

代码整洁之道读书笔记

一、有意义的命名

  1. 名副其实

表示产品A上线时间剩余天数

// 差
int d;

// 一般, 但和差一样, 不知道天数的作用
int day;

// 好
int remainDaysBeforeOnline;

获取水果订单中所有的id为4的苹果订单

// 差
List<int[]> list1 = new ArrayList<int[]>();
for(int[] x : theList){
    if (x[0] == 4){
        list1.add(x)
    }
}
return list1;

// 好
List<int[]> appleOrders = new ArrayList<int[]>();
for(int[] orderItem : allFruitOrder){
    if(orderItem[idIndex] == APPLE_ID){
        appleOrders.add(orderItem)
    }
}
return appleOrders;

// 更好
把 orderItem[idIndex] == APPLE_ID 抽离成函数
isAppleOrder()

  1. 避免误导
  • 不用非通用的缩写: ht, aix, sco
  • 不用accountList 表明账户列表,list 常有特殊意义,除非这确实是一个List类型
  • 不使用字母i,o,l 来表示变量,因为会和1,0数字混
  1. 做有意义的区分
  • a1,a2,a3无意义
  • 类Product 和 ProductInfo 和 ProductData 无区分,是意义含混的废话。只取Product
  • nameString 和 name 无区分,因为name不可能是浮点
  • Customer和CustomerObject无区分,取Customer

要区分,就要取读者能够区分的不同单词

  1. 使用读得出来的单词
// 差
class DtaRcrd102 {
    private Date genymdhms;
}

// 好
class Customer {
    privateDate generationTimestamp;
}
  1. 使用可搜索的名称

MAX_GIRL_AGE 就比 8 要好,因为前者可搜索,一般不重复,后者到处都有

  1. 类名应该是名词或名词短语如Customer, Account, Address 而不应该使用Manager Data Info
  2. 方法名应该是动词或动词短语如postPayment, deletePage,
  3. 每一个概念对应一个词

二、函数

  1. 短小

能有多小,就多小

  1. 只做一件事,做好这件事
  1. 每个函数一个抽象层级

getHtml() 较高抽象层

encodePath() 中级抽象层

appendString() 低级抽象层

同一个抽象层的东西,写到一些,不要高级中又大量混入低级。

应该是高级调用中级,中级调用低级,从上到下依次

  1. 函数参数

参数越少越好,最好的是0参数,第二好的是1参数,超过3个参数,就要反省了

  1. 标识参数
// 差
render(true);
render(false);

// 中
render(Boolean isSuite);

// 好
renderForSuite();
renderForSingleTest();
  1. 如果参数超过3个,则要考虑将参数封装为类了
  2. 动词和关键字

assertEqual(expected, actual); 使用者往往不知道参数的顺序先后。

assertExpectedEqualActual(expected, actual); 这样会更好一些,因为从函数名就可以知道参数先后。

但我觉得现在的ide已经能将参数名显示出来,那简短的名字将更好。

  1. 分隔指令与询问,函数要么做事,要么回答问题,不要即做事又回答问题。
  2. 使用异常替代返回错误码

如果使用异常替代返回错误码,那么代码分离,使代码得到简化。如果返回错误码,那得到错误码的人又得处理错误

  1. 抽离try/catch代码块
// 一般
try{
    deletePage(page);
    register.deleteReference(page.name)
        ...
}catch{
    ...
}

// 好,抽离try/cache
try{
    deletePageAndReference(page)
}catch{
   ...
}

deletePageAndReference(page){
    deletePage(page);
    register.deleteReference(page.name)
    ...
}
  1. 错误处理就是一件事
  2. 错误码,依赖磁铁,不好

就是定义错误码的类,导致其他的许多类都要导入和使用他,一但他改变,所有地方都要重新编译。而新异常可以从异常类中派生出来,无需要重新编译或重新部署。

  1. 如何写出优秀的函数

几乎没有可能一开始就写出优秀的函数,高手也是先把函数,逻辑,代码写出来,命名,规则,等都不那么完美。等写完了,再来一步一步分离,拆解,优化,重命名!!!!

三、错误处理

  1. 使用异常而非返回码
  2. 别返回null

因为返回了null,则调用者要检查返回是否为null,不然就会报空指针错误。

有错误就应该抛出异常或返回特例对象。

其实可以返回空数组,空字符串等,都比null要好。

  1. 别传递null值
  2. 把错误提取,独立处理,别混在正常业务代码中

四、边界

  1. 学习性测试

在使用第三方库时,我们没必要为第三方库写测试,测试应该由第三方库来负责。但我们又在使用他们的代码。我们可以为我们使用到的部分的第三方库代码做测试。相当于边学习,边测试。

  1. 使用尚不存在的接口

我认为其实就是把方法造出来,写一下模拟数据,进行mock,当尚不存在的接口开发好后,再接进来。

  1. 测试代码和生产代码一样重要。

当我们在程序还小的时候,不写测试代码,只是自己执行一下,看看是否有问题。

当程序大的时候,已经没办法一项一项的测试过去。我们修改了一处代码,引发了其他处代码的未知错误。

单元测试越完整,修改才越大胆和快速。不然你总是会害怕改代码。

  1. 单元测试的好处,让代码可扩展,可维护,可复用

五、类

  1. 类应该短小

系统应该由许多短小的类组成,而不是少数几个庞大的类组成。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 一、整洁代码 A.混乱的代价 1.有些团队在项目初期进展迅速,但有那么一两年的时间却慢去蜗行。对代码的每次修改都影...
    ZyBlog阅读 2,014评论 0 2
  • 童心 是一颗光的种子 在沉寂的泥土里扎根 绽放璀璨的花 童心 是一颗晶莹的露珠 在晨曦的草尖上坚守 静候初升的太阳...
    艾弥儿阅读 442评论 9 22
  • 我是谁 我能说我此时此刻是无限无限无法言喻无法用文字描述这三个字吗?但它的确是我自有记忆和思维开始就想过的:我是谁...
    我爱深蓝的蓝阅读 190评论 0 0
  • 闲话不多少,还是老套路,处理一个登陆的业务。详细的介绍MVVM我就不多说了,网上一大把,毕竟吹水还是我的弱项。主要...
    Hacknife阅读 14,537评论 9 41