212 похожих чатов

Для чего надо делать DI в коде? Например, репозиторий передавать

в сервис через интерфейс, а не конкретный тип.

Существуют следующие варианты:
1. Тестирование. Чтобы реализацию репозитория заменить на мок. Ок. Это валидная причина, но она не главной должна быть.
2. Late Binding позднее связывание. Чтобы мы в рантайме могли выбрать конкретную реализацию репозитория, например mysql или postgres. В целом тоже валидная причина, но имхо довольно редкая.
3. Параллельная разработка. Репозиторий и сервис разрабатывается разными людьми одновременно. В целом тоже ок. Но опять вряд ли это главная причина
4. Расширяемость. Чтобы одну реализацию можно было заменить на другую. Хоть у меня и были такие ситуации, когда одна бд меняется на другую. Но все же это опять редкий случай. Но вот эта причина вроде, как главная. Она у Роберта Мартина вроде как основной считается. Но она все равно довольно редкая.

И вот разобрав эти причины в сухом остатке остается, что единственная не редкая причина для DIP - это именно тестирование. Есть мысли у кого-нибудь какие-то?

22 ответов

69 просмотров

хм, передача интерфейса,, вместо реализации — это всё же IoC из SOLID

Kirill Nesmeyanov
хм, передача интерфейса,, вместо реализации — это ...

Ioc не из солид и не имеет к нему отношения. Dip из солида

DI у нас в тиме это ещё и удобная фабрика для инициализации всего этого добра

Rostislav-Teryaev Автор вопроса
Sergey P
Ioc не из солид и не имеет к нему отношения. Dip и...

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

Rostislav Teryaev
Вот тот же DIP - это довольно абстрактная штука. Я...

Ну вот у тебя репозитории пример. Консольная команда: "выведи список пакетов из репозитория": - interface IPackages и реализации - class GitHubPackages - class DatabasePackages

Rostislav-Teryaev Автор вопроса
Ghost Walker
не зависеть от конкретной реализации

Вот неудовлетворительный ответ. Я всегда так и отвечал. Но что будет плохого, если у нас 1 репозиторий. В чем преимущество этой слабой связности? 1 импорт поменять в уровне сервиса? Ну не велика проблема

Rostislav Teryaev
Вот неудовлетворительный ответ. Я всегда так и отв...

окей, если у тебя по определению несколько бд / адаптеров ?)

Rostislav Teryaev
Вот неудовлетворительный ответ. Я всегда так и отв...

т.к. у тебя логотип "го" в имени, то есть пример очевиднее: Логгер))) Было бы неплохо завязываться на интерфейс логгера, например. Потому что реализаций куча, и одна хуже другой

Kirill Nesmeyanov
т.к. у тебя логотип "го" в имени, то есть пример о...

Попробовал логгер убера — он говно. Одной кнопкой переключился на логгер другой (гугла например)

Rostislav-Teryaev Автор вопроса
Rostislav Teryaev
ну в основном один у меня

тут проблемы встают больше на больших кодовых базах

Rostislav-Teryaev Автор вопроса
Kirill Nesmeyanov
т.к. у тебя логотип "го" в имени, то есть пример о...

тут интерфейс ок т.к. все реализации именно разные. Но репозитории мы то делаем одинаковые. Одни и те же методы, одни и те же аргументы

Rostislav Teryaev
тут интерфейс ок т.к. все реализации именно разные...

Ну и у логгеров одни и теже методы будут. Один единственный log со строкой, уровнем "ошибки" (дебаг/варнинг/эррор/проч) и ещё что-то

Rostislav-Teryaev Автор вопроса
Ghost Walker
тут проблемы встают больше на больших кодовых база...

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

Rostislav-Teryaev Автор вопроса

Что подразумеваешь под контейнером? Di контейнер? Я не использую

Ghost Walker
а ты используешь в сервисе контейнер ?

DIP не требуется для di. Просто не надо их вместе рассматривать. + Не всему нужны контейнера

Sergey P
DIP не требуется для di. Просто не надо их вместе ...

а я их и не сравнивал, di можно и без интерфейсов использовать

В дотнет мире (хотя там и есть DI и навязан) на примере репозитория ситуация следующая - обычно юзается какой то орм, и в сервисы передается дата-контекст. Через него уже получаем данные. Для тестирования можно (и на практике лучше) прям поднять тестовую базу и на ней гонять. При смене базы (если таковое случится) то меняется коннекшн стринг остальная работа нет. на самом деле конечно да, тк ни один орм не позволит совсем уж абстрагироваться от базы

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
12
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Карта сайта