@kotlin_lang

Страница 78 из 982
Roman
21.03.2017
07:48:48
Igor
21.03.2017
07:49:33
А если custom getter?
Тогда другое дело ?

Roman
21.03.2017
07:49:59
можно
что можно сделать? =)

Google
Igor
21.03.2017
07:50:05
У нас и для val кустом геттер может вернуть null

Roman
21.03.2017
07:50:08
Тогда другое дело ?
как это будет выглядеть?

Михаил
21.03.2017
07:50:16
что можно сделать? =)
return locationInteractor.onAppStop().takeIf{userStateInteractor.isUserLoggedIn && locationInteractor != null} ?: Completable.complete()

:)

Igor
21.03.2017
07:50:25
как это будет выглядеть?
Тогда и запрещать

Михаил
21.03.2017
07:50:30
не уверен что именно так скомпилируется

но примерно

Igor
21.03.2017
07:50:38
return locationInteractor.onAppStop().takeIf{userStateInteractor.isUserLoggedIn && locationInteractor != null} ?: Completable.complete()
Куда понятнее стало ? (perl стайл (зато в одну строчку))

Roman
21.03.2017
07:50:58
но примерно
спасибо за идею, хотя не могу сказать что прямо стало хорошо =) короче - да

Igor
21.03.2017
07:51:47
да, согласен, что спорно
Кстати null можно заменить Default заглушками

Михаил
21.03.2017
07:51:48
return locationInteractor?.onAppStop().takeIf{userStateInteractor.isUserLoggedIn} ?: Completable.complete()

даже так

Google
Roman
21.03.2017
07:51:59
зачем вся эта возня с нулабилити и все эти запреты понятно. не понятно как с этим всем делать красивый код

Alexey
21.03.2017
07:53:21
с котлином сложно) Надо больее многословными языками пользоваться для красивого кода

Roman
21.03.2017
07:54:02
даже так
ага, понял

Igor
21.03.2017
07:55:23
в каком месте? в вызове?
Ну типа: private var locationInteractor: LocationInteractor = LocationInteractor.EMPTY (тип можно опустить)

Igor
21.03.2017
07:57:09
Roman
21.03.2017
07:57:59
DO IT ?
надеюсь это шутка? или вы так реально делаете чтобы нулабилити побороть?

=)

Igor
21.03.2017
07:58:17
а если у меня нет Empty?
А вообще это вопрос, почему у тебя зависимость на какой-то сервис разрешается не в конструкторе и может меняться.

Dmitry
21.03.2017
07:59:23
uncle Bob тоже по этому сокрушается https://habrahabr.ru/post/324122/
Сколько кода мне придется изменить, когда я наконец узнаю, что кто-то действительно должен вернуть null в древе вызовов? Все эти ограничения, налагаемые этими языками, предполагают, что программист обладает совершенным знанием системы, до того как начать писать её. Тут не понял его аргумент, т.е. если у меня в языке нету такой проверки на уровне компиляции, (Java) и я вдруг решил где-то кинуть null, то переделывать код не нужно, все само разрулится что ли? ? В статье он говорит про тесты, они покажут что код упал - ок. Но от этого разве как-нибудь измениться объем работ по адаптации кода? Т.е. и так и так тебе нужно или совершенное знание системы до разработки или же адаптация к изменениям.

Quantum Harmonizer
21.03.2017
08:00:30
надеюсь это шутка? или вы так реально делаете чтобы нулабилити побороть?
В некоторых случаях это лучше, чем null. Например, emptyList().

Roman
21.03.2017
08:00:34
А вообще это вопрос, почему у тебя зависимость на какой-то сервис разрешается не в конструкторе и может меняться.
резонный вопрос. код в этом плане плохой. но прежде чем его переписать решил выяснить как справиться с тем что есть

Roman
21.03.2017
08:01:56
мб оно там не так уж плохо реализовано как боб пишет, не знаю

его аргументы очень уж однобоки (это по котлину видно)

Igor
21.03.2017
08:03:47
да, они в последних версиях добавили этот ад
Наверное там все скоро перейдут на Either (аля скала/и др функ языки)

