`
zhang_xzhi_xjtu
  • 浏览: 536827 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构14_用方法设计保证正确性

阅读更多
一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每个方法的功能应该是相互独立而语义清晰的。好的代码必然是清晰的,但是清晰的代码未必是好的。
方法存在的目的是被调用方调用,因此,从调用方的角度来看,清晰的方法一样会存在一些潜在的问题。
下面的代码中,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();
			// ...
		}
	}
分享到:
评论

相关推荐

    重构_改善既有代码的设计 Java

    《重构:改善既有代码的设计》是一本在IT领域广受推崇的经典著作,专注于软件开发中的重构实践,尤其针对Java编程语言。重构是软件开发过程中的一个重要环节,它旨在提升代码的可读性、可维护性和整体质量,而不会...

    reconfiguration_配电网_配电网络重构_reconfiguration_配电网重构_配电网重构_源码.zip

    1. 数据准确性:重构算法的准确性依赖于输入数据的准确性和完整性,因此在使用源码前,必须确保输入数据的正确性。 2. 实时性:配电网状态实时变化,重构决策需快速响应,因此算法应具备高效计算能力。 3. 安全性...

    重构_改善既有代码的设计

    《重构:改善既有代码的设计》这本书为软件工程师提供了一套系统的方法论,帮助他们在实践中有效地改善既有代码的质量。通过对代码进行持续不断的优化,不仅能够提高软件产品的整体质量,还能提升开发团队的工作效率...

    mutual_information_相空间重构matlab_互信息熵_源码.zip

    这个压缩包中的源码很可能是实现了以上步骤的MATLAB函数或脚本,对于学习和实践互信息和相空间重构的学者来说,这是一个宝贵的资源。用户可以通过阅读和运行这些代码,理解相关算法的原理,并将其应用到自己的项目中...

    重构 改善既有代码的设计 中文高清完整版pdf

    ### 重构:改善既有代码的设计 #### 书籍概述与核心价值 《重构:改善既有代码的设计》这本书由Martin Fowler撰写,是一本关于软件工程领域的经典著作。它详细介绍了如何通过一系列小步骤对现有代码进行改进,进而...

    重构_改善既有代码的设计完整版

    《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典IT著作,专注于软件开发中的重构技术,旨在提升代码质量并优化设计。重构是软件开发过程中一个至关重要的环节,它通过对现有代码结构进行细微但系统化...

    重构-改善既有代码的设计

    例如,每次重构的改动都应尽可能小,确保可以快速验证其正确性,防止引入新的错误。此外,良好的测试基础是重构的关键,持续集成和单元测试能帮助我们快速发现和修复问题,确保重构过程的安全性。 除了具体的重构...

    软件设计模式与重构大作业-心算大师游戏

    【标题】: "软件设计模式与重构大作业-心算大师游戏" 【描述】: 这是一个关于软件设计模式和重构的项目,具体是为西南...重构过程应逐步进行,确保每次小改动都能通过测试,以保证重构过程中代码的稳定性和正确性。

Global site tag (gtag.js) - Google Analytics