欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实践中的重构13_利用递归提高代码的可维护性

程序员文章站 2022-05-31 08:19:48
...
有这么一段代码,是用来解析国内的地址信息的。
AddressInfo对象唯一确定一个地址信息,该地址信息可以是省市区县任意一级的地址信息,省级地址为市级地址的父地址,市级地址是区县地址的父地址。AddressInfo对象里面存储了父地址的地址码,当地址码为null或者查找不到该地址码对应的地址时,认为该AddressInfo对象为省级地址。系统提供了查找一个地址码对应父地址的方法,。
	/**
* 获取省、市、区的数组
*
* @param info
* 地址信息
* @return 3个元素的字符串数组 第一个表示省,第二个表示市,第三个表示区/县
*/
private String[] getAddressArrayByInfo(AddressInfo info) {

int addessArrayLength = 3;
int provincePosition = 0;
int cityPosition = 1;
int areaPosition = 2;

String[] result = new String[addessArrayLength];
if (info == null) {
return result;
}

if (info.getParentAreaCode() == null) {
result[provincePosition] = info.getName();
return result;
}

AddressInfo parentInfo = findAddressByAreaCode(info.getParentAreaCode());
if (parentInfo == null) {
result[provincePosition] = info.getName();
return result;
}

if (parentInfo.getParentAreaCode() == null) {
result[provincePosition] = parentInfo.getName();
result[cityPosition] = info.getName();
return result;
}

AddressInfo provInfo = findAddressByAreaCode(parentInfo
.getParentAreaCode());
if (provInfo == null) {
result[provincePosition] = parentInfo.getName();
result[cityPosition] = info.getName();
return result;
}

result[provincePosition] = provInfo.getName();
result[cityPosition] = parentInfo.getName();
result[areaPosition] = info.getName();
return result;
}

该段代码有以下问题可以改进。
1 代码命名不好。
2 结构有重复。
利用递归可以提高该段代码的可维护性。
	private static int AddressLength = 3;

/**
* 获取省、市、区的数组
*
* @param info
* 地址信息
* @return 3个元素的字符串数组 第一个表示省,第二个表示市,第三个表示区/县
*/
public String[] getAddressArrayByInfo2(AddressInfo info) {

String[] addressArray = new String[AddressLength];

addAddressToArray(addressArray, info);

return addressArray;
}

/**
* 将指定地址放入addressArray中。 原有的addressArray的值依次后移1位,第一个空位由指定地址填充。
*
* <pre>
* Note:由于中国的行政划分基本不会变,所以这里可以用常数。
* </pre>
* */
private void addAddressToArray(String[] addressArray, AddressInfo info) {

if (info == null)
return;

addressArray[2] = addressArray[1];
addressArray[1] = addressArray[0];
addressArray[0] = info.getName();

String parentAreaCode = info.getParentAreaCode();
if (parentAreaCode == null) {
return;
}

addAddressToArray(addressArray, findAddressByAreaCode(parentAreaCode));
}

因为这里的重复结构只有3层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
相关标签: SQL Oracle Apache