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

Общался сегодня с одним java-разработчиком у себя на канале она статью

про dip, di и иже с ними выложила
и в примере с dip был там следующий код:
class Service {
LoggerInterface logger;
public function Service() {
logger = new FileLogger();
}
}
я до этого читал, что dip - это никаких упоминаний реализаций (в частности потому как они тянут за собой компилирование вашего пакета) + у дядюшки Боба читал, что никаких import, require или use быть не должно, и поэтому считал, что вот это вот new FileLogger() является как раз нарушением этого принципа

пообщался с автором поста, она топит за то, что dip - это когда твой код с интерфейсом работает, а не с реализацией и инициализация сюда не входит
типа инициализация - это уже di скорее, а к dip'у только боком относится
и на мое замечание "тогда можно создать конкретный класс, перед каждым использованием приводить его к интерфейсу (типа ((LoggerInterface)logger)->log()) и всем говорить, что у нас соблюдается dip" она ответила, что да, это и будет dip
и вот интересно стало: а правда где?

я понимаю ее подход, но так же понимаю и подход "никаких упоминаний реализаций" и последний мне ближе
а потом подумал, будет ли следующий код соответствовать dip:
abstract class Service {
abstract function getLogger(): LoggerInterface;
}
?
вроде здесь никаких упоминаний реализации, но получается, что мы реализацию перекладываем на клиента, а он внутри getLogger() может как конкретный объект создавать, так и возвращать заинъекченный по интерфейсу
и вот в моем понимании в первом случае будет нарушение dip, а во втором - нет
т.е. и абстрактный класс как бы завис: нарушать или нет?

и вот как правильно? включать инициализацию по интерфейсу, чтобы можно было говорить про dip? или работу с объектом через интерфейс и считать dip? даже если двумя строчками выше идет инициализация конкретной реализации
если последнее, то как тогда называется, когда у нас dip + инъекция по интерфейсу? по любому же название есть

2 ответов

18 просмотров
Andrey-Bakharev Автор вопроса

вот здесь вот код с abstract function getLogger(): LoggerInterface; не понятно как к нему относиться мне не нравится тем, что в дочернем классе могут на реализацию забиндиться, но с другой стороны - это же не моя проблема? или моя? если я разрешаю что-то сделать не правильно - я плохо поступаю?

Andrey Bakharev
вот здесь вот код с abstract function getLogger():...

Да, нельзя разрешать делать хуйню, в этом смысл архитектуры

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
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
Карта сайта