2016-01-31 6 views
2

В Real World Ocaml Chapter 9 которая составляет около функторов:OCaml, функторы: инъекции зависимостей

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 - но я на самом деле не поймаю relaton с целью тестирования и моделирования.

ответ

3

Dependency injection - это техническая разработка программного обеспечения, целью которой является уменьшение взаимозависимости между двумя подсистемами программы. Очень важная деталь этого метода является то, что она включает в себя не два, а три подсистемы:

  • сервис,
  • клиент, используя
  • инжектор, чья обязанность заключается в том, чтобы подготовить службы для клиент.

Последняя подсистема, с ее ответственностью, часто упускается из виду, но имеет решающее значение: это означает, что клиент знает об услуге как о своем открытом интерфейсе, а это означает, что можно легко использовать посмеянный сервис для тестирования клиент.

Предположим, что мы пишем приложение, сообщающееся с хранилищем значений ключей по сети. Ключ-значение магазин имеет следующую подпись:

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».

0

Мне кажется, что они просто пытаются показать, как можно увидеть выражение «зависимость» от ссылки на параметры, которые являются полными модулями. И это то, что OCaml-функторы: модули с параметрами, которые также являются модулями.

У этого есть много применений, а не только тестирование и симуляция. Но, конечно, вы можете использовать его для них. Например, вы можете использовать его для подачи модуля «макет» во время тестирования, чтобы заменить часть системы, которую трудно воспроизвести точно в тестовой среде.

Один из способов взглянуть на это состоит в том, что «инъекция зависимостей» не так интересна и не нова, как ее сторонники могут захотеть подумать. По крайней мере, это то, что я думаю лично. Использование модулей в качестве параметров не является потрясающей идеей, она существует уже несколько десятилетий на языках ML. В Угловом (по крайней мере) это смешивается с отдельным понятием, состоящим в том, что имена параметров функции являются семантически значимыми. Это (ИМХО) является ошибкой.

Смежные вопросы