TDD学习笔记【五】一隔绝相依性的方式与特性
2018-06-18 05:04:13来源:未知 阅读 ()
前言
在上一篇文章中,提到了如何通过 IoC 的设计,以及 Stub Object 的方式,来独立测试目标对象。
这一篇文章,则要说明有哪些设计对象的方式,可以让测试或需求变更时,更容易转换。
并说明这些方式有哪些特性,供读者朋友们在设计时,可以选择适合自己情境的方式来使用。
需求说明
当调用目标对象的方法时,期望目标对象的内容可以不必关注相依于哪些实体对象,而只需要依赖于某个接口,通过这样的方式来达到设计的弹性与可独立测试性。
那么,有哪一些方式可以达到这样的目的呢?
构造函数(constructor)
描述:
上一篇文章范例所使用的方式,将对象的相依接口,拉到公开的构造函数,供外部对象使用时,可自行组合目标对象的依赖对象实体。
public class Validation { private IAccountDao _accountDao; private IHash _hash; public Validation(IAccountDao dao, IHash hash) { this._accountDao = dao; this._hash = hash; } public bool CheckAuthentication(string id, string password) { var passwordByDao = this._accountDao.GetPassword(id); var hashResult = this._hash.GetHashResult(password); return passwordByDao == hashResult; } }
好处:
有许多 DI framework 支持 Autowiring。
Autowiring is an automatic detection of dependency injection points.
这里的 dependency injection points 在这例子,指的就是构造函数。以 Unity 为例,在 UnityContainer 取得目标对象时,会自动寻找目标对象参数最多的构造函数。并针对每一个参数的类型,继续在 UnityContainer 中寻找对应的实体对象,直到目标对象组合完毕,回传一个完整的目标对象。
由构造函数传入依赖接口的实体对象,是一个很通用的方式。因此在结合许多常见的 DI framework,不需要再额外处理。
顾虑点:
当对象越来越复杂时,构造函数也会趋于复杂。倘若没有 DI framework 的辅助,则使用对象上,面对许多 overload 的构造函数,或是一个构造函数的参数有好几个,会造成使用目标对象上的困难与疑惑。若没有好好进行 refactoring,也可能因此而埋藏许多 bad smell。
另外,倘若是许多构造函数,也可能造成要调用 A 方法时,应选用 A 对应的构造函数,但在使用对象上,可能会用错构造函数而不自知,若方法中没有正确的防呆,则可能出现错误。(请搭配单元测试的测试案例来辅助)
最后,与原本直接依赖的程序代码相比较,目标对象的相依对象因此暴露出来,交由外部决定,而丧失了一点封装的意味。而使用端也不一定知道,要取用此对象时,应该要注入哪些相依对象。(请使用 Repository Pattern 或 DI framework 来辅助)
公开属性(public setter property)
描述:
其实公开属性与公开构造函数非常类似,通过 public 的 property(property 类型仍为 interface),让外部在使用目标对象时,可先 setting 目标对象的相依对象,接着才调用其方法。
而公开属性通常只会将 setter 公开给外部设定,getter 则设定为 private。原因很简单,外部只需设定,而不需取用。就像公开构造函数,在使用对象之前先传入初始化对象必备的信息,但目标对象可能将这些信息,存放在 private 的 filed 或 property 中,而不需再提供给外部使用。
程序代码如下:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 学习Java 8 Stream Api (4) - Stream 终端操作之 collect 2020-06-11
- java学习之第一天 2020-06-11
- Java学习之第二天 2020-06-11
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- Java笔记:集合 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash