Опубликовано

Переходите с Java на Kotlin!

От Java к Kotlin

Расстояние от острова Ява до острова Котлин составляет 9892 километра по прямой. Чтобы преодолеть его, не пользуясь воздушным транспортом, понадобится как минимум неделя. Если вы — опытный Java-разработчик, который решил перейти на Kotlin, вам потребуется примерно столько же времени. Вы обнаружите, что в Kotlin все делается по-другому, он требует иных подходов к программированию. Этот язык более функционален, у него больше возможностей, поэтому перенос кода ваших проектов с Java на Kotlin — отличная идея.

Ваши гиды Дункан и Нэт уже проделали этот путь в 2015 году, и с тех пор помогли многим командам и отдельным разработчикам повторить его. Путешествуйте вместе с ними по проверенному маршруту, включающему такие промежуточные остановки, как переход от объектов JavaBeans к значениям, от коллекций Java к коллекциям Kotlin и от классов Java к классам Kotlin.

Авторы подробно объясняют ключевые концепции, а затем показывают, как постепенно и безопасно перенести код Java в идиоматичный Kotlin, сохраняя при этом совместимость. В результате код становится проще, выразительнее и удобнее для редактирования. К концу путешествия вы будете уверены в том, что сможете перевести все свои Java-проекты на платформу Kotlin, освоите Kotlin с нуля и научитесь управлять смешанной языковой базой кода по мере ее развития.

Книга описывает практические приемы рефакторинга и переноса кода написанных на Java мобильных приложений для Android  на язык Kotlin с сохранением совместимости. Приведено подробное сравнение этих двух языков, даны примеры перевода проектов с Java на Kotlin, добавления поддержки Kotlin в сборку Java. Показан переход от классов Java к классам Kotlin, от коллекций Java к коллекциям Kotlin, от объектов JavaBeans к значениям, от статических методов к функциям верхнего уровня. Подробно рассматривается обработка ошибок, приведены практические приемы управления проектами со смешанной кодовой базой. Даны советы по рефакторингу кода и функциональному программированию на Kotlin.

Взять знакомый всем старый добрый код Java и наблюдать за тем, как он постепенно превращается в лаконичный, четкий, выразительный и легкий в обслуживании код на языке Kotlin — замечательный способ выучить язык. Воспользуйтесь опытом, которым делятся Макгрегор и Прайс.
Венкат Субраманиам, Ph.D., писатель и основатель компании Agile Developer, Inc.

Самый быстрый способ перенести свои навыки и умения из Java в Kotlin. Обязательно к прочтению любому профессиональному разработчику на Java.
Дон и Дэвид Гриффитс, авторы книг «React. Сборник рецептов» и «Head First. Kotlin»

Книгу “От Java к Kotlin” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 11

Как устроена эта книга?……………………………………………………………………………………………………………. 12

Как были выбраны темы?…………………………………………………………………………………………………………. 12

Уровень сложности……………………………………………………………………………………………………………………. 13

Идеальный код…………………………………………………………………………………………………………………………… 14

Форматирование кода……………………………………………………………………………………………………………….. 14

Условные обозначения……………………………………………………………………………………………………………… 15

Использование примеров кода…………………………………………………………………………………………………. 16

Платформа онлайн-обучения O’Reilly……………………………………………………………………………………… 17

Как с нами связаться?………………………………………………………………………………………………………………… 17

Благодарности…………………………………………………………………………………………………………………………… 18

Благодарности Дункана………………………………………………………………………………………………… 18

Благодарности Нэта………………………………………………………………………………………………………. 19

Глава 1. Введение…………………………………………………………………………………… 21

Сущность языка программирования………………………………………………………………………………………… 21

История стилей программирования на Java (на наш взгляд)………………………………………………… 24

Первобытный стиль………………………………………………………………………………………………………… 24

Стиль JavaBeans…………………………………………………………………………………………………………….. 25

Корпоративный стиль……………………………………………………………………………………………………. 26

Инверсия абстракции………………………………………………………………………………………………. 27

Современный стиль………………………………………………………………………………………………………… 29

Будущее…………………………………………………………………………………………………………………………… 29

Сущность Kotlin…………………………………………………………………………………………………………………………. 29

Рефракторинг на Kotlin……………………………………………………………………………………………………………… 31

Принципы рефакторинга……………………………………………………………………………………………….. 32

Подразумеваем хорошее покрытие тестами………………………………………………………………… 33

Фиксации изменений рассчитаны на Git Bisect……………………………………………………………. 33

Над чем мы работаем?………………………………………………………………………………………………………………. 34

