
Alfred
03.03.2017
13:15:39
код который делает di очень простой и не требует много времени. Его иногда скучно писать, но зато ты прописываешь руками все зависимости явно
можно сначала попробовать начать с пары convinience – designated инициализаторов, convinience будет такой как раньше а designated будет принимать все зависимости.

Dmitriy
03.03.2017
13:19:21
что такое ДИ?

Alfred
03.03.2017
13:19:41
soliD

Google

q210
03.03.2017
13:19:43
Dependency Injection
https://www.equinox.co.nz/blog/dependency-inversion-dependency-injection-inversion-control-programming-interfaces
если ты конечно не имел в виду именно dependency inversion - тогда извиняюсь

Dmitriy
03.03.2017
13:26:37
а депенденси инжекшн - это создание дисигнитед инициализаторов и передача туда параметров?)

q210
03.03.2017
13:27:04
передача туда зависимостей в качестве параметров
да, DI можно сделать и так
а можно как делает objection
https://github.com/atomicobject/objection

Dmitriy
03.03.2017
13:27:50
что такое зависимости?)
ссылки на другие классы?)
ClassA *classA = [ClassA initWithClassB:self]
это передача зависимости и депенденси инжекшн?

Google

Alfred
03.03.2017
13:29:43
ссылки на другие классы?)
Объекты, функции, числа. Напрмер если твой класс ImageFetcher загружает картинки, то он не должен внутри себя звать [NSURLSession sharedSession], а сессия должа быть передана в инициализатор.

Dmitriy
03.03.2017
13:30:37

Антон
03.03.2017
13:31:01
тестировать можно

Dmitriy
03.03.2017
13:31:38
тоесть это лишь для тестов делается?

Alfred
03.03.2017
13:31:46
(3) снаружи изменять поведение объекта, что дает гибкость

q210
03.03.2017
13:33:39
если твоему модулю (можешь считать для простоты "классу") A нужен для работы другой определённый класс B - это зависимость, причём явная. Например ты в инициализаторе прописал _session = [NSURLSession sharedSession].
В будущем ты не сможешь просто так перейти на какой-нибуть MySUPERSession без изменения своего класса A.

Dmitriy
03.03.2017
13:33:50
тоесть, переприсваивая его переменной - мы можем переписать геттер переменной и это будет повышением уровня абстракции?
угу

Alfred
03.03.2017
13:34:39
> мы можем переписать геттер переменной
какой геттер?

q210
03.03.2017
13:34:44
DI говорит нам - передай свою сессию в инициализаторе, и не указывай в классе A её класс явно, и сможешь потом если что заменить её без проблем
например на сабкласс, или даже просто на что-то, что реализует тот же протокол

Dmitriy
03.03.2017
13:35:51
_session = [NSURLSession sharedSession] (session - это же пропертя?)
- (NSURLSession)session {
// чета тут делаем
return // нужный результат
}
для этого делается переприсваивание?

-_-
03.03.2017
13:35:59

q210
03.03.2017
13:36:00
ну и плюс тестировать будет проще, опять же
MySUPERSession которая будет использоваться в классе A должна иметь только то, что надо для класса А

Alfred
03.03.2017
13:36:40

q210
03.03.2017
13:36:48
если уж на то пошло, в классе A ты можешь вообще объявить её как (id session)

Google

Asyl
03.03.2017
13:36:52

Alfred
03.03.2017
13:36:58

q210
03.03.2017
13:37:01
и вообще дёргать через селекторы
если сильно хочется
но да, протоколы лучше

-_-
03.03.2017
13:37:18
Я просто не понимаю
Вот я написал свой класс
Передал ему NSURLSession через инициализатор
И захотел поменять на MySUPERSession
Ну передам я MySUPERSession

Asyl
03.03.2017
13:37:55
Делая в вайпере проект понял что вайпер без ДИ ничего

-_-
03.03.2017
13:38:00
Работать-то не будет. Внутри надо менять
В чем профит?

Asyl
03.03.2017
13:38:38

q210
03.03.2017
13:38:58
в классе A у тебя вообще нигде не упоминается NSURLSession

