刚看到梁飞谈到dubbo为保证代码质量开发人员必须要注意的,其实也是开发人员应该做的。

1. 防止空指针和下标越界

这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常,

这也是一个健状的程序开发人员,在写每一行代码都应在潜意识中防止的异常,

基本上要能确保一次写完的代码,在不测试的情况,都不会出现这两个异常才算合格。

2. 保证线程安全性和可见性

对于框架的开发人员,对线程安全性和可见性的深入理解是最基本的要求,

需要开发人员,在写每一行代码时都应在潜意识中确保其正确性,

因为这种代码,在小并发下做功能测试时,会显得很正常,

但在高并发下就会出现莫明其妙的问题,而且场景很难重现,极难排查。

3. 尽早失败和前置断言

尽早失败也应该成为潜意识,在有传入参数和状态变化时,均在入口处全部断言,

一个不合法的值和状态,在第一时间就应报错,而不是等到要用时才报错,

因为等到要用时,可能前面已经修改其它相关状态,而在程序中很少有人去处理回滚逻辑,

这样报错后,其实内部状态可能已经混乱,极易在一个隐蔽分支上引发程序不可恢复。

4. 分离可靠操作和不可靠操作

这里的可靠是狭义的指是否会抛出异常或引起状态不一致,

比如,写入一个线程安全的Map,可以认为是可靠的,

而写入数据库等,可以认为是不可靠的,

开发人员必须在写每一行代码时,都注意它的可靠性与否,

在代码中尽量划分开,并对失败做异常处理,

并为容错,自我保护,自动恢复或切换等补偿逻辑提供清晰的切入点,

保证后续增加的代码不至于放错位置,而导致原先的容错处理陷入混乱。

5. 异常防御,但不忽略异常

这里讲的异常防御,指的是对非必须途径上的代码进行最大限度的容忍,

包括程序上的BUG,比如:获取程序的版本号,会通过扫描Manifest和jar包名称抓取版本号,

这个逻辑是辅助性的,但代码却不少,初步测试也没啥问题,

但应该在整个getVersion()中加上一个全函数的try-catch打印错误日志,并返回基本版本,

因为getVersion()可能存在未知特定场景异常,或被其他的开发人员误修改逻辑(但一般人员不会去掉try-catch),

而如果它抛出异常会导致主流程异常,这是我们不希望看到的,

但这里要控制个度,不要随意try-catch,更不要无声无息的吃掉异常。

6. 缩小可变域和尽量final

如果一个类可以成为不变类(Immutable Class),就优先将它设计成不变类,

不变类有天然的并发共享优势,减少同步或复制,而且可以有效帮忙分析线程安全的范围,

就算是可变类,对于从构造函数传入的引用,在类中持有时,最好将字段final,以免被中途误修改引用,

不要以为这个字段是私有的,这个类的代码都是我自己写的,不会出现对这个字段的重新赋值,

要考虑的一个因素是,这个代码可能被其他人修改,他不知道你的这个弱约定,final就是一个不变契约。

7. 降低修改时的误解性,不埋雷

前面不停的提到代码被其他人修改,这也开发人员要随时紧记的,

这个其他人包括未来的自己,你要总想着这个代码可能会有人去改它,

我应该给修改的人一点什么提示,让他知道我现在的设计意图,

而不要在程序里面加潜规则,或埋一些容易忽视的雷,

比如:你用null表示不可用,size等于0表示黑名单,

这就是一个雷,下一个修改者,包括你自己,都不会记得有这样的约定,

可能后面为了改某个其它BUG,不小心改到了这里,直接引爆故障。

对于这个例子,一个原则就是永远不要区分null引用和empty值。

8. 提高代码的可测性

这里的可测性主要指Mock的容易程度,和测试的隔离性,

至于测试的自动性,可重复性,非偶然性,无序性,完备性(全覆盖),轻量性(可快速执行),

一般开发人员,加上JUnit等工具的辅助基本都能做到,也能理解它的好处,只是工作量问题,

这里要特别强调的是测试用例的单一性(只测目标类本身)和隔离性(不传染失败),

现在的测试代码,过于强调完备性,大量重复交叉测试,

看起来没啥坏处,但测试代码越多,维护代价越高,

