Функциональное программирование прохождения зависимостей - PullRequest
1 голос
/ 28 октября 2019

Я хотел бы знать, что является общим и хорошим методом для внедрения зависимостей в функциональном программировании.

Например, если у меня есть 2 модуля (БД и пользователь).

Пользовательмодуль принимает модуль Db.

Но я должен отправить каждую функцию Db в пользовательском модуле или весь объект Db.

Я имею в виду это (в JS):

const User = {
insert(inserted, userData) {

},
delete(deleter, userId) {
}
}

User.insert(Db.insert, {username: 'asd', admin: 1..});

User.delete(Db.delete, 123);

или это:

function User(db) {
  return {
    insert(userData){..}
    delete(userId){..}
}
let usrs = User(Db)
usrs.insert({username..}).
usrs.delete(123)

Как вы видите, второй пример кода меньше, но он все еще объектно-ориентирован.

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

Можете ли вы предложить, если есть лучший способ сделать это. Поэтому, если в будущем я изменю объект Db (например, mysql из sqlite), мне придется изменить его только в одном месте.

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Я бы посмотрел на эту серию статей на эту конкретную тему, написанную Марком Симаном. Марк часто пишет о SO, поэтому он может расширяться.

Чтобы чрезмерно упростить, есть несколько подходов в зависимости от вашей сложности и вашего стремления к функциональной чистоте.

Самое простоепросто взять зависимости в качестве аргументов функций. Таким образом, вы определяете свои зависимости «снаружи» вашего кода и «внедряете» их в ядро ​​с помощью аргументов. Для более сложных сценариев вам может не понравиться множество дополнительных аргументов, к которым это может привести.

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

Для пуристов FP существуют другие методы, но они обычно полезны только в чисто функциональных языках. Впрочем, Марк может не согласиться с этим.

Использование некоторых из этих методов будет ограничено поддержкой, которую ваш язык поддерживает для FP. Например, я не знаю, что JS имеет функцию каррирования, но опять же, у меня очень ограниченный опыт работы с JS. Возможно, вы также захотите попробовать язык FP, который транскомпилируется в JS, например F # / Fable или Purescript.

0 голосов
/ 28 октября 2019

Не пишите свой собственный механизм внедрения зависимостей - используйте исчерпывающий, например, здесь . Хороший подход - создать класс User и внедрить объект DB в конструктор User (и сохранить его как личное поле класса User). Еще лучший подход заключается в создании UserService, в который введено DB и которое позволяет работать (например, чтение / запись) на моделях User s.

...