Приступим!…………………………………………………………………………………………………………………………………. 34

Глава 2. Перевод проектов с Java на Kotlin……………………………………………. 35

Стратегия……………………………………………………………………………………………………………………………………. 35

Добавление поддержки Kotlin в сборку Java…………………………………………………………………………… 37

Другие системы сборки……………………………………………………………………………………………. 40

Двигаемся дальше……………………………………………………………………………………………………………………… 40

Глава 3. От классов Java к классам Kotlin……………………………………………… 41

Исходный код…………………………………………………………………………………………………………… 41

Простой тип значений……………………………………………………………………………………………………………….. 41

Ограничения классов данных…………………………………………………………………………………………………… 48

Двигаемся дальше……………………………………………………………………………………………………………………… 52

Глава 4. От необязательных типов к обнуляемым…………………………………. 54

Как представить отсутствие чего-либо?………………………………………………………………………………….. 54

Рефракторинг от необязательных типов к обнуляемым…………………………………………………………. 56

Итерация и цикл for……………………………………………………………………………………………………. 58

Рефракторинг с помощью Expand-and-Contract……………………………………………………… 64

Рефракторинг в код, характерный для Kotlin………………………………………………………………………….. 64

Двигаемся дальше……………………………………………………………………………………………………………………… 71

Глава 5. От объектов JavaBeans к значениям…………………………………………. 72

JavaBeans……………………………………………………………………………………………………………………………………. 72

Значения……………………………………………………………………………………………………………………………………… 73

Почему следует выбирать значения?………………………………………………………………………………………. 74

Рефакторинг экземпляров JavaBeans в значения……………………………………………………………………. 74

Равенство объектов…………………………………………………………………………………………………. 81

Двигаемся дальше……………………………………………………………………………………………………………………… 82

Глава 6. От коллекций Java к коллекциям Kotlin………………………………….. 83

Коллекции Java………………………………………………………………………………………………………………………….. 83

Не изменяйте разделяемые коллекции……………………………………………………………………. 86

Коллекции Kotlin………………………………………………………………………………………………………………………… 86

Рефакторинг от коллекций Java к коллекциям Kotlin……………………………………………………………… 89

Подправим код на Java………………………………………………………………………………………………….. 90

Преобразование в Kotlin………………………………………………………………………………………………… 95

Двигаемся дальше……………………………………………………………………………………………………………………… 99

Глава 7. От действий к вычислениям…………………………………………………… 100

Функции……………………………………………………………………………………………………………………………………. 100

Вычисления………………………………………………………………………………………………………………………………. 101

Вычисляемое свойство или функция?………………………………………………………………….. 102

Действия……………………………………………………………………………………………………………………………………. 102

Почему это должно нас волновать?………………………………………………………………………………………. 103

Процедурное программирование…………………………………………………………………………. 104

Почему предпочтение отдается вычислениям?…………………………………………………………………….. 104

Рефракторинг действий в вычисления……………………………………………………………………………………. 105

Существующий код………………………………………………………………………………………………………. 105

2015 был концом времени……………………………………………………………………………………… 109

Улучшенный проект…………………………………………………………………………………………………….. 109

Конец игры……………………………………………………………………………………………………………………. 115

Двигаемся дальше……………………………………………………………………………………………………………………. 118

Глава 8. От статических методов к функциям верхнего уровня……………. 119

Модификатор Static в Java……………………………………………………………………………………………………… 119

Статическое состояние………………………………………………………………………………………….. 119

Функции верхнего уровня в Kotlin, объекты и объекты-компаньоны………………………………….. 120

Рефракторинг от статических методов к функциям верхнего уровня…………………………………. 122

Удобные функции………………………………………………………………………………………………….. 123

Перемещение на верхний уровень………………………………………………………………………………………….. 126

Kotlin’изация……………………………………………………………………………………………………………………………… 127

Перемещение функций верхнего уровня………………………………………………………………. 129

Двигаемся дальше……………………………………………………………………………………………………………………. 129

Глава 9. От многострочных функций к однострочным………………………… 130

Попытка № 1: Замена встроенным выражением…………………………………………………………………… 132

Попытка № 2: Ввести функцию………………………………………………………………………………………………. 133

Попытка № 3: Блок Let…………………………………………………………………………………………………………….. 138

Попытка № 4: Отступление…………………………………………………………………………………………………….. 140

Что должен возвращать метод Parse?……………………………………………………………………….. 143

Двигаемся дальше……………………………………………………………………………………………………………………. 143

Глава 10. От функций к функциям-расширениям………………………………… 145

Функции и методы……………………………………………………………………………………………………………………. 145

