`
soya520
  • 浏览: 5196 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己写框架需要注意的【摘自javatar】

 
阅读更多
最近一直担心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性的一个最大的杀手就是静态方法,尽量少用。
分享到:
评论

相关推荐

    java数组函数(摘自JAVA编程思想)

    Java集合框架提供了一些工具类,如`ArrayList`,可以方便地将数组转换为集合,反之亦然。这样,我们就可以利用集合提供的更丰富的操作,如添加、删除元素。 通过`com.bruceeckel.util`包中的工具类,我们可以更加...

    Android开发之最火的开源框架之一Xutils2详解(摘自开源作者官方介绍详解)

    Android开发之最火的开源框架之一Xutils2详解(摘自开源作者官方介绍详解)博文简介:http://blog.csdn.net/qq_21376985/article/details/51774023

    java程序员必读基础篇 摘自南大百合精华篇

    本篇文章将根据“java程序员必读基础篇 摘自南大百合精华篇”的主题,深入探讨Java编程的核心概念,帮助读者构建扎实的Java知识体系。 1. **Java简介**:Java是由Sun Microsystems(后被Oracle收购)开发的一种面向...

    powerbuilder 9.0 框架

    powerbuilder 9.0 框架 摘自网络

    Java集合类源码(摘自jr源码)

    Java集合框架是Java编程语言中的核心部分,它提供了一组数据结构和算法,使得程序员能够高效地管理和操作数据。在给定的压缩包文件中,包含了一些关键的集合类源码,如`TreeMap`、`Hashtable`、`ArrayList`、`...

    SSH框架实现BBS完整版

    以下内容摘自报告目录部分(希望大家极力推荐哦): 第三章 SSH框架搭建 第四章 设计思路 4.1 需求分析 4.2 对象确定 4.3 确定实体对象之间的对应关系 4.4 Hibernate映射建表 4.5 配置Spring(AOP) 4.6 配置Spring...

    Hadoop迭代式计算框架Guagua.zip

    同时 Guagua 并没有将自己局限在分类模型,Guagua 是一个基于 Hadoop 的迭代式计算框架,几乎任何基于迭代的算法都可以利用 Guagua 为其添加分布式功能。此外由于Guagua对分 布式的良好支持,我们以前许多想做又不能...

    Android快速开发框架xUtils-2.6.14

    列名 外键 唯一性约束 NOT NULL约束 CHECK约束等 支持事务 摘自github ">一个Android基于快速开发的一个框架 xUtils 它是在aFinal基础上进行重构和扩展的框架 相比aFinal有很大的改善 同时 如果如果你的应用是基于...

    北京市政务大数据平台顶层设计框架及应用方案.doc

    这篇文档摘自穆勇的演讲,重点探讨了大数据在政务领域的应用概述、政务大数据的定义及其特点,以及对政务大数据平台的顶层设计框架和应用方案。 首先,大数据技术在互联网行业的成功实践,如互联网思维的转变,包括...

    ZeroMQ(java)window库

    ZMQ本身只提供了C++版本的下载,如果在java里使用需要下载jzmq,需要自己编译,比较复杂。下载地址:https://github.com/zeromq/jzmq(右下角zip) 为了方便使用ZMQ,在这里提供了编译好的zeroMq和jzmq库,并附带了...

    SSH框架实现BBS完整版.2018_03_16

    以下内容摘自报告目录部分(希望大家极力推荐哦): 第三章 SSH框架搭建 第四章 设计思路 4.1 需求分析 4.2 对象确定 4.3 确定实体对象之间的对应关系 4.4 Hibernate映射建表 4.5 配置Spring(AOP) 4.6 配置Spring...

    java编程那些事

    java编程那些事-摘自陈跃峰的博客:http://blog.csdn.net/Mailbomb/

    PHP大作业-基于PHP/MySQL/JS/HTML/bootstrap框架/jQuery搭建本地博客管理网站

    PHP动态网页大作业####开发环境:操作系统:Win10操作系统集成开发环境:WAMP(如果没有可以点击去官网下载),注意看自己的系统,我这里下载的是64位操作系统对应的版本。WAMP是什么?(以下内容摘自百度百科)Wamp...

    C语言读取汉字字模 摘自网络.doc

    C语言读取汉字字模 摘自网络

    机器人制作具体摘自配件手册.pdf

    机器人制作具体摘自配件手册.pdf

    PPP数据帧格式(摘自某人写的一本书)

    ### PPP数据帧格式详解 #### PPP协议概述 点对点协议(PPP,Point-to-Point Protocol)是一种广泛应用于点对点连接上的数据包传输标准,主要用于替代早期的SLIP协议。PPP不仅修正了SLIP协议的诸多不足,还提供了一...

    摘自linuxForum 经典帖子

    摘自linuxForum 经典帖子

    最新苏飞 HttpHelper 类 V1.6(免费版本)

    需要[HttpHelper万能框架收费版(V1.9.0.1)]的同学,请到 http://download.csdn.net/detail/downiis6/9521801 下载! 需要[HttpHelper万能框架...Httphelper类是免费的,收费的是使用Httphelper类写出的万能框架!

    机器人制作具体摘自配件说明书.pdf

    机器人制作具体摘自配件说明书.pdf

Global site tag (gtag.js) - Google Analytics