Google
Quantum Harmonizer
21.03.2017
08:08:37
Наверное там все скоро перейдут на Either (аля скала/и др функ языки)
Выглядит говновато, как обработка ошибок в Си: я вам верну результат или errno/errstr. Я использовал either в ситауции, когда в одном месте могут оказаться объекты двух разных типов. Например, ВКонтакте есть сообщения сообществ, следовательно, автор сообщения — пользователь или группа: Either<User, Group>.

Roman
21.03.2017
08:10:00
А вообще это вопрос, почему у тебя зависимость на какой-то сервис разрешается не в конструкторе и может меняться.
посмотрел почему так было сделано. есть кейс когда объект locationInteractor не успел инициализироваться (не было ситуации когда это нужно) а уже нужно завершить работу класса. при завершении нужно вызвать метод у locationInteractor, но только в том случае, если он был прежде инициализирован.

Roman
21.03.2017
08:11:15
?.
блин, точно же. до сих пор не могу перестроиться и не вижу таких простых вариантов =))

Igor
21.03.2017
08:11:46
У меня User и Group — интерфейсы.
Ну OK (хотя в том же Haskell он в основном для ошибок используется монада Either по разному работает в Left и Right)

Quantum Harmonizer
21.03.2017
08:12:32
Для этого же есть sealed
Ну и такой подход sealed class MessageAuthor { class User : MessageAuthor() class Group : MessageAuthor() } свяжет группу и пользователя по признаку авторства сообщения, что мне кажется довольно ужасным (сильное связывание).

а какой способ возврата ошибок ты считаешь более красивым?
На самом деле, мне не хватает checked exceptions. Когда я лезу в интернет, нужно *обязательно* делать это в try-catch. В ситуации, когда знаешь, что checked exception вылететь не может, меня бы устроил компактный синтаксис для } catch (e: IOException) { throw AssertionError(e) } И, конечно, в Java переборщили с Checked exceptions: CloneNotSupportedException, UnsupportedEncodingException должны быть Runtime.

Я бы не хотел, делая несколько последовательных запросов в интернет, проверять возвращаемое значение каждого (either).

Alexey
21.03.2017
08:18:54
rx не решает эту проблему?

Quantum Harmonizer
21.03.2017
08:19:08
Roman
21.03.2017
08:19:14
мне кажется проблема проверяемых исключений в том, что когда пишешь код тебя заставляют обработать исключение, но ты еще не знаешь и не понимаешь что это за исключение и что с ним делать

и вот в этом случае возникает боль

Alexey
21.03.2017
08:19:48
Каким образом?
легче связать последовательные запросы

Roman
21.03.2017
08:20:17
то есть проблема не с самим механизмом, а с тем как его использует фреймворк.

rx ведь кстати исключения использует как способ передачи ошибок

Quantum Harmonizer
21.03.2017
08:20:57
легче связать последовательные запросы
Легче связать последовательные запросы, написав их в одном блоке кода, синхронно. И все исключения свалятся в один блок catch.

Google
Roman
21.03.2017
08:22:39
inline fun pokemon(code: () -> R throws Throwable): R { try { return code() } catch (t: Throwable) { throw AssertionError(t) } }
и что делает этот код? он ведь никак не обрабатывает ошибку?

Quantum Harmonizer
21.03.2017
08:22:43
то есть проблема не с самим механизмом, а с тем как его использует фреймворк.
Ну да, checked exceptions — это одна из тех штук, к которой надо подходить с большой осторожностью при проектировании API.

Roman
21.03.2017
08:22:59
какой здесь толк от checked exceptions?

Quantum Harmonizer
21.03.2017
08:23:45
и что делает этот код? он ведь никак не обрабатывает ошибку?
Если бы в Kotlin были checked exceptions, этот метод помогал бы превратить их в unchecked там, где это нужно.

Roman
21.03.2017
08:24:12
на мой взгляд было бы удобно если бы язык позволял просто описать исключения которые МОЖЕТ кидать метод но не обязывал вызывающую сторону эти исключения обрабатывать

