最近看到一段代码,做报表输出功能。

几乎是严格按照封装的要求编写,每个方法很小,没有重复代码, 运用了重载。编写时作者还是花费了心思,由于本身业务比较复杂,能够拆成那个样子,已经很优秀。不知为何,可能是封装的层数太多,代码结构太深,阅读起来异常的累。

有一个非常突出的特点: 运用全局变量(属性)封装数据, 从头到位是在对 变量A 进行操作, 最后返回的结果集 变量B。那么是在什么时候对 变量B 进行的赋值呢? 为了找到这个位置,花费了相当多的时间。

不知作者是处于什么样的考虑, 采用全局变量进行操作,只在此对全局变量进行思考。

使用场景:常运用于不会变化的值,仅限于使用,不会频繁变动。

1. 依赖注入的对象; 

2. 常量属性;

3. PO JO 对象封装数据的属性。

优点:

1. 全局变量,作用域宽泛,整个类的任何一个位置都能对其进行操作和使用,可以减少方法的参数传递;

缺点:

1. 作用域太宽,不明确类中的哪些方法在修改其值,定位 Bug 难度增加。

2. 会造成代码的耦合,方法A 的操作会影响 方法B,  定位相当麻烦,代码可维护性降低。

3. 编写代码时的思路时单线程, 当代码处于多线程的情况下,全局变量的改变不可控,比较危险。

4. 降低代码的可读性: 一个看着面善的方法,没有参数,也没有返回值,内部其实对所有东西都进行了改动。无法通过方法提前预判其作用和针对的对象。加之命名不规范,没有注释就更难理解。

这段代码有很多值得学习的地方,包括全局变量的使用。 在没有足够的功力之前,还是谨慎使用全局变量。局部变量,限制了变量的作用域,只是在某一区间内作用,其他位置不会对其造成影响,让代码的安全性提高, 这本就是在解决全局变量的问题。

可惜作者已经走了,如果还在,可以问问他为何如此设计,相信他在当时也是权衡之后做出的判断。