经常出现的问题是,修改一行代码或加一个判断条件,引起100多个测试用例不通过,

时间一紧,谁有这个闲功夫去改这么多形态各异的测试用例?

久而久之,这个测试代码就已经不能真实反应代码现在的状况,很多时候会被迫绕过,

最好的情况是,修改一行代码,有且只有一行测试代码不通过,

如果修改了代码而测试用例还能通过,那也不行,表示测试没有覆盖到,

另外,可Mock性是隔离的基础,把间接依赖的逻辑屏蔽掉,

可Mock性的一个最大的杀手就是静态方法,尽量少用。

dubbo作者讲编码原则的更多相关文章

  1. Dubbo的一些编码约定和设计原则

    编码约定 代码风格 Dubbo 的源代码和 JavaDoc 遵循以下的规范: Code Conventions for the Java Programming Language How to Wri ...

  2. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  3. 编码原则实例------c++程序设计原理与实践(进阶篇)

    编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...

  4. Web前端安全之安全编码原则

    随着Web和移动应用等的快速发展,越来越多的Web安全问题逐渐显示出来.一个网站或一个移动应用,如果没有做好相关的安全防范工作,不仅会造成用户信息.服务器或数据库信息的泄露,更可能会造成用户财产的损失 ...

  5. Python写业务逻辑的几个编码原则

    作为一个写业务逻辑的boy,我需要专注的就是把业务逻辑写好.写业务逻辑并不复杂,就是把编程最基础的东西使用好,有变量.循环.流程控制.函数.数据库等. 但是写出的逻辑要通俗易懂.易于理解,避免炫技.晦 ...

  6. dubbo发送过程编码失败,会唤醒发送线程吗?

    dubbo发送过程编码失败,会唤醒发送(客户端业务)线程吗?如何实现的? 在上篇文章 dubbo坑- No provider available for the service xxx 中,如果dub ...

  7. Web开发者不可不知的15条编码原则

    HTML已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家介 ...

  8. Web 开发者不可不知的15条编码原则

    HTML 已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家 ...

  9. zg项目 应用系统编码原则

    一.编码说明: 1.系统编码采用三码为原则,通常两码简称之. 1>.子系统或类型 2>.系统小分类 3>.系统大分类 如 IPMS领域业务群: DA 应用软件发展管理系统 DE公用副 ...

随机推荐

  1. Django, one-to-many, many-to-many

    1.定义关系 定义三个表,Publisher,Book,Author 一个作者有姓,有名及email地址. 出版商有名称,地址,所在城市.省,国家,网站. 书籍有书名和出版日期. 它有一个或多个作者( ...

  2. win7 x64安装glpk

    下载glpk,下载地址:http://ftp.gnu.org/gnu/glpk/

  3. Ubuntu中Python3虚拟环境的搭建

    1.环境准备 首先请自行安装好Python3和pip3(一般Ubuntu是自带Python3的,可以通过sudo apt-get install python3-pip命令来安装pip3) 安装完成后 ...

  4. 洛谷 3953 NOIP2017提高组Day1 T3 逛公园

    [题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...

  5. poj2325 大数除法+贪心

    将输入的大数除以9 无法整除再除以 8,7,6,..2,如果可以整除就将除数记录,将商作为除数继续除9,8,...,3,2. 最后如果商为1 证明可以除尽 将被除过的数从小到大输出即可 #includ ...

  6. [bzoj1078][SCOI2008][斜堆] (贪心)

    Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...

  7. js在HTML中的三种写法

    1.内联样式 内联样式分为两种,一是直接写入元素的标签内部 <html> <title>js样式内联写法</title> <meta http-equiv=& ...

  8. hihoCoder#1094 Lost in the City

    原题地址 限时10s,所以不用考虑什么算法了,暴力吧 分别按照3x3视野的四个方向去地图上匹配,把符合的地点标记出来,最后统一按照从上到下,从左到右的顺序输出. 代码: #include <io ...

  9. [luoguP1972] [SDOI2009]HH的项链(莫队 || 树状数组 || 主席树)

    传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] ...

  10. Codeforces Round #261 (Div. 2) E (DP)

    E. Pashmak and Graph Pashmak's homework is a problem about graphs. Although he always tries to do hi ...