Sergey
21.03.2017
08:24:20
как кстати всякие jackson/gson работают с either и sealed?

Roman
21.03.2017
08:24:36
а в котлине есть either?

Sergey
21.03.2017
08:24:48
нет, но он пишется в 10 строчек

Sergey
21.03.2017
08:25:15
можно Pair заюзать)

Admin
ERROR: S client not available

Quantum Harmonizer
21.03.2017
08:26:18
как кстати всякие jackson/gson работают с either и sealed?
Ну, должна быть договорённость между структурой и десериализатором. sealed как таковой не представляет проблем, пока не понадобидся полиморфный парсинг.

Roman
21.03.2017
08:31:53
я вот кстати подумал, что для nullable не хватает тогого варианта когда изначально свойство может быть null, но перейти из не null в null уже не может. тогда проверки типа if (value != null) не будут требовать дополнительного кода

у меня в коде достаточно много именно таких кейсов

Alexey
21.03.2017
08:33:24
Roman
21.03.2017
08:36:06
^^ эти двое в целом ведут себя идентично, только lateinit хранит реальный null, а notNull — делегат.
оба эти варианта же не позволяют работать со свойством пока оно null? они требуют инициализации на момент использования. а я говорю про случай когда свойство nullable, но такой одноразовый nullable

Google
Quantum Harmonizer
21.03.2017
08:36:45
Roman
21.03.2017
08:37:21
Они расценивают свойство как не-нуллабельное, считая, что об инициализации ты позаботишься самостоятельно.
в моем случае инициализация не всегда происходит. это один из нормальных кейсов

то есть это nullable которому null можно присвоить только при изначальной инициализации

Vladimir
21.03.2017
08:38:47
Всем привет, осваиваю котлин на андроиде, сейчас пишу адаптер для recyclerView, кто то может объяснить пожалуйста простыми словами какая разница между строками и какую правильно выбрать ? 1)holder?.item?.text = items[position] 2)holder!!.item.text = items[position] Как я понимаю во втором варианте если holder null, то всё просто падает

Roman
21.03.2017
08:39:42
да, правильно. в первом варианте код может молча не отработать

Ему никак нельзя присвоить null :)
я про свой несуществующий в языке вариант говорю, которого мне не хватает

зачем кстати нужен Delegates.NotNull если есть lateinit?

Igor
21.03.2017
08:41:40
Тут еще вопрос с чего это он recyclerView вообще null?

Roman
21.03.2017
08:42:17
Можно написать свой делегат, который будет работать, как в Java.
а как это сделать? если тип свойства не будет nullable то как проверить на null? а если будет, то как делегат поможет решить проблему нерабочего смарткаста при проверке?

Vladimir
21.03.2017
08:42:17
Может, можно сделать holder не-нуллабельным?
Да, так действительно проще)

Quantum Harmonizer
21.03.2017
08:44:07
а как это сделать? если тип свойства не будет nullable то как проверить на null? а если будет, то как делегат поможет решить проблему нерабочего смарткаста при проверке?
Можно хранить сам делегат в отдельном поле, например: private val _something = SomeDelegate() val something by _something но это, конечно, костыль.

Хм. Есть класс, у него должен быть no-arg constructor, которым будет пользоваться фреймворк. Есть пара статических фабрик, которые используют этот конструктор. Как бы мне так ограничить доступ к конструктору, чтобы из нормального кода использовались только фабрики?

Quantum Harmonizer
21.03.2017
08:56:58
Android. Кажется, не скушает.

Igor
21.03.2017
08:57:16
Quantum Harmonizer
21.03.2017
08:58:26
@Deprecated(level = DeprecationLevel.ERROR, message = "for reflective use by Android") constructor() : super() private constructor(args: Bundle) : super() { arguments = args }

Quantum Harmonizer
21.03.2017
09:02:53
Roman
21.03.2017
09:03:21
аа, вон ты какой хитрый, хочешь сразу внутри аргументы внутри конструктора установить.

=)

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