- 浏览: 538300 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
public List<String> gener ...
实践中的重构30_不做油漆匠 -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道public class A {
...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在世界的中心呼喚愛 写道在classB ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在classB的finalize上打断 ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
iteye比较少上,如果可以的话,可以发e-mail交流:ch ...
深入理解ReferenceQueue GC finalize Reference
有这么一段代码,是用来解析国内的地址信息的。
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层,递归的好处没有得到淋漓尽致的体现。尽管如此,这里采用递归以后减少了重复的代码,并且提高了代码的可维护性。
如果遇到同类问题,当层次较为多时,递归的优点就可以得到充分体现了。
但是值得注意的是,当使用递归时,固然可以提高程序的可读性,但是如果层次太多,有可能导致调用栈太深,从而消耗大量的内存空间,影响性能,甚至抛出栈空间不足异常,这种情况下可以考虑转换为迭代的形式或者尾递归的形式。
评论
2 楼
william_ai
2011-01-06
区域问题,可以用自定义编码的方式来做。
如省2位,市2位,区2位
设:
就可以得出以下编码
求A1省所有的所有市、区:找出编码大于010000小于等于019999的即可。
也可以用写sql来做。ORACLE的话可以直接写sql
如省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) } }
发表评论
-
实践中的重构32_使用标准的IO操作写法。
2012-07-14 18:42 1445看到这样一段代码,功能为读取一个指定文件的内容然后返回。 ... -
实践中的重构31_结果类两种实现的比较
2011-09-13 19:58 1098在查询接口结果类设计 ... -
实践中的重构30_不做油漆匠
2011-08-15 23:42 1301油漆匠的故事是编程文化中的一个著名故事。本地化如下。 小强毕业 ... -
实践中的重构29_不自动的自动化测试
2011-07-31 18:00 1071测试的精髓之一就是自 ... -
实践中的重构28_小心怀疑类库
2011-07-24 10:25 1073一般而言,类库的使用频率较高,场景较多,隐藏的bug就较少。 ... -
实践中的重构27_不要忘了内存空间
2011-06-06 18:31 1197方法在设计中,一般关注的是方法的功能契约,即方法需要什么样的参 ... -
实践中的重构26_奇怪的接口注释
2011-06-06 16:10 1365最近又看到奇怪的注释。 /** * 用户查询服务。 ... -
实践中的重构25_UT也需要持续重构
2011-05-01 11:20 1075UT是个好东西,在对代 ... -
实践中的重构24_持续的方法重构
2011-05-01 02:20 1099很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人 ... -
实践中的重构23_详尽的注释未必是好注释
2011-03-20 17:37 1562注释一直是软件开发中的一个老大难问题。 代码中一个注释都没有是 ... -
实践中的重构22_不要垃圾
2011-03-20 13:31 1074Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但 ... -
实践中的重构21_给她一个好名字
2011-03-20 13:03 925名字的重要性实在是再怎么强调都不为过的。 为什么名字这么重要呢 ... -
实践中的重构20_一段可笑的异常处理逻辑
2011-03-06 20:32 1723Code review也是一个充满 ... -
实践中的重构19_脱裤子放屁
2011-03-03 23:17 2084每当看到代码中有一个 ... -
实践中的重构18_不对称的美
2011-02-26 22:30 1001一般而言,自然界是以 ... -
实践中的重构17_表驱动法
2011-02-22 00:10 874代码以及初始的单元测试见 http://zhang-xzhi- ... -
实践中的重构16_多即是少
2011-01-16 23:44 1527在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码 ... -
实践中的重构15_null的意义和集合类作为方法结果类型
2011-01-12 22:16 655在编程中,估计null应该是一个很常写的词汇了。 实践中,经常 ... -
实践中的重构14_用方法设计保证正确性
2011-01-04 21:40 1031一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每 ... -
实践中的重构12_不要乱用异常
2010-12-30 00:36 1547code review的时候,发现了如下代码。 /** ...
相关推荐
代码重构是一种改善软件设计、提升代码可读性和可维护性的技术。它并不改变代码的外在行为,而是通过改进代码结构来提高代码质量。在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、...
在软件开发领域,代码质量是指代码在可维护性、可读性、效率等方面的表现。高质量的代码不仅能够减少后期的维护成本,还能提升软件产品的整体性能与用户体验。好的设计、前置测试、编程意图明确以及构造函数封装等都...
"VC.rar_代码优化"这个压缩包文件显然聚焦于使用C++进行代码优化的实践与策略。下面我们将深入探讨一些核心的C++代码优化知识点。 1. **编译器优化**: - **O1, O2, O3 优化级别**:编译器如Visual C++(VC)提供...
这个压缩包“Swift项目模板,代封装、优化、复用、重构试验场.zip”包含了精心设计的代码结构和实践示例,旨在帮助开发者在实际工作中更好地运用Swift语言特性,进行代码封装、性能优化、代码复用以及重构。...
通过这些功能,开发者可以评估代码的可读性、可维护性和性能,从而改进代码质量。 1. **代码复杂度计算**:软件可以计算出每个函数或方法的Cyclomatic复杂度,这是一种衡量代码复杂性的指标。高复杂度的函数可能更...
通过阅读本书,读者可以学习到如何写出更具可读性、可维护性和性能优异的代码。 书中可能涵盖的关键知识点包括: 1. **编程范式**:讨论面向对象编程、函数式编程和过程式编程等不同编程范式的优缺点,以及在不同...
**原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过创建新实例。...在实际项目中,理解并恰当使用原型模式,可以提升代码的可维护性和可扩展性。
这些属性包括但不限于功能性、可靠性、可用性、效率、可维护性和可扩展性。它们是评价软件性能和用户体验的核心指标。为了确保这些属性得到满足,开发者需要在设计和实现阶段就考虑这些因素。 在软件质量问题的分类...
9. **代码重复**:检测代码中的重复片段,有助于减少冗余代码,提高代码的可维护性。 10. **集成开发环境(IDE)插件**:很多源代码扫描程序可以作为IDE插件集成,提供实时反馈,帮助开发者在编码时即时修正问题。 ...
7. **优化**:对于代码组织较差的问题,可以考虑重构代码,使其更加模块化,例如将迷宫读取、路径搜索、栈操作等部分分离,提高代码可读性和可维护性。同时,可以考虑使用更高效的数据结构,如位运算优化的邻接矩阵...
11. **代码重构**:定期进行代码重构,消除重复代码,提高可维护性。 12. **性能测试**:使用工具如Visual Studio的性能分析器进行性能测试,找出瓶颈。 13. **异步编程**:在I/O密集型任务中使用异步操作,避免...
代码行数统计不仅仅是一个简单的数字游戏,它背后蕴含着关于代码可读性、维护性和扩展性的思考。例如,过多的代码行可能意味着代码过于复杂,需要重构;而恰当的注释比例则有助于提高代码的可读性。因此,这个小工具...
24. **软件设计模式**:学习和应用设计模式,提高代码的可扩展性和可维护性。 25. **内存对齐**:理解内存对齐的概念,避免因对齐问题引发的效率低下或错误。 26. **多线程编程**:掌握线程的创建、同步和通信,...
在编程实践中,编写“短码”不仅仅是为了减少代码量,更多的是追求代码的效率、可读性和可维护性。下面我将详细探讨这些方面: ### 代码优化的追求 在编程中,代码优化通常意味着让程序运行得更快、占用更少的内存...
1. **模块化与分层**:通过合理地组织代码结构,可以提高应用程序的可维护性。函数式编程提倡将代码分解为小的、独立的功能单元,这有助于代码的重用和测试。 2. **类型安全**:使用TypeScript等静态类型检查工具...
3. 强调了代码清晰性和可读性的重要性,提出了提高代码可维护性的方法,如命名规则、注释的使用和代码排版等。 4. 描述了多种编程技巧和技巧,如循环、分支、异常处理、递归、算法优化等。 5. 讨论了代码复用的...
9. **代码结构**:将相关的查询和操作组织在一起,提高代码的可维护性。 10. **注释和文档**:编写清晰的注释,提供详细的操作指南,便于他人理解和维护代码。 通过这个项目,学生不仅可以掌握TSQL的基本知识,还...
总而言之,《函数式 Swift》这本书将引导读者探索如何在 Swift 开发中应用函数式编程思想,以提高代码质量、可维护性和开发效率。通过学习和实践书中的概念,iOS 开发者可以更好地应对复杂项目,编写出更优雅、更具...
在代码编写过程中,良好的编程规范和注释是必不可少的,这有助于代码的可读性和后期维护。同时,为了保证代码的可用性,需要进行充分的测试,包括单元测试和集成测试,确保所有功能都能正常运行。 对于游戏性能的...
在开发 Scrapy 爬虫时,遵循一定的规范能够提高代码的可读性、可维护性和性能。以下是对给定内容中涉及的 Scrapy 开发规范的详细解释: 1. **开发目录规范统一**: - **匹配代码与抓取分离**:在 `parse_utils` ...