实践中的重构14_用方法设计保证正确性
程序员文章站
2022-05-31 10:28:43
...
一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每个方法的功能应该是相互独立而语义清晰的。好的代码必然是清晰的,但是清晰的代码未必是好的。
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。
下面的代码中,Helper提供了2个方法,一个用来转换对象,一个对来验证对象。看上去很清晰很好。
但是观察了系统中3个调用的地方,调用的方式如出一辙。仔细想了想,所有调用convertValueObject2DomainObject的地方的确需要后面马上来一个validate验证。
实际上,隐含的,这里2个独立的方法是有一个方法的调用顺序约束。
这种对方法的调用顺序约束,可以设计方法时强制性的表达出来,从而在方法设计层面,保证方法调用方满足该约束,从而防止方法误用。
不能孤立调用的方法改为private的,新增一个方法来保证原有调用顺序的约束一定被满足。
当然这样做也有一个缺点,给DomainObject加了一个字段标识该对象是否有效,有可能使领域对象显的不够纯洁。
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。
下面的代码中,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();
// ...
}
}
上一篇: 干嘛交白卷?
推荐阅读