软件设计模式提供给你按照模式的方式构建你的代码从而使之更富于适应未来的弹性修改例如当构建本文中的论坛应用程序时我们就使用了一种名字为Repository的软件设计模式进行设计Eric Evans在他的着作《DomainDriven Design》中这样描述Repository模式
一个REPOSITORY把某种类型的所有对象描述为一个概念的集合(通常是模拟的)其行为类似于一个集合但是具有更细致的支持查询的能力于是符合相应类型的对象可以被添加或删除而位于此REPOSITORY背后的系统则可以从数据库中添加或删除它们
根据Evans的解释Repository模式的一个主要的优点是它能够帮助你实现应用程序和域设计与存储技术多种数据库策略甚至是多个数据源之间的解耦换句话说Repository模式能够使你的应用程序免于因数据库访问方式的不同而重新加以改变
为了使我们的论坛应用程序从某一种特定的存储技术中独立出去我们将在系统中引入上述Repository模式因此最终的此论坛应用程序的设计将能够支持我们可以在不同的数据访问技术(例如LINQ to SQLEntity Framework或NHibernate)之间切换
测试驱动开发
我打算使用测试驱动开发原则构建本文中的MVC论坛应用程序更具体地说是在我编写任何应用程序代码之前我将首先编写一个应用程序代码的单元测试
测试驱动开发将会基于下列原因为你带来更高质量的代码
()为你的代码编写测试能够提供给你一个适应于未来可能改变的安全网
()为你的代码编写测试迫使你书写松耦合的代码
()在正式书写你的代码前为你的代码编写测试将迫使你从一个用户的角度来观察自己书写的代码
让我们更细致地分析上述每种特征的优点
首先单元测试提供你一个适应于未来可能改变的安全网这是Michael Feathers在他的着作《Working Effectively with Legacy Code》一再强调的一个观点事实上他把遗留代码定义为简单地编码而不进行测试
当你的应用程序代码被单元测试所覆盖时你可以修改该代码而不必担心此改动会你的代码既有的功能单元测试有助于使你的代码进行更安全的重构如果你能够重构那么你可以使用软件设计模式修改你的代码这将产生更好的适应未来修改的代码
其次遵循测试驱动开发将迫使你使用一种特定的方式书写代码可测试的代码将趋于导致松耦合的代码单元测试能够在各自孤立的代码单元中执行一个测试为了构建你的应用程序以便使之可测试你需要使用一种可孤立的组件方式来构建应用程序
一个类与另一个类之间是松耦合的是指当你改变第一个类时不必改变另一个类测试驱动开发经常迫使你编写松耦合的代码因为松耦合代码是经得起改变的
最后按照测试先行的方式书写代码将迫使你从一个用户的角度来观察自己书写的代码通过首先编写测试的方式书写代码会使你站在一个未来的有可能使用你的代码的开发者的角度进行工作既然编写测试迫使你考虑另一个开发者(也许是未来的你自己)如何使用你的代码那么你最终编写的代码应该是设计得更好的代码
莫图眼前之利益 更宜立足于长远
使用测试驱动开发原则构建软件在软件开发之初要求开发者付出更多的努力尽管编写测试需要花费一定的时间然而其思想是最初构建单元测试所要求付出的努力将会在未来获得丰厚的回报
存在两种方式可以使你成为一名开发者你可以成长为一个牛仔也有可能成长为一个工匠一个牛仔能够立即开始编码也就是说一个牛仔可以以很快的速度构建一个软件应用程序然而作为一个牛仔其问题在于软件必须要进行长期的维护
一个工匠则是很有忍耐性的一个工匠总会精雕细琢地开发一款软件一个工匠总是非常仔细地构建单元测试并使之涵盖一个应用程序中所有的代码因此一个工匠要花费更长的时间才能创建成功一款应用程序然而此应用程序在创建后却是易于后期的维护—更易于修改错误且更易于把新特征添加到应用程序中
总结
总之我们的最终目标是构建一个MVC论坛应用程序此程序能够经得起长时间的测试它应该是不仅现在良好地工作还应该在未来继续工作—即使是当有人需要对该应用程序进行更改之时
我想利用微软ASPNET MVC框架开发此论坛应用程序原因在于这个框架可以使我更容易地编写程序的测试代码而另一方面ASPNET MVC框架本身就从设计之初提供了对测试驱动开发的最忠诚的支持
[] [] []