
Timur
20.10.2016
23:38:35

Eugene
20.10.2016
23:39:44
В идеале должны даваться все плюсы DI=)
Тестируемость, изоляция отдельных классов/модулей/компонентов друг от друга
Но к сожалению, в исполнении Dagger все эти преимущества даются в несколько искаженном формате, потому что в принципе сам по себе Android не дает такой власти над инстанцированием классов

Google

Eugene
20.10.2016
23:42:04
Поэтому лично имхо, dagger все же хорошо годится для построения более-менее слабо связанной архитектуры приложения без применения рефлексии
Но в плане удобства до того же Spring ужасно не дотягивает

Timur
20.10.2016
23:47:20

Eugene
20.10.2016
23:47:44
Да не за что)

Timur
20.10.2016
23:49:40
В целом я бы хотел указать как раз на то, что тесты нужны крайне небольшому количеству мобильных проектов.
Изоляция тоже условие скорее желательное, чем обязательное. Не вполне понятно, зачем это тащить в мобилку
энтерпрайз пусть живёт своей жизнью, тут вопросов нет


Eugene
20.10.2016
23:51:04
Ну... В домашних проектах - возможно да, в проектах стартапов/соло-разработчиков - может быть тоже. Но в компании, у которой в активе есть хотя бы 5-7 активно поддерживаемых и развиваемых приложений - без этого никуда.
Опять же, код без четкой изоляции слоев друг от друга с вероятностью 95% рано или поздно обрастает лапшой
Плюс, мало кто заморачивается тем, чтобы корректно держать переиспользуемые инстансы в памяти только в рамках того жизненного цикла, где это нужно. Из-за этого лично я неоднократно видел код, в котором в 5 конструкторах 5 разных классов создается один и тот же инстанс какого-нибудт http-клиента с одними и теми же настройками. И когда возникает необходимость, например, вкорячить в каждый запрос куку - приходится это делать в 5 разных местах.


Timur
20.10.2016
23:53:42
Плюс, мало кто заморачивается тем, чтобы корректно держать переиспользуемые инстансы в памяти только в рамках того жизненного цикла, где это нужно. Из-за этого лично я неоднократно видел код, в котором в 5 конструкторах 5 разных классов создается один и тот же инстанс какого-нибудт http-клиента с одними и теми же настройками. И когда возникает необходимость, например, вкорячить в каждый запрос куку - приходится это делать в 5 разных местах.
Если у кого-то кривые лапы, которыми он треды стартует где не надо, да ещё и 5-7 раз - это не даггер нужен, а увесистые, от всей души, пиздюли)
но это другая история

Google

Timur
20.10.2016
23:55:11
у меня сегодня горит

Eugene
20.10.2016
23:55:12
Согласен :)
Ситуацию рукожопов можно обсуждать бесконечно, им дай фреймворк или либу с единственным методом sdelatZaebis(), и они все равно что-нибудь сделают не так)

Vitaliy
20.10.2016
23:56:23
Но на деле лапша никуда не исчезает
Появились переменные, появилась лапша с ними
Функции -- теперь они образуют лапшу
ООП -- та же лапша, но теперь из связей между объектами и их состояниями

Eugene
20.10.2016
23:57:54
Ооо, это уже разговор совсем о другом, как мне кажется)

Vitaliy
20.10.2016
23:58:04
Меняешь что-то в одном классе -- сломаться может в любом другом. Люди уже тесты пишут, потому что без лапши никуда
Мы просто переносим её на другой уровень абстракции

Eugene
20.10.2016
23:59:13
То что функции надо стараться писать без побочных эффектов и максимально стремиться к иммутабельности - это тема для долгих холиваров возле камина за бокалом вискаря :)

Vitaliy
20.10.2016
23:59:34
И не только функции
Короче, вся лапша от нас самих
Ну и от апи, который к ней принуждает

Eugene
21.10.2016
00:00:38
Лично мне просто гораздо больше нравится видеть класс, в котором есть только логика, входящая в его область ответственности и сущности, которые нужны этому классу для исполнения своих обязанностей.
И если эта сущность не является какой-то дочерней сущностью - я не желаю видеть в этом классе логику инстанцирования, я просто хочу, чтобы она там уже была
А откуда она там взялась - я знать, условно говоря, не хочу

Vitaliy
21.10.2016
00:02:13
Мы все хотим так :)

Eugene
21.10.2016
00:02:23
Просто тут мне, как это часто бывает, бьют по рукам даггер вместе с андроидом и приходится писать уродские конструкции типа WTFComponent.inject(this)

Google

Vitaliy
21.10.2016
00:02:42
Проблема в том, что даже с этим мы можем изменением кода нарушить работу метода или стейта класса
Вот тебе и лапшеобразная зависимость :)

Eugene
21.10.2016
00:03:20
Вот одна из причин, почему мне нравится Rx=)
Он в какой-то мере принуждает писать stateless-код)

