`
zhang_xzhi_xjtu
  • 浏览: 524402 次
  • 性别: 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();
			// ...
		}
	}
分享到:
评论

相关推荐

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    Microsoft+.NET企业级应用架构设计

    《Microsoft .NET企业级应用架构设计》由两位企业级系统开发专家执笔,会告诉你如何用各种模式和技术来控制项目的复杂性,让系统更易于编写、维护和升级。  读者会得到实用的架构方面的指导,包括:  ·在早期设计...

    Microsoft+.NET企业级应用架构设计 超低积分

    《Microsoft .NET企业级应用架构设计》由两位企业级系统开发专家执笔,会告诉你如何用各种模式和技术来控制项目的复杂性,让系统更易于编写、维护和升级。  读者会得到实用的架构方面的指导,包括:  ·在早期...

    UML和模式应用(架构师必备).part06.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part01.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part07.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part02.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part03.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part04.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part08.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    UML和模式应用(架构师必备).part05.rar

    6.21 过程:在迭代方法中如何使用用例 6.22 历史 6.23 参考资料 第7章 其他需求 7.1 如何完成这些示例 7.2 准则:初始阶段是否应该对此彻底地进行分析 7.3 准则:这些制品是否应该放在项目Web站点上 7.4 ...

    【卷一/共两卷】AJAX实战pdf高清版90M

    第1章 一种新的Web设计方法 1.1 为什么需要Ajax富客户端? 1.1.1 比较用户体验 1.1.2 网络延迟 1.1.3 异步交互 1.1.4 独占或瞬态的使用模式 1.1.5 忘掉Web 1.2 Aiax的四个基本原则 1.2.1 浏览器中的是应用而不是内容 ...

    horiseon-refactor-code:Horiseon代码库进行重构,以遵循可访问性标准进行搜索引擎优化

    建于HTML CSS Web无障碍标准对基本代码所做的更改包含适当的语义HTML元素以逻辑结构重组HTML元素添加了最佳实践缩进和注释向图片标签添加了alt属性按顺序放置标题属性添加了描述性标题修复了损坏的应用程序链接,并...

    软件工程思想

    虽然它探讨的是软件工程最常见的内容,但他将亲身所历的感悟写成活泼生动的文字,将软件工程的很多原则和方法融于笑谈之中,让人看得轻松,时有共鸣。尽管很薄,然其内涵不逊于厚近千页的有关教科书。 每次回浙大我...

    破误区定式方法=问题拆解+消除未知+成本风险+步骤分解

    多练习、重实践 输入 What? 表像是什么? Why? 为什么? How? 如何做? 输出 破误区定式方法=问题拆解+消除未知+成本风险+步骤分解 思维方式: 归纳:就是有N个已知数据和现象,推出一个结论。 演绎:根据最底层的...

    客客威客系统KPPW v2.5 GBK Beta.zip

    另新版本中还新增了默认的任务模型,满足目前威客行业基础性任务模型运营的所有要求。 四、商城交易模型化,拓展性更强 威客商城是以卖方市场为导向的新型威客模式,KPPW一直都引领着这一主题的创新发展。新版本在...

    数据库schema迁移数据最佳实践

    这意味着,在生产环境中,需要迁移数以百万计的活跃数据对象,并且重构上千行代码。用户期望StripeAPI保障可用性和一致性。所以在进行迁移时,需要格外谨慎,必须保证数据的数值正确无误,并且Stripe的服务始终保持...

Global site tag (gtag.js) - Google Analytics