Dependency injection
Makes the implementations of some components of a system swappable. This is particularly useful when you want to mock up parts
of your system for testing and simulation purposes.
但我没有理解这个想法.
我还看了一下关于DI的维基百科 – 但实际上我没有用测试和模拟目的来捕捉这个关系.
解决方法
>一项服务,
>使用a的客户
>注射器,其职责是为客户准备服务.
后一个子系统,其责任,一个经常被忽视但至关重要的细节:这意味着客户端对服务的了解与公共接口一样少,这意味着可以轻松地使用模拟服务来测试客户端.
假设我们编写了一个通过网络与键值存储进行通信的应用程序.键值存储具有以下签名:
module type AbstractkeyvalueStoreService = sig exception NetworkError type t val list : t -> string val find : t -> string -> string option val set : t -> string -> string -> unit end
如果我们通过AbstractkeyvalueStoreService类型的模块将客户端代码编写为客户端参数,我们可以通过提供模拟服务来测试我们的应用程序对网络错误的弹性,而无需实际创建网络错误:
module keyvalueStoreServiceFailingOnSet = struct exception NetworkError type t = unit let list () = [ "a"; "b"] let find = function | "a" -> Some("x") | "b" -> Some("y") | _ -> None let set _ _ = raise NetworkError end
如果我们的客户端是由类型为AbstractkeyvalueStoreService的模块进行参数化编写的,那么很容易为该软件组件编写测试,其中模拟服务遵循与客户端或多或少复杂的交互脚本.
使用模块作为参数可能不是一个“惊天动地的想法”,但重要的是要知道这个想法如何用于解决重要的软件工程问题.这就是“真实世界OCaml”的作者似乎所做的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。