Vitaliy
21.10.2016
00:03:49
Там точно такая же абстракция наверх :)
Но в целом да, функциональное программирование поустойчивее будет
К сожалению, на Андроиде можно писать только либо быстрый, либо правильный код :)

Eugene
21.10.2016
00:04:48
Я все жду, когда же уже наконец кто-нибудь посчитает в процентах, какое же влияние rx оказывает на футпринт приложения :)

Vitaliy
21.10.2016
00:05:19
А как ты собираешься считать GC?
Можно посчитать только время выполнения кода

Andre
21.10.2016
00:05:55
так ведь логируется, сколько времени заняла сборка

Vitaliy
21.10.2016
00:06:01
Которое у Рх будет меньше, кстати

Vitaliy
21.10.2016
00:06:08
Ну логи и все.

Eugene
21.10.2016
00:06:15
Да банально на уровне того, сколько памяти потребуется на выполнение какой-то сложной цепочки вычислений над одним и тем же набором данных без rx и c ним)

Vitaliy
21.10.2016
00:06:16
Будешь их парсить? :)
Тут дело не в объеме памяти, а в размере графа
Объем памяти влияет на частоту GC
Количество объектов на время его работы

Eugene
21.10.2016
00:07:46
Я не знаток в кишках rx, но насколько я могу понять - каждый оператор в цепочке вычислений observable должен порождать новые данные
Т.е. банально, был у меня лист int'ов, я его через rx смапил на лист float, а потом на стринги. Если я все себе правильно представляю, у меня в памяти будут держаться все три листа, пока я не ушатаю этот observable

Google

Vitaliy
21.10.2016
00:09:21
Новые данные, сам оператор функтор, все объекты вроде обсервера и сабскайбкра тоже
И оьсерваблы
И листов из инттв нет

Eugene
21.10.2016
00:09:53
Вот об этом я и говорил) На словах вроде все понятно, но интересно было бы оценить реальное воздействие

Vitaliy
21.10.2016
00:09:59
Есть из интегеров

Eugene
21.10.2016
00:10:27
Блин, да это все понятно, тут не школьники вроде сидят)

Vitaliy
21.10.2016
00:13:01
Ты удивишься, сколько разрабов об этом не знает :)
И думает, что так типа тоже норм
Так что прости, если объяснял очевидное :)

Eugene
21.10.2016
00:13:49
Я частенько собеседую чуваков к нам в отдел, меня уже ничем не удивишь?

Admin
ERROR: S client not available

Eugene
21.10.2016
00:13:58
Все норм)
Однажды пришел чувак 32-35 лет от роду и не смог объяснить, что такое интерфейс, а что такое - абстрактный класс

Vitaliy
21.10.2016
00:16:29
У меня было так, что на собесе чувак отвечал про автобоксинг правильно и даже контейнеры нужные назвал, а в задании потом писал мне Map из интов

Eugene
21.10.2016
00:17:40
¯\_(ツ)_/¯

Timur
21.10.2016
00:19:16
просто он может не объяснить, но нормально написать код
хотя с другой стороны от задания зависит..

Andre
21.10.2016
00:21:38
ну, кстати, есть же библиотека Trove с коллекциями из примитивов

Google

Eugene
21.10.2016
00:25:03
Да мне бы как угодно сошло, там человек вообще таких слов не знал)
Имхо, надо идти от самого простого. В интерфейсе не может быть реализованных методов, а в абстрактном классе могут быть)
Ну а дальше уже можно начинать философствовать на тему того, когда и что нужно юзать)

Vitaliy
21.10.2016
00:27:10

Dmitriy
21.10.2016
00:27:47

Eugene
21.10.2016
00:27:57
Это уже java 8 и ее извраты)

Dmitriy
21.10.2016
00:28:25
ой, точно, андроид, да

Vitaliy
21.10.2016
00:28:58
Ну с дефолтом получается, что интерфейсы это просто трейты
Для множественного наследования

Eugene
21.10.2016
00:29:27
Интерфейс как множество публичных методов - это термин из области программирования в целом, говоря о джаве под интерфейсом подразумевают именно джавовские интерфейсы)

Vitaliy
21.10.2016
00:29:50
Ага
Поэтому и "по-хорошему"

Eugene
21.10.2016
00:30:28
Короче, думаю мы тут все друг друга хорошо понимаем) Вот если б тот чувак так же со мной поговорил - я бы остался доволен.
Но нет, он сказал что-то вроде "м...ээээээ....нуууу"

Vitaliy
21.10.2016
00:30:49
Это был оффер? :)

Andre
21.10.2016
00:31:14
ну и не забываем, что конкретно в жабе мы можем интерфейсов сколько угодно реализовывать

Eugene
21.10.2016
00:33:11
Нет, это был контроффер
Или я даже не знаю как назвать ситуацию, когда я был готов заплатить, лишь бы он ушел :)

Vitaliy
21.10.2016
00:33:30
:(
Я о себе

Eugene
21.10.2016
00:33:51
Ааа
Неее, у нас, к сожалению, есть формальная процедура)
Нужно прийти и сказать все то же самое в лицо :)