Функции-расширения………………………………………………………………………………………………………………. 147

Расширения и типы функций…………………………………………………………………………………………………… 148

Свойства-расширения……………………………………………………………………………………………………………… 149

Преобразования……………………………………………………………………………………………………………………….. 149

Как именовать преобразования?…………………………………………………………………………… 150

Обнуляемые параметры………………………………………………………………………………………………………….. 151

Обнуляемые получатели…………………………………………………………………………………………………………. 152

Обобщенные расширения……………………………………………………………………………………………………….. 154

Функции-расширения в качестве методов…………………………………………………………………………….. 155

Рефракторинг к функциям-расширениям……………………………………………………………………………….. 155

Двигаемся дальше……………………………………………………………………………………………………………………. 171

Глава 11. От методов к свойствам………………………………………………………… 172

Поля, акцессоры и свойства……………………………………………………………………………………………………. 172

Как выбрать?……………………………………………………………………………………………………………………………. 176

Мутирующие свойства……………………………………………………………………………………………………………. 178

Рефракторинг к свойствам………………………………………………………………………………………………………. 178

Двигаемся дальше……………………………………………………………………………………………………………………. 184

Глава 12. От функций к операторам…………………………………………………….. 185

Базовый класс: Money……………………………………………………………………………………………………………… 185

Добавление определяемого пользователем оператора……………………………………………………….. 187

Вызов нашего оператора из существующего кода Kotlin……………………………………………………. 189

Операторы для существующих классов Java……………………………………………………………………….. 191

Соглашения для аннотаций значений……………………………………………………………………………………. 191

Двигаемся дальше……………………………………………………………………………………………………………………. 195

Глава 13. От потоков к итерируемым объектам и последовательностям. 196

Потоки в Java……………………………………………………………………………………………………………………………. 196

Итераторы в Kotlin…………………………………………………………………………………………………………………… 198

Последовательности в Kotlin………………………………………………………………………………………………….. 199

Замена итераций и последовательностей……………………………………………………………. 199

Множественные итерации………………………………………………………………………………………………………. 200

Выбор между потоками, итераторами и последовательностями……………………………………….. 203

Алгебраическая трансформация……………………………………………………………………………………………. 204

Рефракторинг от потоков к итераторам и последовательностям……………………………………….. 207

Сначала итераторы……………………………………………………………………………………………………… 210

Последовательности…………………………………………………………………………………………………….. 214

Извлечение части конвейера……………………………………………………………………………………….. 218

Итоговая уборка…………………………………………………………………………………………………………… 220

Двигаемся дальше……………………………………………………………………………………………………………………. 221

Глава 14. От накопления объектов к преобразованиям……………………….. 222

Вычисление с использованием параметров накопления……………………………………………………… 222

Рефакторинг функций над немутирующими данными…………………………………………………………. 227

Давайте проделаем это снова………………………………………………………………………………………………… 233

Обогащение обнаруженной нами абстракции……………………………………………………………………… 237

По поводу имен……………………………………………………………………………………………………… 238

Двигаемся дальше……………………………………………………………………………………………………………………. 239

Глава 15. От инкапсулированных коллекций к псевдонимам типов……. 241

Защитные копии…………………………………………………………………………………………………….. 242

Создание коллекций доменов…………………………………………………………………………………………………. 243

Коллекции с другими свойствами………………………………………………………………………………………….. 244

Рефракторинг инкапсулированных коллекций…………………………………………………………………….. 245

Преобразование операций в расширения………………………………………………………………….. 246

Замена псевдонима типа……………………………………………………………………………………………… 248

Рефракторинг коллекций с другими свойствами……………………………………………………….. 254

Двигаемся дальше……………………………………………………………………………………………………………………. 257

Глава 16. От интерфейсов к функциям…………………………………………………. 259

Объектно-ориентированная инкапсуляция…………………………………………………………………………… 260

Функциональная инкапсуляция……………………………………………………………………………………………… 263

Функциональные типы в Java…………………………………………………………………………………………………. 266

Сочетание и совмещение………………………………………………………………………………………………………… 269

Выразительные типы функций………………………………………………………………………………. 271

Сравнение подходов……………………………………………………………………………………………………………….. 272

Соединение………………………………………………………………………………………………………………………………. 275

Объектно-ориентированный или функциональный?……………………………………………………………. 276

Наследие Java………………………………………………………………………………………………………………………….. 279

Прослеживаемость…………………………………………………………………………………………………………………… 280

Рефракторинг от интерфейсов к функциям……………………………………………………………………………. 280

Введение функций………………………………………………………………………………………………………… 284