-_-
03.03.2017
13:39:06

Asyl
03.03.2017
13:39:17
Вот создаете протокол

q210
03.03.2017
13:39:27
у тебя там везде упоминается лишь некий объект сессии, который должен реализовать протокол, который нужен для работы класса А

Asyl
03.03.2017
13:39:29
Там указывается все концертные методы

-_-
03.03.2017
13:39:50

Google

-_-
03.03.2017
13:39:55
Так-то понятно

q210
03.03.2017
13:40:08
потому ты можешь передать туда NSURLSession, MySUPERSession или всё что угодно что этот протокол реализует

Alfred
03.03.2017
13:40:10
Работать-то не будет. Внутри надо менять
(1) если MySUPERSession наследник NSURLSession – то всё будет работать. (2) ты можешь передать туда другую сессию, отличную от shared (например для инкогнито браузинга)

-_-
03.03.2017
13:40:29

Alfred
03.03.2017
13:40:37
Тогда надо под протокол

q210
03.03.2017
13:40:40
и даже протокол здесь необязателен - как я писал выше, ты можешь решать всё через id и селекторы
потому что Obj-C позволяет динамическую типизацию

Alfred
03.03.2017
13:40:51
это уже попахивает

q210
03.03.2017
13:41:00
питоном попахивает)
duck typing наше всё
но да, в продакшн коде лучше так не писать

Alfred
03.03.2017
13:42:16
duck typing наше всё
переодически ловим креши в проде с анрекогнайзд селекторами, так что лучше без этих радостей

Dmitriy
03.03.2017
13:42:24
тоесть вы всегда в коде в инициалзиаторе создаете
@property (weak, nonatomic) id session
- (instatype)init {
...
_session = [NSUrlSession sharedSession]
return self
}

q210
03.03.2017
13:42:54
это явная зависимость, которая привязывает твой класс к конкретному классу NSUrlSession

Alfred
03.03.2017
13:42:55
нет, в инициализатор как параметр сессия идет

Asyl
03.03.2017
13:43:11
С Id какое то извращение по мне)

q210
03.03.2017
13:43:34
в проде так не пишу - это моё питоновое прошлое нашёптывает
но у эппла в foundation так много где есть кстати

Dmitriy
03.03.2017
13:43:52
просто если в этом классе потом нужно заменить [NSUrlSession sharedSession] на что-то другое
я делаю контрл ф - финдр / реплейс

Google

Dmitriy
03.03.2017
13:44:08
и в 1 кнопку все заменяю

Alfred
03.03.2017
13:44:13

-_-
03.03.2017
13:44:22
initWith имеется в виду
А туда уже NSURLSession

Alfred
03.03.2017
13:45:13

q210
03.03.2017
13:45:23
потому что задание так поставили, или ты пишешь библиотеку которую непонятно кто захочет как использовать, или тестируешь свой класс и хочешь вместо реальной сессии использовать тестовую

Dmitriy
03.03.2017
13:45:32
тоесть вы всегда в коде в инициалзиаторе создаете
@property (weak, nonatomic) id session
@property (strong, nonatomic) ClassB *classB
- (instatype)initClassB:(ClassB)classB {
...
_classB = classB
_session = [NSUrlSession sharedSession]
return self
}
так?) это теперь депенденси инжекшн?

q210
03.03.2017
13:46:06
всё ещё явная зависимость потому что в коде есть NSUrlSession класс

Alfred
03.03.2017
13:47:04
@property (weak, nonatomic) id<MySession> session
- (instatype)initWithSession:(id<MySession>)session {
...
_session = session;
return self
}

q210
03.03.2017
13:47:09
?

Dmitriy
03.03.2017
13:47:21

Asyl
03.03.2017
13:47:31
И так практичнее

Dmitriy
03.03.2017
13:49:15
и в класе юзаю не [NSUrlSession sharedInstance]
а сразу нужный запрос делаю из моего класса?

q210
03.03.2017
13:50:05
блоки здесь это Inversion of Control

Dmitriy
03.03.2017
13:50:41
и он тож синглтон но вызывается [MySession sharedsessin]loginUser...