`

魔鬼在细节中

    博客分类:
  • 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性的一个最大的杀手就是静态方法,尽量少用。

分享到:
评论

相关推荐

    执行力教育工程-模块5.pptx

    细节控制是执行过程中不容忽视的一环,正如“天使在细节中,魔鬼在细节中”所言,现场管理和自我控制能力的强弱直接影响到执行的效果。丰田的现场管理案例展示了精细管理的价值,而NASA的事故案例则警示我们,忽视...

    如何扮演有效的执行角色(ppt16页).pptx

    直接执行人需要激发自己的创造力和主动性,以提高工作效率和质量,同时,他们需要具备良好的自我控制能力,做到“天使在细节中”,注重每一个环节,防止“魔鬼在细节中”导致的问题发生。 总结来说,有效执行角色的...

    专题资料(2021-2022年)产品经理进阶之路.docx

    正如西方谚语所说,“魔鬼在细节中”。忽视细节可能导致产品设计上的失误,影响用户体验。因此,产品经理必须关注每一个环节,避免潜在的问题,确保产品在实际使用中的顺畅。 实践是产品经理成长的关键。只有通过...

    超竞争时代企业经营新思维.pptx

    魔鬼在细节中,意味着企业需注重每个环节的完善,以确保顾客满意度。同时,优秀是卓越的敌人,意味着企业不能满足于现状,必须不断改进和提升。"Learn to know, Learn to do, Learn to work together, Learn to be...

    认识组织危机管理.pptx

    12. **魔鬼在细节中**:安迪·格罗夫的观点提醒我们,危机往往源于看似微不足道的细节,因此对细节的关注和把控是防止危机的关键。 组织危机管理是一项系统工程,它涉及到战略规划、沟通机制、应急计划、团队协作等...

    sap-lsmw魔鬼教程

    然而,尽管LSMW功能强大,但在实际应用中,由于其相对较高的学习曲线,许多用户并未充分掌握其使用方法。本教程旨在简化这一过程,帮助用户快速上手,实现高效的数据导入。 #### 二、LSMW魔鬼教程详解 **1. 系统...

    HTML5海底鲨鱼魔鬼鱼群游动画.zip

    在这个项目中,开发者可能使用了JavaScript来编写动画逻辑,包括鱼群的移动路径、速度、旋转角度等,使得鲨鱼和魔鬼鱼能够在屏幕上自由游动,模拟真实海洋环境中的群游行为。 颜色背景标签暗示了这个动画可能运用了...

    《魔鬼单词学习法》图文版

    根据提供的信息,《魔鬼单词学习法》是一套专为英语学习者设计的独特教材,它通过将英语单词融入经典英文歌曲之中,让学习者能够在享受音乐的同时掌握词汇。这种方法不仅提高了学习效率,还使得整个学习过程更加有趣...

    基于unity实现的牧师与魔鬼 动作分离版【unity课程大作业】

    【作品名称】:基于unity实现的牧师与魔鬼 动作分离版【unity课程大作业】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...

    基于unity实现的牧师与魔鬼 游戏【unity课程大作业】

    【作品名称】:基于unity实现的牧师与魔鬼 游戏【unity课程大作业】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。...- 注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!

    个性化服务之细节魅力.docx

    【细节决定成败】的思想源自于西方的成语"魔鬼在细节"(The devil is in the details),它强调即使宏伟的计划也需要精确的执行,任何微小的疏漏都可能导致整体的失败。在商业领域,尤其是酒店业,如纽约的华尔道夫...

    The devil is in the details.mp4

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

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

    Exercism.io 是一个在线平台,致力于通过一系列编程练习来帮助开发者提升技能,尤其是在处理细节方面。这个平台覆盖了多种编程语言,...通过完成这些挑战,你将在处理细节中找到乐趣,成长为一名更优秀的Elixir程序员。

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

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

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

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

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

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

    毕业设计:基于Python研发,魔鬼自动化部署系统,发布系统.zip

    自动化部署系统通常是为了简化软件在不同环境中的部署流程,减少人为错误,提高效率。而发布系统则负责将软件产品推送到目标用户或服务器,确保版本控制和更新管理。 【描述解读】 "计算机毕设代码" 表示这个压缩包...

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

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

    汪中求精细化管理.pptx

    "魔鬼在细节",表明往往是因为忽视细节而导致失败。 海恩定律指出,每一次严重事故背后都有多次轻微事故、大量未遂先兆和无数事故隐患。这强调了预防细节问题的重要性,因为小问题如果不及时处理,最终可能导致灾难...

Global site tag (gtag.js) - Google Analytics