gpt4 book ai didi

dependency-injection - ocaml,仿函数 : dependency injection

转载 作者:行者123 更新时间:2023-12-04 08:21:53 26 4
gpt4 key购买 nike

Real World Ocaml Chapter 9这是关于仿函数的:

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 的 Wikipedia - 但我实际上并没有捕获测试和模拟目的的关系。

最佳答案

Dependency injection是一种软件工程技术,其目的是减少程序的两个子系统之间的相互依赖关系。这项技术的一个非常重要的细节是,它涉及的不是两个,而是三个子系统:

  • 一项服务,
  • 使用
  • 的客户
  • 一个注入(inject)器,其职责是为客户准备服务。

  • 后一个子系统及其职责是一个经常被忽视但至关重要的细节:这意味着客户端对服务的了解与其公共(public)接口(interface)一样少,这意味着可以轻松使用模拟服务来测试客户端。

    假设我们编写了一个通过网络与键值存储进行通信的应用程序。键值存储具有以下签名:
    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 类型的模块将客户端代码编写为客户端参数,我们可以通过提供一个模拟服务来测试我们的应用程序在使用 set 函数时对网络错误的弹性,而无需实际创建网络错误:
    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”的作者似乎在做的事情。

    关于dependency-injection - ocaml,仿函数 : dependency injection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35110857/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com