Двигаемся дальше……………………………………………………………………………………………………………………. 288

Глава 17. От мокинга к маппингу………………………………………………………… 289

Повреждение теста, вызванное моком…………………………………………………………………… 290

Замена мокинга маппингом…………………………………………………………………………………………………….. 292

Но действительно ли мы хотим уйти от моков?……………………………………………………………………. 297

Двигаемся дальше……………………………………………………………………………………………………………………. 301

Глава 18. От открытых классов к запечатанным…………………………………. 302

Полиморфизм или запечатанные классы?…………………………………………………………………………….. 306

Преобразование интерфейса в запечатанный класс……………………………………………………………. 307

Двигаемся дальше……………………………………………………………………………………………………………………. 315

Глава 19. От проверяемых исключений к типам результатов………………. 316

Перезагрузка интернет-соединения………………………………………………………………………. 316

Обработка ошибок до появления методов, основанных на исключениях…………………………. 318

Обработка ошибок с исключениями………………………………………………………………………………………. 319

Java и проверяемые исключения……………………………………………………………………………………………. 320

Как должен быть оформлен сбой parseInt?………………………………………………………………… 321

Kotlin и исключения…………………………………………………………………………………………………………………. 322

За пределами исключений: функциональная обработка ошибок………………………………………. 322

Обработка ошибок в Kotlin……………………………………………………………………………………………………… 326

Рефракторинг от исключений к обработке ошибок……………………………………………………………… 327

HTTP……………………………………………………………………………………………………………………….. 328

Наша стратегия преобразования………………………………………………………………………………… 329

Начнем с самого низа…………………………………………………………………………………………………… 330

Именование……………………………………………………………………………………………………………. 331

Контракт……………………………………………………………………………………………………………………….. 335

Отступление………………………………………………………………………………………………………………….. 339

Еще исправления……………………………………………………………………………………………………………………… 343

Слои………………………………………………………………………………………………………………………………………….. 349

Двигаемся дальше……………………………………………………………………………………………………………………. 351

Глава 20. От выполнения ввода/вывода к передаче данных………………… 353

Прослушивание тестов……………………………………………………………………………………………………………. 353

Ввод/вывод данных…………………………………………………………………………………………………………………. 356

Рефакторинг для удобства чтения…………………………………………………………………………. 361

Эффективное написание………………………………………………………………………………………………………….. 361

Еще о стимулах к работе……………………………………………………………………………………….. 361

Эффективное считывание……………………………………………………………………………………………………….. 365

Двигаемся дальше……………………………………………………………………………………………………………………. 370

Глава 21. От исключений к значениям…………………………………………………. 371

Определение того, что может пойти не так…………………………………………………………………………… 371

Представление ошибок……………………………………………………………………………………………………………. 379

А как насчет ввода/вывода?……………………………………………………………………………………………………. 387

Двигаемся дальше……………………………………………………………………………………………………………………. 388

Глава 22. От классов к функциям………………………………………………………… 389

Приемочный тест……………………………………………………………………………………………………………………… 389

Модульное тестирование……………………………………………………………………………………………………….. 394

Заголовки………………………………………………………………………………………………………………………………….. 399

Различные разделители полей……………………………………………………………………………………………….. 408

Последовательности……………………………………………………………………………………………………………….. 415

Считывание из файла………………………………………………………………………………………………………………. 421

Сравнение с Commons CSV……………………………………………………………………………………………………. 426

Двигаемся дальше……………………………………………………………………………………………………………………. 432

Глава 23. Продолжение путешествия……………………………………………………. 433

О сущностях……………………………………………………………………………………………………………………………… 433

Функциональное мышление……………………………………………………………………………………………………. 434

Простая конструкция………………………………………………………………………………………………………………. 436

Функциональное программирование и текстуальные рассуждения………………………………….. 437

Рефакторинг……………………………………………………………………………………………………………………………… 438

Рефакторинг и функциональное мышление…………………………………………………………………………… 439

Предметный указатель…………………………………………………………………………. 441

Об авторах……………………………………………………………………………………………. 443

Об изображении на обложке………………………………………………………………… 444

Дункан Макгрегор
Нэт Прайс

Дункан Макгрегор (Duncan McGregor) и Нэт Прайс (Nat Pryce) — опытные разработчики, консультанты и преподаватели. Ранние последователи как Java, так и Kotlin, они научились сочетать методы объектно-ориентированного и функционального программирования, а  также рефакторинга между этими языками. Их успешные семинары на KotlinConf доказали ценность обучения через рефакторинг и привели к написанию этой книги.

Добавить комментарий