
Quantum Harmonizer
17.09.2018
12:57:42
на машине Тьюринга никуда не уедешь :)

Alexander
17.09.2018
12:58:33
Архитектура котлиновской программы никогда не будет чисто функциональной. Да и чистым языком котлин не будет. Так зачем?
Просто для того, чтобы сердце грело?
Я понимаю, зачем нужны чистые языки и какие в этом плюсы. Ради этого можно идти на много разных жертв. Но если чистоты нет, то на фига?..

Google

Andrey
17.09.2018
13:02:09

Alexander
17.09.2018
13:02:47
В котлине это нельзя сделать. И не надо пытаться, слишком много всего нужно выкинуть для того, чтобы было можно

Andrey
17.09.2018
13:03:23

Alexander
17.09.2018
13:03:40
Нет возможноть гарантировать чистоту функции

Mikhail
17.09.2018
13:03:59

Alexander
17.09.2018
13:04:22
Я могу, но я не могу гарантировать, что он будет изолированным.
Хаскель про гарантии

Igor
17.09.2018
13:04:41

Alexander
17.09.2018
13:04:53
ага
Но если нет гарантии, зачем мучиться

Igor
17.09.2018
13:05:50

dimiii
17.09.2018
13:06:10

Mikhail
17.09.2018
13:06:19

Google

Alexander
17.09.2018
13:06:52
Ну незнаааю. Функциональные конструкции проще тестировать, но значительно сложнее отлаживать. Тут вполне возможно, что шило на мыло

Mikhail
17.09.2018
13:07:48
в общем, тут каждый сам решает для себя

Andrey
17.09.2018
13:11:33

Alexander
17.09.2018
13:12:49
Ну, DI - вообще зло. Я пришел к выводу, что это тоже дань моде, причем часто чрезмерная. Не могу сказать, что он не нужен, но я посмотрел как его пихают во все дыры. После этого вообще отладить невозможно

Руслан
17.09.2018
13:13:46
Что там в DI сложно отлаживать) Для проекта больше 30 классов и одного разработчика DI must-have.

Andrey
17.09.2018
13:13:57

dimiii
17.09.2018
13:14:11

Quantum Harmonizer
17.09.2018
13:14:26

Alexander
17.09.2018
13:15:28
Скажем, так чрезмерное использование инверсии при помощи контейнеров. Классический жуть - это когда объекты, которые явно должны передаваться как параметры в конструкторе зачем-то генерят при помощи DI
Просто чтобы не думать

Руслан
17.09.2018
13:16:02

Alexander
17.09.2018
13:17:08
Невозможно глядя на код понять какой объект откуда приходит и в каком состоянии
Отладкой в среде наверное все победить можно

Andrey
17.09.2018
13:18:19

Alexander
17.09.2018
13:19:39
Я в последний раз расковыривал вот это: https://github.com/JavaEden/Orchid Очень хорошая идея, но код там адский внутри. Полнейший abuse guice и еще и с lombok впридачу. Ну не говоря о том, что там какие-то нелокальные изменения состояния и прочие радости

Руслан
17.09.2018
13:19:45

Alexander
17.09.2018
13:20:24
Ага, это подразумевает то, что у инжектируемых объектов нет своего состояния. Если так, то все конечно замечательно

Mikhail
17.09.2018
13:20:27

Руслан
17.09.2018
13:21:27

Google

Alexander
17.09.2018
13:21:48
Ну оно же не меняется после инициализации?

Руслан
17.09.2018
13:22:09
Это происходит на этапе инициализации объекта контейнером.
До того как он отдаст тебе управление.
Ты ессно можешь это заабьюзить, как и просто говнокода написать без DI

Quantum Harmonizer
17.09.2018
13:23:14
наличие @PostConstruct — уже невероятный говнокод

Руслан
17.09.2018
13:23:17
Но с DI у тебя говнокод аккуратно в кучках лежит, и его разгребать проще

