文章阅读-2周-What I learned from doing 1000 code reviews

What I learned from doing 1000 code reviews
文章作者从以往代码审核的经验角度提出三个建议

建议1、Throw an exception when things go wrong(当程序出现错误时,抛出一个异常)

例如代码:

List<String> getSearchResults(...) {
  try {
    List<String> results = // make REST call to search service
    return results;
  } catch (RemoteInvocationException e) {
    return Collections.emptyList();
  }
}

核心内容:该建议主要讨论在某些查询功能中,当前程序发请求到后台获取数据时,后台跑出异常。
程序是返回一个空对象(null、空集合等等),还是抛出异常?

场景1:查询交易,如果上游出现报错,下游捕获只返回空对象。
问题:前端只收到查询成功,且收到空查询结果。导致监控程序不能及时发现异常并及时修复问题。

场景2:从字符串解析出URL错误时,直接返回null值。
问题:URL错误问题应该在上游程序修复,不能让来下流程序进行处理。

最终结论:Empty objects are not the right tool for this job. If something is exceptional you should throw an exception(空对象不是一个正确方式针对这种情况。除非有例外清楚,不然就应该抛出一个异常)

个人观点:个人从原则上比较赞同作者观点。有时候返回空对象,下游无法判断具体没有数据,还会异常。而且抛出异常我们尽量区分不同异常。针对某一下流程序来说,捕获到异常不一定意味程序就要中止,存在需要通过异常类型,进行不同逻辑处理。

建议2、Use the most specific type possible(尽可能使用最准确的类型)

作者举例子:

void doOperation(String opType, Data data); 
// where opType is "insert", "append", or "delete", this should have clearly been an enum

String fetchWebsite(String url);
// where url is "https://google.com", this should have been an URN

String parseId(Input input);
// the return type is String but ids are actually Longs like "6345789"

核心内容:使用最准确的类型,这样能够避免一些BUG,且也是基于JAVA作为强类型语言的设计。
具体做法:
外部数据不为准确数据类型:
1、在URLS的参数
2、JSON
3、数据库不支持enums
4、写得不好的库

处理方式:

// Step 1: Take a query param representing a company name / member id pair and parse it
// example: context=Pair(linkedin,456)
Pair<String, Long> companyMember = parseQueryParam("context");
// this should throw an exception if malformed

// Step 2: Do all the stuff in your application
// MOST if not all of your code should live in this area

// Step 3: Convert the parameter back into a String at the very end if necessary
String redirectLink = serializeQueryParam("context");

步骤:
1、获取查询参数 公司名称/成员ID 并解析它。如果数据错误则必须抛出异常。
2、如果不是所有代码都应该存在于此区域,请尽可能地完成应用程序中的所有操作
3、如果有必要,在最后时候把参数转化为String

优化:
1、错误数据会被发现
2、如果出现问题,程序较早失败中止。
3、数据被验证过一次,之后不需要在整个程序都保持捕获解析错误。
4、更加准确访问描述,对应方法的文档内容也减少

个人观点:这个在原来开发习惯中一直没有注意这个问题。尤其属于数据字典类型确实使用enums可以避免很多意外情况,就不用通过if或switch来单独判断,减少很多BUG。

建议3、Use Optionals instead of nulls(使用空容器代表null值)

核心内容:用JAVA 8 提供的Optional来替换null,其中解决最多就是 Null Pointer Exception的问题
使用范围建议:
1、当使用Optional时,就不用考虑对象是否存在或合理默认值。而且随时调用get()方法。
2、如果没有合理默认值,使用map()和 .flatMap()方法,等后面再对对象赋值。
3、如果有外部库返回null表示空结果,则利用Optional.ofNullable来分装这个值。null在程序里面造成影响会慢慢扩大,所以在源头就解决这个问题。
4、使用Optional作为方法返回值,就不需要判断什么时候返回值是不存在。

个人观点:目前还是很少用JAVA 8的Optional对象,需要进一步学习。但是非常赞同作者这个建议,null会导致很多NPE问题

建议4、“Unlift” methods whenever possible(使用空容器代表null值)

需要避免方法如下

// AVOID:
CompletableFuture<T> method(CompletableFuture<S> param);
// PREFER: 
T method(S param);

// AVOID:
List<T> method(List<S> param);
// PREFER:
T method(S param);

// AVOID: 
T method(A param1, B param2, Optional<C> param3);
// PREFER:
T method(A param1, B param2, C param3);
T method(A param1, B param2);
// This method is clearly doing two things, it should be two methods
// The same is true for boolean parameters

这些需要避免方法有什么相同之处呢?
1、入参都是Optional, List, Task。
2、返回参数也是同样的集合(例如入参为Optional,返回参数为Optional)

理由:
方法1:Promise<A> method(Promise<B> param)
方法2:A method(B param)

理由如下:
1、例如当你只有B对象时候,只能调用方法2。
2、方法2重写使得更加灵活、更加容易使用

个人观点:目前还有无法参透这条建议。如果按照作者的建议,对方法进行升级。但是如果过多使用泛型感觉方法的准确度就不高。目前还在理解中。

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,940评论 6 13
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,737评论 0 10
  • 想到什么说什么吧,没有提前构思~~~~四十分钟前就想着要写作业了,但是一想到今天的郑多燕减肥操没跳,写完在跳估计没...
    中艺琴社白璐阅读 254评论 0 0
  • 一 "好漂亮,转个圈我看看。"闺蜜在一旁高兴的说着。 对于闺蜜的要求只好如实照办,即兴在镜子前就转了一圈。 看到镜...
    沁木阅读 601评论 11 10