- 浏览: 541539 次
- 性别:
- 来自: 杭州
-
最新评论
-
飞天奔月:
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
文章列表
实践中的重构24_持续的方法重构
- 博客分类:
- 实践中的重构
很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人不是天才,需要的是不断的修改,才能使之演化为一段不错的代码。同时,即使是一段原本还算不错的代码,随着时间的推移,受到诸如需求变更,缺陷修复,后期维护等因素的影响,如果不是特别注意的话,也会使其慢慢腐烂。我们能做的,就是持续重构。
以下是一个例子。
原有的代码如下:
public interface DateService {
/**
* 构建一个按照自然周排好的日期列表(包括最近30天,不包含当日),周时间距离现在越近,在列表中越靠前。
*
* <pre>
* 保证每个子列表的大小都为7( ...
注释一直是软件开发中的一个老大难问题。
代码中一个注释都没有是一种常见情况,给后来的开发维护带来巨大的成本。
代码中注释零零散散也是一种常见情况,这个依赖于程序员,有的程序员自觉的写上注释,有的觉得无所谓,干脆不写,有的在该写的地方写,不该写的地方省略,有的在不该写的地方写,该写的地方留白让后人抓狂。
系统大了,代码多了,公司一般都会出台一些强制性的代码规范,规范中自然少不了注释规范。于是,程序员为了满足代码注释规范,辛辛苦苦的添加了满屏的注释。
而实际上这种出发点是为了满足规范的注释是少有人看,也少有被看的价值。大家的关注点是在有没有注释上,而不是在注释的质量上。因为该注释被加上去的原因是规范 ...
Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但是也不能因为有了GC就毫无顾虑的搞出很多垃圾来。
A a = new A();
if (condition) {
a = getAFromSomePlace();
} else {
a = getAFromOtherPlace();
}
上面的代码片段中,第一行new出来的东西只能是垃圾了。
为什么程序会这么写呢?
1 程序员对java不熟悉,以为局部变量必须声明和初始化同时进行。
2 不明确的代码规范规定必须进行局部变量初始化,于是悲剧产生了。实际上,局部变量如果有分支没有进行初始化,后面的程序 ...
实践中的重构21_给她一个好名字
- 博客分类:
- 实践中的重构
名字的重要性实在是再怎么强调都不为过的。
为什么名字这么重要呢?我的看法是,构建维护系统过程中最重要的事情之一就是同时建立并维护系统的一致性概念模型。无论通过何种手段进行沟通,如语言,文档,代码,注释,最重要的是有一套沟通的基石。即沟通各方对概念的理解是相同的,当提及一个概念时,大家所指的事物是相同的,没有二义性,没有模糊性。最怕张三在说西瓜,李四以为是个芝麻,鸡同鸭讲。倘若如此,好的结果是沟通过程中就发现了问题,花掉些时间,大家重新讨论各自概念的所指,最终达成了一致。运气差的话,沟通过程中并没有发现问题,各方都以为对方理解了自己的想法,于是大家都欢欢喜喜的做事情去了,终于在某一个时间点,才会惊 ...
前两天开会的时候涉及到用户体验。突然想起了王国维的《人间词话》中的三层境界。
想到用户体验是不是也存在着不同的层次境界。
1 限于各个方面的条件限制,产品只能提供一个基本的用户体验(没有真实的用户介入进来),有可能为了快速占领市场,或者其他目标,而对用户体验做的比较少。简单的说,就是产品主动给了用户一个基本的体验,用户没有参与到这个事情上来。
2 当一个产品在市场上占有一定地位之后,随着用户群的变大,用户的反馈越来越多,产品设计师开始利用这些反馈调整该产品的用户体验,以满足广大用户的需求。这个阶段基本上,是一个用户提需求,产品人员筛选之后在反馈到产品上的一个过程。用户的反馈在该阶段起到一个 ...
Partitions, Views, and Other Schema Objects
Partitioning enables you to decompose very large tables and indexes into smaller and more manageable pieces called partitions. Each partition is an independent object with its own name and optionally its own storage characteristics.
分区的优点
Increased avail ...
Index
使用索引可以大大提高数据库的性能。
Primary and unique keys automatically have indexes.
复合索引的列顺序问题。组合列中在前面的列在where子句中查询才会走索引。
B-Tree Indexes 典型的B-Tree索引。
Full Index Scan:可以消除排序,因为index本身已经排序。
Suppose that an application runs the following query:
SELECT department_id, last_name, salary
FROM employees
...
Code review也是一个充满乐趣的事情,在一次Code review中,发现了如下代码。
try {
f();
} catch (RuntimeException e) {
throw new RuntimeException(e);
}
百思不得其解啊。为什么要捕捉一个RuntimeException又把它抛出去呢。在和原作者充分沟 ...
每当看到代码中有一个明显的冗余的时候,我就有一个感慨,这家伙时间真多啊,放个屁还要脱裤子。
看例子。
if (addressCode != null
&& (StringUtil.equals(addressCode, HK)
|| StringUtil.equals(addressCode, MACAO)
|| StringUtil.equal ...
一般而言,自然界是以对称为美的。但是,在编程的世界里面,不对称的情况比比皆是,一样的美。
常见的api中有如下例子:
// String的方法。
public String substring(int beginIndex, int endIndex)
// List的方法。
List<E> subList(int ...
代码以及初始的单元测试见
http://zhang-xzhi-xjtu.iteye.com/blog/875986
由于测试的数量比较多,而且结构相似,因此,才用表驱动法也是一个不错的选择。
/**
* 表驱动法。
* */
public class TestUserQueryService2 {
/**
* 每一个字符串代表一个测试数据。
*
* <pre>
* 格式为
* 历史库生产库时间分隔点,历史库大小,生产库大小,查询的起始时间,查询的结束时间,
* 查询的页大小,查询的页码,查询结果的总项数,查询结果历史库的总项数,查 ...
为了简化条件查询。select * from table where 1=1
分页计算。pages=(items+pageSize-1)/pageSize
从数组中随机一个位置开始取值。
for (int i = 0; i < dirs.length; i++) { // try each local dir
int index = (hashCode+i & Integer.MAX_VALUE) % dirs.length;
...
}
在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码。
UT也是代码,并且其重要性和产品代码相比,只高不低。
以下是一段产品代码的框架。
public interface UserQueryManager {
/**
* 获得历史库和生产库的分界时间点。
* */
public Date getHisDate();
/**
* 统计两个时间点之间的用户数。由调用方保证该时间范围不是跨库时间范围。
* */
public int countUsersNumber(Date start, Date end);
/**
* 查找两 ...
在编程中,估计null应该是一个很常写的词汇了。
实践中,经常看到大量类似user!=null或者userList!=null的检测。当然,这么做是为了防止NullPointerException。问题是,null这么常见,它究竟是什么意思。
观察如下一段code:
String userName = "allen";
User user = userService.findUserByName(userName);
如果这里user==null的话,一般的看法应该是userService没有找到指定名字的User对象。
那么这个时候null的含义就是没有找到指定名 ...
p1
Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.3: Element 'beans' cannot have character [children], because the type's content type is element-only.
有可能是xml字符集不对,删掉,重新写入。
p2
com_cenqua_clover canot be resolved
Clover使用中报错,删除.clover文件夹,重装eclipse,重新编译。