Andrey
17.09.2018
13:24:29
Подожди, а что тут плохого? И что невозможно дебажить?
Насчёт того, что тут плохого:
1. Если про DI вообще, то он часто приводит к сильному смешению чистых вычислений и работы с состоянием, что приводит к невозможности проследить поток данных и управления.
2. Если про DI на процессинге аннотаций в рантайме, то дополнительно усложняется отслеживание того, кем, когда и как эти аннотации процессятся.
3. Если Spring like DI, то добавляются грабли с AutoWired и всякими неявными умолчаниями (подробно не помню, Spring боль была последний раз 3 года назад)

Anatolii
17.09.2018
13:27:39
говнокод с применением DI сложнее разгребать, чем без него


Руслан
17.09.2018
13:30:10
Насчёт того, что тут плохого:
1. Если про DI вообще, то он часто приводит к сильному смешению чистых вычислений и работы с состоянием, что приводит к невозможности проследить поток данных и управления.
2. Если про DI на процессинге аннотаций в рантайме, то дополнительно усложняется отслеживание того, кем, когда и как эти аннотации процессятся.
3. Если Spring like DI, то добавляются грабли с AutoWired и всякими неявными умолчаниями (подробно не помню, Spring боль была последний раз 3 года назад)
1. Не понял как ваше фп влияет на невозможность понять поток выполнения. У тебя есть класс, у него есть зависимости. Вызываем метод класса, в методе дергаем зависимости - все просто и понятно. Можно пример?
2. Да, есть определенная "магия", это же на старте приложения кто-то читает аннотации, складывает в мапку и потом из мапки достатает. Очень сложно, пожалуй сам буду делать свою мапку или просто филды в классе.
3. Ну если spring-context - то там вообще умолчаний нет, там все надо самому настроить. А вот spring-boot действительно нужно понимать как работает, но там внутри все достаточно очевидно, сорцы легко читаются.
На практике со всем этим успешно работают *большие* команды разработчиков, и проблем в DI нету.


Anatolii
17.09.2018
13:30:51
вывод - не писать говнокод ?

Руслан
17.09.2018
13:31:54
Если у вас есть DI - наверняка у вас есть какие-то интерфейсы, границы методов. Какая-никакая инкапсуляция. DI во многом заставляет заниматься разделением кода, а не писать огромные методы потому что так проще.
Я говорю как разработчик на большом бекендов проекте с кучей модулей. Где сидит 10+ человек на монолите.
Если у вас микросервис на 100 строк - то да, вам вероятно будет хорошо и без DI

Alexander
17.09.2018
13:33:02
Я есдли что вполне люблю DI как концепцию. У меня в проете работат свой собственный. Но там контекст передается явно везде, где это нужно.
Но guice "вымораживает"

Andrey
17.09.2018
13:34:10

Руслан
17.09.2018
13:34:51
Но guice "вымораживает"
У guice ужасный репортинг ошибок. Понять почему $Proxy45 can't be cast to Provider невозможно. Нужно смотреть на код и думать. У Spring-Context в этом плане все намного лучше, всегда понятно что и где случилось не так.

Quantum Harmonizer
17.09.2018
13:35:35

Google

Руслан
17.09.2018
13:36:04

Mikhail
17.09.2018
13:36:16

Микола
17.09.2018
13:37:18

Quantum Harmonizer
17.09.2018
13:37:20

Mikhail
17.09.2018
13:37:58

Anatolii
17.09.2018
13:38:36
кстати редакс то достаточно удобно, тот-же групоновкий Grox

Andrey
17.09.2018
13:38:37

Руслан
17.09.2018
13:39:12

Микола
17.09.2018
13:39:20

Admin
ERROR: S client not available

Andrey
17.09.2018
13:41:42
Буду очень рад если мне покажут альтернативы для Kotlin мира)
Ну про альтернативы, которыми можно пользоваться в мире ФП, написано здесь: http://blog.ploeh.dk/2017/01/27/from-dependency-injection-to-dependency-rejection/
В Kotlin я не вижу принципиальных проблем с тем, чтобы структурировать код аналогичным образом.

Artem
17.09.2018
13:43:55

