Javanese Online
Open in Telegram
Статьи и новости, наблюдения и советы. Кодревью: http://javanese.online/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0/ Обсуждение в @javanese_questions Материалы пишет @Harmonizr
Show more723
Subscribers
No data24 hours
+37 days
+530 days
Posts Archive
Ревью библиотеки FitBitAuth для Android. Будет полезно всем, кто начинает писать библиотеки.
Полная версия моего доклада про антипаттерны. Таймкод для тех, кто видел предыдущие версии, есть в описании.
Итак, что же это было.
Понять можно, если посмотреть на строчку
""&'<>": это код для замены «опасных» для XML символов на соответствующие сущности (entities).Кстати, о компактном размещении данных в памяти. Есть идеи, что делает этот чудесный код, который я нарочно скомпилировал и декомпилировал?
Массив пар или пара массивов?
В ситуации, когда нужно хранить множество пар, кортежей, точек и т. п., есть несколько решений.
В интернете встречал информацию о том, что в JVM наивный вариант (1) медленнее, чем «вывернутый наизнанку» вариант (2). Это правда: во втором варианте данные лежат плотнее, больше шансов попадания в кэши процессора.
Но я бы предложил вариант (3). Именно так массив структур лежал бы в С или Rust. Тут и память сэкономлена, и прыжков по указателям меньше.
Head First Kotlin
Бегло просмотрел эту книжку. Есть, конечно, откровенные ляпы вроде «Char variables are used for single characters»; «In Kotlin, numbers are objects, and the variable holds a reference to the object, not the object itself» или
arrayOf(1, 2, 3), но в целом вполне хорошо. Отличная аналогия между переменными и стаканами, размерностью и размером стакана. Хорошо разъясняется тема передачи аргументов в функции, раскрыто много базовых тем.
«Питер», 2020, перевел с английского Е. Матвеев
Перевод с трудом дотягивает по качеству до машинного.
«Напоследок мы расскажем, почему объекты играют
такую важную роль в программировании Kotlin».
«Вы узнаете, как писать компактные функции единичных выражений».
Все слова переведены (лексика потерялась, дата-классы стали классами данных), а структура предложений осталась (т. н. «калька»).Итераторы
В джавовых коллекциях «сколько-нибудь элементов типа T» выражается типом
Iterable<T>. Но сейчас есть java.util.stream.Stream и kotlin.Sequence, которые не наследуют Iterable. Причём не потому что авторы врединки, а потому что итераблы многоразовые, а стримы с сиквенсами одноразовые и их не стоит смешивать. Также стримы и сиквенсы не являются подтипами друг друга, потому что существуют параллельно — в Java 1.8+ и в Kotlin, который совместим с 1.6.
Единственное, что их объединяет, — это старые добрые итераторы.
Если какому-нибудь методу нужно единожды вычитать «сколько-нибудь элементов типа T», можно принимать непосредственно Iterator<T>. Это сделает код совместимым и с итераблами, и с коллекциями, и со стримами, и с сиквенсами. Более того, ничто не мешает прямо на месте создать new Iterator<T>() { … } / iterator { yield } и нагенерировать данных на лету.Транскрипт доклада Егора Бугаенко о том, как нужно собеседовать, а как — нет. Очень перекликается с тем, что я обычно говорю о задачах на алгоритмы и подготовке к собесам.
Кстати, мы на @spbpeerlab проводим тренировочные собеседования для всех желающих.
«Какую книгу почитать новичку для вкатывания с нуля?» Пока не знаю. Зато точно знаю, какую читать не стоит.
«Я считаю, что бывают программы, которые написаны»
Мне тоже очень хочется верить Тагиру, что бывают :)
https://youtu.be/FTQUXQsSQ_Y?t=1451
Обратная совместимость уместна не только в программных интерфейсах, но и в пользовательских.
Старая последовательность действий должна вести к одинаковому результату и в старых, и в новых версиях. Любое убирание функциональности должно происходить ступенчато, с предупреждением и пояснениями.
Процессы и потоки
Наконец порезал видео с весенней Android Academy. Основы многопоточки в Java и Android.
youtu.be/TWlhCraPd3Q
На DevFest буду с более полной версией. https://devfest.space/schedule/2019-11-23?sessionId=kotlin_antipattern
Листы против массивов
Везде рекомендуют использовать в публичных API коллекции, а не массивы. И я с этим согласен.
Но мне всегда очень хотелось минимизировать количество обёрток, объектов в памяти, переходов по указателям и т. п..
Kotlin-MPP Collection utils — горстка inline-классов как раз для этих целей.
