浏览 1457 次
锁定老帖子 主题:实践中的重构14_用方法设计保证正确性
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-04
最后修改:2011-06-06
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。 下面的代码中,Helper提供了2个方法,一个用来转换对象,一个对来验证对象。看上去很清晰很好。 class Helper { public DomainObject convertValueObject2DomainObject( ValueObject valueObject) { // convert... return null; } public boolean validate(DomainObject domainObject) { // validate return false; } } 但是观察了系统中3个调用的地方,调用的方式如出一辙。仔细想了想,所有调用convertValueObject2DomainObject的地方的确需要后面马上来一个validate验证。 实际上,隐含的,这里2个独立的方法是有一个方法的调用顺序约束。 这种对方法的调用顺序约束,可以设计方法时强制性的表达出来,从而在方法设计层面,保证方法调用方满足该约束,从而防止方法误用。 class A { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertValueObject2DomainObject(valueObject); boolean isValid = new Helper().validate(domainObject); // ... } } class B { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertValueObject2DomainObject(valueObject); boolean isValid = new Helper().validate(domainObject); // ... } } class C { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertValueObject2DomainObject(valueObject); boolean isValid = new Helper().validate(domainObject); // ... } } 不能孤立调用的方法改为private的,新增一个方法来保证原有调用顺序的约束一定被满足。 当然这样做也有一个缺点,给DomainObject加了一个字段标识该对象是否有效,有可能使领域对象显的不够纯洁。 class Helper { public DomainObject convertAndValidate(ValueObject valueObject) { DomainObject domainObject = convertValueObject2DomainObject(valueObject); domainObject.setValid(validate(domainObject)); return domainObject; } private DomainObject convertValueObject2DomainObject( ValueObject valueObject) { // convert... return null; } private boolean validate(DomainObject domainObject) { // validate return false; } } class A { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertAndValidate(valueObject); boolean isValid = domainObject.isValid(); // ... } } class B { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertAndValidate(valueObject); boolean isValid = domainObject.isValid(); // ... } } class C { public void method() { // get value object from somewhere. ValueObject valueObject = null; DomainObject domainObject = new Helper() .convertAndValidate(valueObject); boolean isValid = domainObject.isValid(); // ... } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |