- 浏览: 541610 次
- 性别:
- 来自: 杭州
-
最新评论
-
飞天奔月:
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
文章列表
很多应用程序的主要目的就是用计算机来代替人处理真实世界中的问题。真实世界和计算机世界之间有着巨大的差异。编程语言,编程方法一直以来都有一个重要的发展方向,提供一个平台,尽量减少这个差异。面向对象语言,面向领域编程,为解决该问题在不同层次提供了解决方案。
在代码级别,也可以通过种种方式减少这个差异。
先看下面一段代码,需求和场景是这样的。
查询用户列表,传入一个整数,指定一次查询返回用户数的上限。
有3个不同的数据源可以用来查询用户信息,这3个数据源在查询的时候是有优先级的。即先查询第1个数据源,如果得到的用户数少于上限,则到第2个数据源查询,如果还是少于上限,则到 ...
一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每个方法的功能应该是相互独立而语义清晰的。好的代码必然是清晰的,但是清晰的代码未必是好的。
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。
下面的代码中,Helper提供了2个方法,一个用来转换对象,一个对来验证对象。看上去很清晰很好。
class Helper {
public DomainObject convertValueObject2DomainObject(
ValueObject valueObject) {
// convert...
ret ...
sun的jvm默认的hash code返回的是对象的内部地址构造的int。
那么就有了2个问题。
1 会不会重复。
2 同一个对象的hash code在gc移动了该对象之后会不会改变。
当然会重复了。无限的对象,有限的地址空间,hash是可以重复的。
同一个对象的hash code即使gc移动了该对象也不会改变。
jvm内部在object上加了标识位(2bits加上按需分配的存储hashcode的32bits),用来决定是用对象的地址还是存储的值,如果对象被gc移动过,如果以前该对象的hash code被调用过的话,会对标识位置位,并存储以前的hashcode供以后使用。按需存储可以减少内存 ...
有这么一段代码,是用来解析国内的地址信息的。
AddressInfo对象唯一确定一个地址信息,该地址信息可以是省市区县任意一级的地址信息,省级地址为市级地址的父地址,市级地址是区县地址的父地址。AddressInfo对象里面存储了父地址的地址码,当地址码为null或者查找不到该地址码对应的地址时,认为该AddressInfo对象为省级地址。系统提供了查找一个地址码对应父地址的方法,。
/**
* 获取省、市、区的数组
*
* @param info
* 地址信息
* @return 3个元素的字符串数组 第一个表示省,第二个表示市,第三个表 ...
实践中的重构12_不要乱用异常
- 博客分类:
- 实践中的重构
code review的时候,发现了如下代码。
/**
* 验证一个字符串是一个长度为10,且内容都是数字。
* */
public static boolean validate(String str) {
if (str == null || str.length() != 10) {
return false;
}
// 纯数字
try {
Long.valueOf(str);
} catch (NumberFormatException ex) {
return false;
}
return ...
鲁迅先生的名文孔乙己中,孔乙己纠结于茴香豆的茴字有多种写法,可惜小孩子不愿意学,可惜了孔乙己的一片良苦用心。
一个功能,不同的程序员的实现,基于各种因素,可能是千差万别的。即使是同一个程序员,一般也会有多种方式来完成该程序的编写。面对各种不同的可能实现方式,挑选出适合当前场景的实现,就变成了程序员责无旁贷的任务。
/**
* 这个是最早的程序版本,把一个字符串转换成一个16进制编码的字符串。
* 看到这段代码的时候,第一反应是怎么不用StringBuilder。而是字符串相加。
* 其次,这个是一个常用的工具类,每天的调用量很大,性能看上去不怎么好。
* */
p ...
很多应用程序的主要目的就是用计算机来代替人处理真实世界中的问题。真实世界和计算机世界之间有着巨大的差异。编程语言,编程方法一直以来都有一个重要的发展方向,提供一个平台,尽量减少这个差异。面向对象语言,面向领域编程,为解决该问题在不同层次提供了解决方案。
在代码级别,也可以通过种种方式减少这个差异。
先看下面一段代码,需求和场景是这样的。
查询用户列表,传入一个整数,指定一次查询返回用户数的上限。
有3个不同的数据源可以用来查询用户信息,这3个数据源在查询的时候是有优先级的。即先查询第1个数据源,如果得到的用户数少于上限,则到第2个数据源查询,如果还是少于上限,则到 ...
众所周知,防御性编程是一个编程的最佳实践。良好的防御性编程,可以增强程序的健壮性,但是没有银弹,最佳实践也有一个适用场景的问题。
试看如下代码:
/**
* 异常处理接口。
* */
public interface ExceptionHandler {
/**
* 是否处理该异常。
* */
public boolean aboutToHandle(Exception ex);
/**
* 处理异常。
* */
public void handle(Exception ex);
}
/**
* ...
代码的可读性应该还是着重强调的,毕竟,代码是给人读的。如
if(null==a)
这样的代码,看的出是从c惯用法继承下来,试着读一下,当null不为a,则如何如何。至少我读起来有点别扭。我还是喜欢这样的形式,当a不为null,则如何如何。
当然,更厉害的是经常看到如下的片段
if(list.size()==0)
if(list.size()<1)
ok,size==0这个我还可以想的通为什么这么写,但是<1这种写法真的让人无语。
if(list.isEmpty())
这样当然更进一步。为什么呢,因为使用size是因为我们知道该类的内部实现,判断时涉及了类的实现,而isEmpty只是 ...
代码中如果有一行code是这样的,
String email=userInfo.getEmail();
那么我们会对这行代码做出什么样的判断呢?
我对这行代码的判断是从一个用户信息的模型中取出了用户的email。我相信大部分的人和我的猜测应该一致的。我把这个叫做合理猜测。
但是很遗憾,这个猜测是错误的。同事给我指出在数据库中email的字段的存储值并不是该用户的email,该字段的说明是这样写的。如果该用户是用email注册的话,则该字段存储email值,否则存储该用户的手机号(系统目前只支持用email和手机号注册)。
有没有抓狂的感觉,我有。
拜托,能不能让我的合理猜测是正确的。
更 ...
大部分的书在讲解涉及到性能优化的时候都告诉我们不要过早优化。简而言之,过早优化是万恶之源。
过早的担心性能问题,不经过性能测试,同时花费大量的时间和精力去在一些主观判断的性能瓶颈点做了一些性能优化的工作,实际上很有可能对性能提高没有什么帮助,而且导致代码可读性直线下降。这样的做法当然是不明智的。
但是,打着过早优化是万恶之源的幌子,从而在写代码的时候压根不考虑性能问题,以为计算机就是万能机器,没有性能问题,一样是不可取的。
在写code的时候,性能还是应该有所考虑的。而且很多时候,对性能问题的考虑并不会花费很多时间,同时也不会把代码搞的一团糟。
public boolean f_0(Strin ...
目录
实践中的重构01_小方法的细调
实践中的重构02_代码的视觉效果
实践中的重构03_批处理方法默认约定
实践中的重构04_了解每一行代码 装箱的布尔值
实践中的重构05_简洁的代码
实践中的重构01_小方法的细调
重构的概念已 ...
最近关注了一下系统的故障。发现故障基本的原因可以分为以下几类:按照故障的次数排了一下。
1 数据库故障。
2 jar包版本不兼容故障。
3 外部系统故障。
4 编程故障。
5 硬件故障。
由此可见,在对大型系统做设计的时候。
数据库一定是要关注的,因为数据库挂了,基本上影响面很大。
多个系统不停的开发升级,对于jar包的管理是一个很大的挑战。
外部系统故障,基本不可控,但是,应该熟悉外部系统的容量和可用率。
编程故障,依赖于测试的质量,应该尽量减小。
硬件故障,不可控,但是是可以预测的,硬件多了,自然会有故障发生,在线切换,或者一套快速的反映措施是不可少的。
系统报了一堆异常,吓人一跳,看了看,发现有一个异常在同一个文件中,打了多次的情况。
比如A->B,B->C,C系统有一个异常,打到了error.log中,然后又向上抛,B捕获了这个异常,打到了error.log中,又向上抛,C系统捕获了这个异常,打到了error.log中。
感觉这种记录异常的方式是不合理的。
当时这么做的思路是所有的异常打在一个文件里面,方便排查故障。
但是这种一个root cause的异常在同一个文件打多次应该是不必要的。
传统的做法是一个异常只打一次log,但是这个只是一个理想情况,我的想法是,一个系统对于同一个root cause的异常只应该记录一次。 ...
awk是一个简单强大的文本过滤报告工具。
简介
其基本结构为 pattern { action }
awk是一个面向行的编程工具。pattern定义了怎么匹配一个行,action定义了匹配成功的动作。默认为所有的行都匹配,BEGIN 和 END 关键字,一个在所有行处理之前执行,一个在所有行处理之后执行。
awk把每一行看作一些field,$0代表整行,$1代表第一个field,等等。
和很多脚本语言不一样的是,$number不代表一个变量,而是一个field。
也不对""之中的符号进行特别解释。
换行不能乱用,可以
{ action1 }
{ action2 } ...