Quantum Harmonizer
17.09.2018
13:43:58

Bogdan
17.09.2018
13:44:16

Andrey
17.09.2018
13:44:50
404
Сорян, два раза ссылка вставилась.
http://blog.ploeh.dk/2017/01/27/from-dependency-injection-to-dependency-rejection/

Руслан
17.09.2018
13:46:11
Вот много противников DI, покажите как нужно писать приложения без DI, by example.

Quantum Harmonizer
17.09.2018
13:48:38

Руслан
17.09.2018
13:49:22
а вот это и есть DI
Это IoC, под DI обычно подразумевают какой-то контейнер который сам делает dependency injection
Вот тут DI https://github.com/Heapy/tgto/compare/koin

Google

Quantum Harmonizer
17.09.2018
13:49:56

Bogdan
17.09.2018
13:52:05

Anatolii
17.09.2018
13:54:54
писать можно, например, в случае ведра, подсовывать зависимости/фабрики в зависимостей в контекст. Главное при этом найти время на написание непосредственно приложения

Igor
17.09.2018
13:54:55

Руслан
17.09.2018
13:57:09
Я не противник и не стороник, но магия бесит
Это компромис. Сначала писали много шаблонного кода, людей начал бесить шаблонный код. Потом начали заменять шаблонный код на магию. А правда она посередине. Магии и без DI куча, а DI магия в том же spring-context это прочитать аннотации и прогнать внутренний pipeline по созданию контекста, достаточно понятная на самом деле.


Bogdan
17.09.2018
14:04:48
Это компромис. Сначала писали много шаблонного кода, людей начал бесить шаблонный код. Потом начали заменять шаблонный код на магию. А правда она посередине. Магии и без DI куча, а DI магия в том же spring-context это прочитать аннотации и прогнать внутренний pipeline по созданию контекста, достаточно понятная на самом деле.
Окей, без магии никак, согласен. Но нужно знать меру. Вот в спринге шаг влево или право, начинаются проблемы, но было бы норм, если бы ПО и сервисы не развивались, но иногда приходится добавить фичу, которую спрингом просто так не покроеш. И если бы спринг был бы хорош, Борисов бы не делал спринг потрошитель и не устраивал курсы

Igor
17.09.2018
14:05:14

Bogdan
17.09.2018
14:06:02


Руслан
17.09.2018
14:10:06
Окей, без магии никак, согласен. Но нужно знать меру. Вот в спринге шаг влево или право, начинаются проблемы, но было бы норм, если бы ПО и сервисы не развивались, но иногда приходится добавить фичу, которую спрингом просто так не покроеш. И если бы спринг был бы хорош, Борисов бы не делал спринг потрошитель и не устраивал курсы
Борисов все-таки там рассказывает не только про болячки в спринге, но и про то как его расширять. А курсы делаются не потому что спринг плох, а потому что разработчик нынче слишком нежный пошел, не может отличную документацию осилить) https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/

Bogdan
17.09.2018
14:13:55

Руслан
17.09.2018
14:16:40

Quantum Harmonizer
17.09.2018
14:18:40
Так наоборот, чтобы спринг правильно сконфигурировать и вдуплить все его невнятные сообщения об ошибках нужна опытная команда.

Руслан
17.09.2018
14:20:47
Вот смотри. Я беру spring-boot, , подключаю пару зависимостей, пишу @controller, @service, @repository и бам. У меня production grade приложение с логированние, метриками, rest, базой, транзакциями, миграциями и прочим.

Quantum Harmonizer
17.09.2018
14:24:37
И непонятно, что откуда берётся, почему, как и куда пробрасывается CSRF, кем обрабазываются заголовки авторизации и т. п.
ирония в том, что без магии можно добиться того же уровня компактности кода

Alexander
17.09.2018
14:26:18
Нарушая стройность разговора, только что убедился, что если все делать "правильно", то класс делегаты оказываются не нужны... До этого был уверен, что в данном конкретном месте без них не обойтись

Руслан
17.09.2018
14:26:52

Quantum Harmonizer
17.09.2018
14:27:13