В эти дни у меня возник вопрос:
Идет ли то, как мы, Javascript, против всего, что считается хорошей практикой в традиционной разработке программного обеспечения?
У меня есть ряд вопросов / замечаний, связанных с этим утверждением, но для того, чтобы уважать формат StackExchange, будет лучше, если я разделю их на разные вопросы.
Модуль, требующий
Стандартный код Javascript в настоящее время выглядит так:
const someModule = require('./someModule')
module.exports = function doSomethingWithRequest() {
// do stuff
someModule.someFunc()
// do other stuff
}
преимущества
- Инкапсуляция: модуль работает автономно и знает все, что нужно для выполнения своих функций.
- Как клиент, клиентам проще использовать модуль.
Недостатки
- Плохая тестируемость: это стандартно, когда не используется DI, но в динамических языках, таких как Javscript, его можно обойти * с помощью таких модулей, как
mockery
илиrewire
. - Это, безусловно, нарушает DIP - не путать с Dependency Injection. - поскольку я могу импортировать только конкретные модули.
- Это, вероятно, нарушает OCP - например, представьте, что у меня есть модуль журнала, который пишет в файловую систему (через
fs
модуль). Если я захочу расширить этот модуль журнала для отправки его в сеть, это будет очень сложно.
* Это может работать с модулями CommonJS или даже AMD, поскольку они в основном реализованы в пользовательской среде. Однако я не уверен, как это может быть возможно с import
синтаксисом ES6 .
Внедрение зависимости
Используя внедрение зависимостей, это было бы больше похоже на:
module.exports = function doSomethingWithRequest(someModule) {
// do stuff
someModule.someFunc()
// do other stuff
}
преимущества
- Повышенная тестируемость: теперь проще заглушки / макеты
someModule
, даже используя синтаксис ES6. - Это можно чтить DIP: не обязательно , хотя, как клиентский модуль все еще может быть запрограммирован для реализации и не интерфейс.
Недостатки
- Нарушенная инкапсуляция: главный вопрос остается:
Хорошо, тогда кто будет создавать / требовать зависимости?
- Выполнение этого в каждом клиенте модуля кажется очень влажным .
- Это, вероятно, потребовало бы от меня использования DI-контейнера, чтобы это было осуществимо в реальном проекте.
Итак, настоящий вопрос здесь:
Почему разработчики Javascript склоняются к первому подходу?
Это просто «путь Javascript»?
Я сам пишу такой код большую часть времени. У меня была справедливая доля тестовой установки с использованием насмешливых библиотек, но это всегда казалось неправильным.
Я что-то пропустил?