本文主要是介绍开发,从需求出发 · 之五 麦克斯韦妖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
麦克斯韦妖(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.............
这篇关于开发,从需求出发 · 之五 麦克斯韦妖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!