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

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

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

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

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

22 ответов

142 просмотра

хм, передача интерфейса,, вместо реализации — это всё же 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 Автор вопроса
Kirill Nesmeyanov
т.к. у тебя логотип "го" в имени, то есть пример о...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта