一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每个方法的功能应该是相互独立而语义清晰的。好的代码必然是清晰的,但是清晰的代码未必是好的。
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。
下面的代码中,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();
// ...
}
}
分享到:
相关推荐
1. 数据准确性:重构算法的准确性依赖于输入数据的准确性和完整性,因此在使用源码前,必须确保输入数据的正确性。 2. 实时性:配电网状态实时变化,重构决策需快速响应,因此算法应具备高效计算能力。 3. 安全性...
《重构:改善既有代码的设计》这本书为软件工程师提供了一套系统的方法论,帮助他们在实践中有效地改善既有代码的质量。通过对代码进行持续不断的优化,不仅能够提高软件产品的整体质量,还能提升开发团队的工作效率...
这个压缩包中的源码很可能是实现了以上步骤的MATLAB函数或脚本,对于学习和实践互信息和相空间重构的学者来说,这是一个宝贵的资源。用户可以通过阅读和运行这些代码,理解相关算法的原理,并将其应用到自己的项目中...
### 重构:改善既有代码的设计 #### 书籍概述与核心价值 《重构:改善既有代码的设计》这本书由Martin Fowler撰写,是一本关于软件工程领域的经典著作。它详细介绍了如何通过一系列小步骤对现有代码进行改进,进而...
《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典IT著作,专注于软件开发中的重构技术,旨在提升代码质量并优化设计。重构是软件开发过程中一个至关重要的环节,它通过对现有代码结构进行细微但系统化...
例如,每次重构的改动都应尽可能小,确保可以快速验证其正确性,防止引入新的错误。此外,良好的测试基础是重构的关键,持续集成和单元测试能帮助我们快速发现和修复问题,确保重构过程的安全性。 除了具体的重构...
【标题】: "软件设计模式与重构大作业-心算大师游戏" 【描述】: 这是一个关于软件设计模式和重构的项目,具体是为西南...重构过程应逐步进行,确保每次小改动都能通过测试,以保证重构过程中代码的稳定性和正确性。
此外,测试驱动开发(TDD)是XP的关键实践之一,要求开发者先写测试用例,再编写满足这些测试的代码,确保代码的正确性。 书中还讨论了如何通过“计划游戏”来管理项目,这是一种高度互动的规划方法,让客户、...