`

魔鬼在细节中

    博客分类:
  • java
 
阅读更多

from:http://javatar.iteye.com/blog/1056664

 

最近一直担心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性的一个最大的杀手就是静态方法,尽量少用。

分享到:
评论

相关推荐

    exercism:处理细节中的魔鬼(exercism.io)

    exercism:处理细节中的魔鬼(exercism.io)

    The devil is in the details.mp4

    魔鬼藏在細節裡,魔鬼藏在细节里,细节决定成败,魔鬼藏在細節裡,魔鬼藏在细节里,细节决定成败,魔鬼藏在細節裡,魔鬼藏在细节里,细节决定成败,魔鬼藏在細節裡,魔鬼藏在细节里,细节决定成败

    在细节中寻找魔鬼:学习开发程序设计-研究论文

    受我们设计特定社会计划的经验、秘鲁劳动力市场新进入者的技能组合信号的启发,我们阐明了开发项目设计替代学习方法的必要性,并探索了其实证结果。 使用模拟,我们证明即使只有适度尺寸的设计空间和即使设计结果的...

    UDP-Pose:魔鬼的官方代码在详细信息中

    UDP姿势《细节中的魔鬼:人体姿势估计的无偏数据处理》的官方代码《 AID:通过信息丢弃增强技术来推动人体姿势估计的性能边界》消息[2021/1/12]提供了新版本的UDP论文,提供了更清晰,更详细的方法说明,额外的实验...

    细节中的魔鬼:减轻与在法律领域使用人工智能相关的宪法和法治风险-研究论文

    在过去十年中,人们越来越重视人工智能 (AI) 在扰乱法律实践方面的作用。 尽管设计计算机以“像律师一样思考”的实际任务已经得到了相当多的关注,但仍有许多相关问题值得进一步研究。 其中,人工智能给受宪法保护的...

    PersonReID-YouReID:TensorFlow实现我们的论文“细节中的魔鬼”

    介绍 YouReID是一个轻型研究框架,可为一些reid任务实现一些最新的... 请在说明列中提供的链接中查看详细信息 场地 ABBRV 演算法 描述 地位 SL 互联网 完成的 金字塔 完成的 UDA 行为 即将来临 闭塞的 零件网 完

    美国自动驾驶三巨头:解决魔鬼般的行驶场景细节

    市调公司在年初时曾预测,5G商用化将带动手机市场成长,去年衰退的趋势将在6月转为成长,但美国突如其来的发难,将使手机市场混乱,并再次陷入衰退。  智能手机蓬勃发展后,去年智能手机市场首次出现衰退情况,但...

    PP3 像素完美使用手册

    魔鬼藏于细节,在设计领域中,能否精准处理好像素也是考校设计师处理细节能力的一种。来自英国的USTWO团队就致力于精准控制像素,并且为了让更多的设计师了解、注意并且深入学习这方面知识,他们制作了这本《精准...

    Mandelbrot复平面集合模拟(串行版)

    曼德勃罗特集是人类有史以来做出的...这些局部既与整体不同,又有某种相似的地方,好像着梦幻般的图案具有无穷无尽的细节和自相似性.曼德勃罗特教授称此为"魔鬼的聚合物".为此,曼德勃罗特在1988年获得了"科学为艺术大奖".

    情感化设计的组成要素及实践案例

    文中所指的情感化设计,目标是在人格层面与用户建立关联,使用户在与产品互动的过程中产生积极正面的情绪。...如果运用方式得当,这些细节当中的小魔鬼可以帮助我们打造出更具人格的产品,并使用户在与之进行

    执行力培训教程--yijian0927.pptx

    2、伟大源于细小的积累 要了解竞争对手,但目标并不是它 ——打败你的是你自己 ——魔鬼存在于细节之中 ——企业家要对细节无限的爱 ——时针、分针与秒针 ——科学管理的魅力就在于精确、标准、精细 创业很刺激,...

    ogre 开发SDK

    OGRE(Object-Oriented Graphics Rendering Engine,即:面向对象图形渲染引擎)是一个用C++开发的面向场景、非常灵活的3D引擎,它旨在让... 译者注:ogre在英文中意为:食人魔鬼, 怪物, 象鬼的人,故其LOGO是一个怪物头

    ogre1.9 源码。官方还未放出。

    搞到的第一时间上传。厚颜无耻要五分. OGRE(Object-Oriented Graphics Rendering Engine,即:面向对象图形渲染引擎)是一个用C++... 译者注:ogre在英文中意为:食人魔鬼, 怪物, 象鬼的人,故其LOGO是一个怪物头

    基于Python与多技术栈的Mogui自动化部署系统源码

    项目概述:Mogui自动化部署系统是一款基于Python语言开发的多技术栈集成发布系统。该系统融合了前端技术如JavaScript、CSS、Vue以及后端Python编程...该系统致力于简化魔鬼细节,优化部署流程,提升开发到生产的效率。

    jpb.com:我的目标网页

    开始: $ rackup config.ru 部署到heroku去做:对话页面[添加UX假期聚会] 从conf添加喜欢的... 像以往一样,魔鬼(和天使)都在细节中,因此我们将深入研究工作方法,在项目上正确(但不太正确)的示例以及汲取的经验教

    Oracle数据库参数设置技术手册

    Oracle参数,这些技术细节都是魔鬼,看看你有多少不知道,这些参数会帮你少走弯路

    卷积网络模型.zip

    细节魔鬼的回归:深挖卷积网络 Return of the devil in the details: delving deep into convolutional nets (2014) 作者K. Chatfield et al. OverFeat:使用卷积网络融合识别、本地化和检测 OverFeat: Integrated...

    二抽取代码MATLAB-Visual-Search-Difficulty:视觉搜索难度预测模型(Python实现)

    下载BMVC-2014论文的VGG_CNN_F模型:“细节中的魔鬼回归:深入研究卷积网络”。 计算PASCAL VOC 2012中所有图像的CNN特征。从特征向量生成成对内核矩阵。 运行getFeature.py 训练和测试回归模型 火车: SVR.py 测试...

    asp.net知识库

    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和...

Global site tag (gtag.js) - Google Analytics