实践中的重构13_利用递归提高代码的可维护性
程序员文章站
2022-05-31 08:19:48
...
有这么一段代码,是用来解析国内的地址信息的。
AddressInfo对象唯一确定一个地址信息,该地址信息可以是省市区县任意一级的地址信息,省级地址为市级地址的父地址,市级地址是区县地址的父地址。AddressInfo对象里面存储了父地址的地址码,当地址码为null或者查找不到该地址码对应的地址时,认为该AddressInfo对象为省级地址。系统提供了查找一个地址码对应父地址的方法,。
该段代码有以下问题可以改进。
1 代码命名不好。
2 结构有重复。
利用递归可以提高该段代码的可维护性。
因为这里的重复结构只有3层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
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层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
上一篇: Docker(九)解决容器中中文乱码