@kotlin_lang

Страница 871 из 982
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
В котлине это нельзя сделать. И не надо пытаться, слишком много всего нужно выкинуть для того, чтобы было можно

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
Ну отвечая на вопрос о смысле "упарываться": смысл в том, чтобы программировать в математически корректных, выверенных абстракциях, с хорошо определённым поведением.
Применимо ли это, к динамикодриснявым? Типа https://dry-rb.org/gems/dry-monads/ ? Как по мне, использование задает какой-то каркас, архитектуру приложения. Но все равно, больше похоже на карго культ.

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
Ну незнаааю. Функциональные конструкции проще тестировать, но значительно сложнее отлаживать. Тут вполне возможно, что шило на мыло
Ну вот ради простоты тестирования это всё и делается. Сложно отлаживать мы в JVM мире, с его DI, процессингом аннотаций в рантайме и прочим, уже получили и так ?

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
Ну, DI - вообще зло. Я пришел к выводу, что это тоже дань моде, причем часто чрезмерная. Не могу сказать, что он не нужен, но я посмотрел как его пихают во все дыры. После этого вообще отладить невозможно
DI в текущем виде - это как раз про то, как намертво склеить чистые вычисления с сайд эффектами в один монолитный комок Если что, в Хаскеле тоже вполне есть DI, я тут пробовал замокать IO монаду для тестирования main - вполне себе мокается для тестов, при этом в проде остаётся вполне себе IO

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

Просто чтобы не думать

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
Невозможно глядя на код понять какой объект откуда приходит и в каком состоянии
У тех кто нормально использует DI есть только одно состояние объекта - он создан со всеми зависимостями и проинициализирован (если в di есть @PostConstruct например). А чтобы понять как вызван конструктор тебе в любом случае нужно пойти посмотреть объявление. В DI оно часто декларативное, а не полотна объектов

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

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

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 года назад)

Но с DI у тебя говнокод аккуратно в кучках лежит, и его разгребать проще
Если говно разложить по кучкам, у тебя вместо одной большой кучи будет несколько маленьких, но вонять будет так же, если не сильнее.

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 нету.

говнокод с применением DI сложнее разгребать, чем без него
говнокод без применения 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
Я говорю как разработчик на большом бекендов проекте с кучей модулей. Где сидит 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
Аргументы, подкреплённые статусом говорящего сильно прибавляют в цене ?
Собственно, да. Если, проведя параллель, спросить у hype-driven-андроидщика, как он чувствует себя с Rx+Dagger+Moxy+AAC, он тоже ответит, что всем доволен.

Google
Руслан
17.09.2018
13:36:04
Аргументы, подкреплённые статусом говорящего сильно прибавляют в цене ?
Я просто подумал что у нас взгляд на DI с разных сторон и решил объяснить о каком применении DI я говорю. Возможно в каких-то других областях или юзкейзах это не так.

Quantum Harmonizer
17.09.2018
13:37:20
Moxy+AAC это надо постараться
ну можно разные экраны на разном делать)0)

Mikhail
17.09.2018
13:37:58
ну можно разные экраны на разном делать)0)
тогда где-то там вглубине еще должен быть редукс

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

Andrey
17.09.2018
13:38:37
Я просто подумал что у нас взгляд на DI с разных сторон и решил объяснить о каком применении DI я говорю. Возможно в каких-то других областях или юзкейзах это не так.
DI как концепция полезен, хотя есть и альтернативы, не требующие писать больше. Хороших реализаций концепции я пока не встречал, к сожалению. Везде чёрная магия, которую приходится постигать через боль.

Микола
17.09.2018
13:39:20
ну можно разные экраны на разном делать)0)
но ведь лучше все на одном екране

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

Quantum Harmonizer
17.09.2018
13:43:58
но ведь лучше все на одном екране
Именно на «екране», да. Сильно.

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
Ну про альтернативы, которыми можно пользоваться в мире ФП, написано здесь: http://blog.ploeh.dk/2017/01/27/from-dependency-injection-to-dependency-rejection/ В Kotlin я не вижу принципиальных проблем с тем, чтобы структурировать код аналогичным образом.
Нет, это плохой ответ. Хороший ответ был бы пример приложения с таким подходом. Вот пример IoC без DI, и он неплох для маленьких проектов, но для больших, на мой взгляд, поддерживать это будет очень сложно: https://github.com/Heapy/tgto/blob/master/src/main/kotlin/app/hea/tgto/Application.kt#L37-L81

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

Руслан
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
Вот тут DI https://github.com/Heapy/tgto/compare/koin
Видел физ-баз в интрпрайз стиле? ?

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

Видел физ-баз в интрпрайз стиле? ?
Конечно. Можете мой говнокод в репе tgto переписать на правильный стиль. Для примера переписать на koin у меня заняло минут 10-15.

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

Igor
17.09.2018
14:05:14
Конечно. Можете мой говнокод в репе tgto переписать на правильный стиль. Для примера переписать на koin у меня заняло минут 10-15.
Да зачем. Вижу, что достаточно идиоматично получилось и если обложиться моками/стабами, то и тестируемо даже.

Руслан
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
Борисов все-таки там рассказывает не только про болячки в спринге, но и про то как его расширять. А курсы делаются не потому что спринг плох, а потому что разработчик нынче слишком нежный пошел, не может отличную документацию осилить) https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/
Вот и я о том, часто виделись вопросы "у меня проблема, какую анноташку нужно повесить". Мой посыл что не нужно зацикливаться и посматривать на альтернативы. П.С. сам рекомендовал спринг бут

Руслан
17.09.2018
14:16:40
Вот и я о том, часто виделись вопросы "у меня проблема, какую анноташку нужно повесить". Мой посыл что не нужно зацикливаться и посматривать на альтернативы. П.С. сам рекомендовал спринг бут
А я сейчас наоборот spring-boot не пользуюсь, т.к. считаю его раздутым, в основном мне не нравится время старта конечно же. В остальном - все из коробки: конфигурация, actuator, куча стартеров на все случаи жизни. Если бы стартовали проект с большой командой - то это оптимальный выбор. Если команда меньше и условно говоря все опытные разработчики - то можно и решения уровня ktor брать. И DI как раз таки один из плюсов для большой, разноуровневой команды.

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

Руслан
17.09.2018
14:20:47
Так наоборот, чтобы спринг правильно сконфигурировать и вдуплить все его невнятные сообщения об ошибках нужна опытная команда.
Для этого нужен один человек который уже работал со спрингом. Другие должны просто не путать аннотации Controller и Repository чтобы писать рабочий код под готовую инфрастуктуру всего от spring. Если у вас будет проект на чем-то легковесном, то все сведется к тому что теже люди будут писать то что уже есть в спринге.

Вот смотри. Я беру 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
ирония в том, что без магии можно добиться того же уровня компактности кода
Все верно. Вопрос в том какие нужны для этого компетенции и сколько это будет стоить. Что будет дешевле - разобраться в готовом оттестированном решении, или писать свое с нуля. Особенно если это старт проекта и у тебя 10 разработчиков от джуна до сеньера.

Страница 871 из 982