q210
имхо – зло
вплане того, что если тебе она нужна, значит ты тестируешь слишком глубоко и завязываешься на детали имплементации модуля? мб, я тоже иногда сомневаюсь
Ivan
А если еще DI добавить и viper притащить, то проект по стоимости становится как самолет
Ivan
А падает так же, как и обычный код
Ivan
Печаль беда
Alfred
Alfred
у нас ручной di и всё ок
Ivan
Я в принципе не против, раз находятся желающие платить за это все
Ivan
И разработчикам не скучно
Alfred
код который делает di очень простой и не требует много времени. Его иногда скучно писать, но зато ты прописываешь руками все зависимости явно
Alfred
можно сначала попробовать начать с пары convinience – designated инициализаторов, convinience будет такой как раньше а designated будет принимать все зависимости.
Paks
что такое ДИ?
Alfred
soliD
q210
Dependency Injection
q210
q210
https://www.equinox.co.nz/blog/dependency-inversion-dependency-injection-inversion-control-programming-interfaces
q210
если ты конечно не имел в виду именно dependency inversion - тогда извиняюсь
Paks
а депенденси инжекшн - это создание дисигнитед инициализаторов и передача туда параметров?)
q210
передача туда зависимостей в качестве параметров
q210
да, DI можно сделать и так
q210
а можно как делает objection
q210
https://github.com/atomicobject/objection
Paks
что такое зависимости?)
Paks
ссылки на другие классы?)
Paks
ClassA *classA = [ClassA initWithClassB:self]
Paks
это передача зависимости и депенденси инжекшн?
Alfred
ссылки на другие классы?)
Объекты, функции, числа. Напрмер если твой класс ImageFetcher загружает картинки, то он не должен внутри себя звать [NSURLSession sharedSession], а сессия должа быть передана в инициализатор.
Alfred
Paks
Anton
тестировать можно
Paks
тоесть это лишь для тестов делается?
Alfred
Alfred
(3) снаружи изменять поведение объекта, что дает гибкость
q210
если твоему модулю (можешь считать для простоты "классу") A нужен для работы другой определённый класс B - это зависимость, причём явная. Например ты в инициализаторе прописал _session = [NSURLSession sharedSession].
В будущем ты не сможешь просто так перейти на какой-нибуть MySUPERSession без изменения своего класса A.
Paks
тоесть, переприсваивая его переменной - мы можем переписать геттер переменной и это будет повышением уровня абстракции?
Paks
угу
Alfred
> мы можем переписать геттер переменной
какой геттер?
q210
DI говорит нам - передай свою сессию в инициализаторе, и не указывай в классе A её класс явно, и сможешь потом если что заменить её без проблем
q210
например на сабкласс, или даже просто на что-то, что реализует тот же протокол
Paks
_session = [NSURLSession sharedSession] (session - это же пропертя?)
- (NSURLSession)session {
// чета тут делаем
return // нужный результат
}
Paks
для этого делается переприсваивание?
Stanislav
q210
ну и плюс тестировать будет проще, опять же
q210
MySUPERSession которая будет использоваться в классе A должна иметь только то, что надо для класса А
q210
если уж на то пошло, в классе A ты можешь вообще объявить её как (id session)
Asylbek
Alfred
q210
и вообще дёргать через селекторы
q210
если сильно хочется
q210
но да, протоколы лучше
Stanislav
Я просто не понимаю
Stanislav
Вот я написал свой класс
Stanislav
Передал ему NSURLSession через инициализатор
Stanislav
И захотел поменять на MySUPERSession
Stanislav
Ну передам я MySUPERSession
Asylbek
Делая в вайпере проект понял что вайпер без ДИ ничего
Stanislav
Работать-то не будет. Внутри надо менять
Stanislav
В чем профит?
q210
в классе A у тебя вообще нигде не упоминается NSURLSession
Stanislav
Asylbek
Вот создаете протокол
q210
у тебя там везде упоминается лишь некий объект сессии, который должен реализовать протокол, который нужен для работы класса А
Asylbek
Там указывается все концертные методы
Stanislav
Так-то понятно
q210
потому ты можешь передать туда NSURLSession, MySUPERSession или всё что угодно что этот протокол реализует
Alfred
Работать-то не будет. Внутри надо менять
(1) если MySUPERSession наследник NSURLSession – то всё будет работать. (2) ты можешь передать туда другую сессию, отличную от shared (например для инкогнито браузинга)
Stanislav
Alfred
Тогда надо под протокол
q210
и даже протокол здесь необязателен - как я писал выше, ты можешь решать всё через id и селекторы
q210
потому что Obj-C позволяет динамическую типизацию
Alfred
это уже попахивает
q210
питоном попахивает)
q210
duck typing наше всё
q210
но да, в продакшн коде лучше так не писать
Alfred
duck typing наше всё
переодически ловим креши в проде с анрекогнайзд селекторами, так что лучше без этих радостей
Paks
тоесть вы всегда в коде в инициалзиаторе создаете
@property (weak, nonatomic) id session
- (instatype)init {
...
_session = [NSUrlSession sharedSession]
return self
}
q210
это явная зависимость, которая привязывает твой класс к конкретному классу NSUrlSession