您的位置:首页 > 其它

开发,从需求出发 · 之五 麦克斯韦妖

2014-07-24 04:28 204 查看
麦克斯韦妖(Maxwell's demon),是在物理学中假想的妖,能探测并控制单个分子的运动,于1871年由英国物理学家詹姆斯·麦克斯韦为了说明违反热力学第二定律的可能性而设想的。

好吧,让我们充当一次麦克斯韦妖,探测和控制单个模块/方法的工作~~~

先上三张图:

传统状态:



1 由于上层接口依赖于下层接口的实现,因此,开发顺序是自下而上开发,底层接口没有实现,上层无法进行有效的开发;

2 SearchService 的测试工作依赖于底层接口的实现,获得的输入不可控,因此在输出存在异常的情况下,无法界定是内部逻辑问题还是输入异常

3 确定输入异常的情况下,需要逐个排查底层接口

模拟状态:



1 由于我们确定 LuceneDAOMock 和 MysqlDAOMock 的运行是正确的,

2 因此LuceneDAO 和 MysqlDAO 的输出也是正确的,

3 SearchService如果逻辑是正确的,那么,其输出也必定是正确的,

4 但是,如果输出不是预期的数值,那么说明,SearchService的实现类 SearchServiceInRealBiz 必定有问题,而且,必定是自身的问题造成的。

5 SearchService接口的实现工作室完全可以和 它所依赖的下一层分离并行的,

6 这种模式下是支持自上而下的开发的——亦即我所说的“从需求出发”

混合状态:



1 混合状态是模拟状态的进行时状态

2 开发过程中,保持其他模块的模拟状态,只选取一个模块进行真实业务逻辑的实现

3 在多个粒度和层面上进行针对该模块的测试

4 将该模块切换为模拟状态,挑选另一个模块重复2-3的开发和测试工作。

5 所有模块实现完毕,同时,也测试完毕。

至此,麦克斯韦妖成功完成了它的工作~~~~

那么,我前面实现的BeanFactory 或者spring 的 依赖注入的作用体现在哪里呢?

——就是 模拟模块和真实模块的注入和切换。

我基于spring.xml的形式说明:

STEP 1,开发和测试 SearchService

SearchService 的实现类: SearchServiceInRealBiz


<?xml version="1.0" encoding="UTF-8"?>
<beans >
//模拟
<bean id="luceneDAO" class="cn.com.sitefromscrath.dao.LuceneDAOMock" />
//模拟
<bean id="mysqlDAO" class="cn.com.sitefromscrath.dao.MysqlDAOMock" />

<bean id="searchService" class="cn.com.sitefromscrath.service.SearchServiceInRealBiz">
<constructor-arg index="1" ref="luceneDAO" />
<constructor-arg index="2" ref="mysqlDAO" />
</bean>

</beans>


STEP 2, 开发和测试LuceneDAO

<?xml version="1.0" encoding="UTF-8"?>
<beans >
//开发测试
<bean id="luceneDAO" class="cn.com.sitefromscrath.dao.LuceneDAOReal" />
//模拟
<bean id="mysqlDAO" class="cn.com.sitefromscrath.dao.MysqlDAOMock" />
//模拟
<bean id="searchService" class="cn.com.sitefromscrath.service.SearchServiceMock">
<constructor-arg index="1" ref="luceneDAO" />
<constructor-arg index="2" ref="mysqlDAO" />
</bean>

</beans>


STEP 3,开发和测试MysqlDAO

<?xml version="1.0" encoding="UTF-8"?>
<beans >
//模拟
<bean id="luceneDAO" class="cn.com.sitefromscrath.dao.LuceneDAOMock" />
//开发测试
<bean id="mysqlDAO" class="cn.com.sitefromscrath.dao.MysqlDAOReal" />
//模拟
<bean id="searchService" class="cn.com.sitefromscrath.service.SearchServiceMock">
<constructor-arg index="1" ref="luceneDAO" />
<constructor-arg index="2" ref="mysqlDAO" />
</bean>

</beans>


开发测试同步完成。

不仅仅开发如此,在以后的系统维护过程中,一旦发生异常,是比较容易排查错误的原因的,如果你能获得真实环境下的异常输入,那么,debug将会相当快速高效。

你所要做的只不过是像麦克斯韦妖一样——把不同的分子放到不同的格子里面去

我确信,当我启动tomcat,打开页面,并进行查询操作的时候,得到的页面展示内容是正确的,符合预期的:)

OK了:)

基于sitefromscratch这个搜索网站项目的讨论到此结束,在接下来的章节里,我打算引申到更广泛的领域里面去。

to be continued.............
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: