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

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

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

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

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

22 ответов

136 просмотров

хм, передача интерфейса,, вместо реализации — это всё же 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 и навязан) на примере репозитория ситуация следующая - обычно юзается какой то орм, и в сервисы передается дата-контекст. Через него уже получаем данные. Для тестирования можно (и на практике лучше) прям поднять тестовую базу и на ней гонять. При смене базы (если таковое случится) то меняется коннекшн стринг остальная работа нет. на самом деле конечно да, тк ни один орм не позволит совсем уж абстрагироваться от базы

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта