@ios_ru

Страница 648 из 2351
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

soliD
не совсем

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], а сессия должа быть передана в инициализатор.

а можно как делает objection
это вроде тайфуна?

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

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

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

Alfred
03.03.2017
13:31:46
аааа. А какая разница? В инициализаторе он же тоже переприсвоится какой-то переменной и будет так же вызываться? просто короче запись?
Разница в том, что (1) зависимость явная. (2) можно менее болезненно перейти на другой механизм фетчинга (повысить абстракцию)

(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 // нужный результат }

для этого делается переприсваивание?

q210
03.03.2017
13:36:00
ну и плюс тестировать будет проще, опять же

MySUPERSession которая будет использоваться в классе A должна иметь только то, что надо для класса А

Alfred
03.03.2017
13:36:40
если ты конечно не имел в виду именно dependency inversion - тогда извиняюсь
я иногда путаю, так как почти не знаю другие механизмы реализации dependency inversion кроме как dependency injection.

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

Google
Asyl
03.03.2017
13:36:52
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

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 (например для инкогнито браузинга)

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
но у эппла в foundation так много где есть кстати
вот, там забыл проверить на respondsToSel и всё

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

А туда уже NSURLSession

я делаю контрл ф - финдр / реплейс
Это выход, но типа не по канону)

Alfred
03.03.2017
13:45:13
и в 1 кнопку все заменяю
у тебя всё это на бэби кодинг похоже

q210
03.03.2017
13:45:23
я делаю контрл ф - финдр / реплейс
а теперь представь, что ты хочешь этот же код заиспользовать с 2мя разными классами сессий

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

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

Dmitriy
03.03.2017
13:49:15
@property (weak, nonatomic) id<MySession> session - (instatype)initWithSession:(id<MySession>)session { ... _session = session; return self }
а если я через блоки делаю? и в классе MySession методы - loginUserWithParameters:(nsdict )parameters blockSuccess:(block)sucess failure:(block)failure

и в класе юзаю не [NSUrlSession sharedInstance]

а сразу нужный запрос делаю из моего класса?

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

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

Страница 648 из 2351