`
zhang_xzhi_xjtu
  • 浏览: 538300 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
有这么一段代码,是用来解析国内的地址信息的。
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层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
分享到:
评论
2 楼 william_ai 2011-01-06  
区域问题,可以用自定义编码的方式来做。
如省2位,市2位,区2位

设:
A1省01,B1市01,C1区01
A1省01,B2市02,C1区01
A1省01,B2市02,C2区02
A2省02,B1市01,C1区01

就可以得出以下编码
A1省        :010000
A1省B1市    :010100
A1省B1市C1区:010110
A1省B2市    :010200
A1省B2市C1区:010201
A1省B2市    :010200
A1省B2市C2区:010202
A2省        :020200
A2省B1市    :020201
A2省B1市C1区:020201

求A1省所有的所有市、区:找出编码大于010000小于等于019999的即可。


也可以用写sql来做。ORACLE的话可以直接写sql
select AREA_ID
  from AREA_TM
connect by prior AREA_ID = PARENT_AREA_ID
 start with AREA_ID = ?;
1 楼 抛出异常的爱 2011-01-06  
核心三件事:
		JXPathContext context = JXPathContext.newContext(info);
		String[] arry =  (String[]) IteratorUtils.toArray(it,String.class);
		String[] result = Arrays.copyOf(arry, 4);




测试代码:



import java.util.Iterator;

import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.lang.ArrayUtils;

public class JxpathDemo {
	JxpathDemo father;
	String name;

	public JxpathDemo() {

	}
	public JxpathDemo(String name){
		this.name = name ;
	}
	public JxpathDemo getFather() {
		return father;
	}
	public void setFather(JxpathDemo father) {
		this.father = father;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JxpathDemo son = new JxpathDemo("son diver the hose");
		JxpathDemo me = new JxpathDemo("i 'm a big man");
		JxpathDemo father = new JxpathDemo(" father in house");
		JxpathDemo grandFather = new JxpathDemo("grand fater sleepping");
		
		son.setFather(me);
//		me.setFather(father);
//		father.setFather(grandFather);
		JXPathContext context = JXPathContext.newContext(son);
		Iterator<String> it = context.iterate("//name");
		String[] arry =  (String[]) IteratorUtils.toArray(it,String.class);
		String[] result = Arrays.copyOf(arry, 4);
		
		for(String o:result)
		System.out.println(o)
	}


}


相关推荐

    代码重构总结实例

    代码重构是一种改善软件设计、提升代码可读性和可维护性的技术。它并不改变代码的外在行为,而是通过改进代码结构来提高代码质量。在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、...

    如何全面的提高代码质量

    在软件开发领域,代码质量是指代码在可维护性、可读性、效率等方面的表现。高质量的代码不仅能够减少后期的维护成本,还能提升软件产品的整体性能与用户体验。好的设计、前置测试、编程意图明确以及构造函数封装等都...

    VC.rar_代码优化

    "VC.rar_代码优化"这个压缩包文件显然聚焦于使用C++进行代码优化的实践与策略。下面我们将深入探讨一些核心的C++代码优化知识点。 1. **编译器优化**: - **O1, O2, O3 优化级别**:编译器如Visual C++(VC)提供...

    Swift项目模板,代封装、优化、复用、重构试验场.zip

    这个压缩包“Swift项目模板,代封装、优化、复用、重构试验场.zip”包含了精心设计的代码结构和实践示例,旨在帮助开发者在实际工作中更好地运用Swift语言特性,进行代码封装、性能优化、代码复用以及重构。...

    c++ 代码分析软件

    通过这些功能,开发者可以评估代码的可读性、可维护性和性能,从而改进代码质量。 1. **代码复杂度计算**:软件可以计算出每个函数或方法的Cyclomatic复杂度,这是一种衡量代码复杂性的指标。高复杂度的函数可能更...

    代码之美英文版书籍一本

    通过阅读本书,读者可以学习到如何写出更具可读性、可维护性和性能优异的代码。 书中可能涵盖的关键知识点包括: 1. **编程范式**:讨论面向对象编程、函数式编程和过程式编程等不同编程范式的优缺点,以及在不同...

    设计模式 原型模式 设计思想 演过过程 重构过程

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过创建新实例。...在实际项目中,理解并恰当使用原型模式,可以提升代码的可维护性和可扩展性。

    大三下学期3.1编写卓越的代码.pdf

    这些属性包括但不限于功能性、可靠性、可用性、效率、可维护性和可扩展性。它们是评价软件性能和用户体验的核心指标。为了确保这些属性得到满足,开发者需要在设计和实现阶段就考虑这些因素。 在软件质量问题的分类...

    C++源代码扫描程序

    9. **代码重复**:检测代码中的重复片段,有助于减少冗余代码,提高代码的可维护性。 10. **集成开发环境(IDE)插件**:很多源代码扫描程序可以作为IDE插件集成,提供实时反馈,帮助开发者在编码时即时修正问题。 ...

    数据结构(C语言版)迷宫求解问题

    7. **优化**:对于代码组织较差的问题,可以考虑重构代码,使其更加模块化,例如将迷宫读取、路径搜索、栈操作等部分分离,提高代码可读性和可维护性。同时,可以考虑使用更高效的数据结构,如位运算优化的邻接矩阵...

    改善C#程序的157个建议

    11. **代码重构**:定期进行代码重构,消除重复代码,提高可维护性。 12. **性能测试**:使用工具如Visual Studio的性能分析器进行性能测试,找出瓶颈。 13. **异步编程**:在I/O密集型任务中使用异步操作,避免...

    代码行数统计用小工具

    代码行数统计不仅仅是一个简单的数字游戏,它背后蕴含着关于代码可读性、维护性和扩展性的思考。例如,过多的代码行可能意味着代码过于复杂,需要重构;而恰当的注释比例则有助于提高代码的可读性。因此,这个小工具...

    《C语言课程设计案例精编》源代码.rar

    24. **软件设计模式**:学习和应用设计模式,提高代码的可扩展性和可维护性。 25. **内存对齐**:理解内存对齐的概念,避免因对齐问题引发的效率低下或错误。 26. **多线程编程**:掌握线程的创建、同步和通信,...

    短码之美.pdf

    在编程实践中,编写“短码”不仅仅是为了减少代码量,更多的是追求代码的效率、可读性和可维护性。下面我将详细探讨这些方面: ### 代码优化的追求 在编程中,代码优化通常意味着让程序运行得更快、占用更少的内存...

    Mastering JavaScript Functional Programming, Second Edition.pdf

    1. **模块化与分层**:通过合理地组织代码结构,可以提高应用程序的可维护性。函数式编程提倡将代码分解为小的、独立的功能单元,这有助于代码的重用和测试。 2. **类型安全**:使用TypeScript等静态类型检查工具...

    codecomplete

    3. 强调了代码清晰性和可读性的重要性,提出了提高代码可维护性的方法,如命名规则、注释的使用和代码排版等。 4. 描述了多种编程技巧和技巧,如循环、分支、异常处理、递归、算法优化等。 5. 讨论了代码复用的...

    thinkful-mentor:代码示例,重构-适用于有思想的学生

    9. **代码结构**:将相关的查询和操作组织在一起,提高代码的可维护性。 10. **注释和文档**:编写清晰的注释,提供详细的操作指南,便于他人理解和维护代码。 通过这个项目,学生不仅可以掌握TSQL的基本知识,还...

    函数式 swift

    总而言之,《函数式 Swift》这本书将引导读者探索如何在 Swift 开发中应用函数式编程思想,以提高代码质量、可维护性和开发效率。通过学习和实践书中的概念,iOS 开发者可以更好地应对复杂项目,编写出更优雅、更具...

    Java 程序小游戏代码 24点以及连连看

    在代码编写过程中,良好的编程规范和注释是必不可少的,这有助于代码的可读性和后期维护。同时,为了保证代码的可用性,需要进行充分的测试,包括单元测试和集成测试,确保所有功能都能正常运行。 对于游戏性能的...

    scrapy开发规范文档 (2)1

    在开发 Scrapy 爬虫时,遵循一定的规范能够提高代码的可读性、可维护性和性能。以下是对给定内容中涉及的 Scrapy 开发规范的详细解释: 1. **开发目录规范统一**: - **匹配代码与抓取分离**:在 `parse_utils` ...

Global site tag (gtag.js) - Google Analytics