TDD by example (7) -- 组合

前面已经完成了各个模块(类)的开发,是时候将之组合起来,形成可执行的程序了。首先需要一个GameEngine来驱动整个游戏的流程。
GameEngine
GameEngine的主要作用是协调输入输出,调用Game的逻辑,驱动整个游戏运行.

主程序:
Program

在SetupDependencies中,将接口与实现注册到Container当中,这样在Resolve的时候,Container就会自动寻找依赖,创建出正确的对象关系. 如果想要替换某一个组件,例如IGameHistory,只需要添加该接口的一个新的实现,然后修改注册代码,即可实现组建替换.如果将注册代码移至配置文件中,则可以在不重新编译的情况下,替换组建.

至此,我们的功能已经全部完成,但是……这还没完,我们还需要再审视一下设计,看看有没有可以改进的地方。
--------------------===============------------------
我们可以看到,Game类不仅要判断猜测的结果,还要记录,还要判断是否游戏结束,严重违反了SRP。于是,将记录历史记录和判断游戏结束的逻辑提取出来,形成GameController类,同时也需要将TestGame中的相关测试提取到TestGameController中,并作适当的修改。
Test

Code
还有别忘了在SetupDependencies中注册GameController

Program
至此,程序完成。
---------------------------------------------------------------------
其实代码还有很多改进的余地,比如说Game这个类,叫做MagicNumber会不会好一些?GameController改名叫Game是不是更贴切?GameHistory叫做GuessRecord是不是更容易理解?等等等等,就不再继续了。
下载代码
posted @ 2009-09-23 22:58 Nick Wang (懒人王) 阅读(...) 评论(...) 编辑 收藏