Всем привет! :-) Я тут неплохо отравился и, вместо того, чтобы чувствовать боль, наоборот, чувствую себя свежо и сплю по 4-5 часов :-) Очень странно. Но куда более странно восприятие мною стилей программирования в последнее время.
Kotlin
Когда вышел такой замечательный язык, как Kotlin, мне показалось, что он ну очень хорош - там есть extension-функции и лямбды, алгоритмы на коллекциях (fold, map, flatMap, filter, и прочее). В общем, очень удобно. Есть такая штука, как Data classes. Вот пример:
Kotlin
data class Point(x: float = 0, y: float = 0);
Kotlin
inline-функции. Ну и прочее-прочее.
Быдлокод
Тем не менее, я ещё фрилансирую и очень часто меня просто вызывают на час-два просто пофиксить какую-то ошибку или дописать функционал. Я работаю либо просто с довольно "простым" кодом, либо вообще с декомпилированным через TeamViewer. И, как бы ни было странно, в "быдло"-коде я делаю функционал гораздо быстрее, чем в своём "хорошем". Поэтому, как бы мне ни было грустно расставаться с чувством красоты, мне кажется, я скоро окончательно избавлюсь от Kotlin'а в сторону Java, либо буду писать на Kotlin'е как на Java, добровольно отказавшись от некоторых его фишек.
Причины, по которым я выбираю "Быдлокод"
Их много, но, например:
1. type inference имеет один минус: я не вижу типа. Банально, конечно, но, оказывается, если хочется обойти дерево файлов, то возвращается Sequence, а не List (что логично). Не помню подробностей недавней утилиты, но так оно дальше и покатилось - Sequence через Sequence ("ленивая структура данных"). В итоге, я вылетел из памяти по непонятным, на первый взгляд, причинам. Меня вообще не напрягают явные типы в Java. Да-да. Мне всё равно на эти большие конструкции - в 99% случаев я их просто пропускаю, не отдавая им внимания. А если там написано что-то неверное, то могу и заметить. Я не пишу эти конструкции, не трачу на них время. Я просто жму cmd + alt + v и всё! =) Всё пишется само. Избытычность не мешает, даже помогает.
2. Когда я программирую на супер-пупер высокоуровнем языке (Kotlin) он должен работать идеально. Он, чуть ли, не сам программы писать должен. Потому что, если есть какая-то высокоуровневая конструкция, которая работает неидеально, то я даже не могу её сразу увидеть и должен проходиться отладчиком.
3. смотрю на Kotlin - в нём не хватает фич. Смотрю на Scala - не хватает скорости компилятора. В итоге, имхо, лучше уж писать на Java, чем иметь ни то, ни сё. Взять те же data-classes. Что будет, если я захочу исключить какое-то поле из toString? Пример простой: у меня есть дерево, у его узла есть parent и children[]. Что-то я, да захочу исключить - иначе вывод строки зайдёт в рекурсию. Ок, что мне предлагают сделать? Правильно, переписать toString() самому. И, вот, data-классы уже не такие уж и красивые.
4. Надо слишком много думать. Да, я, наверное, не очень быстро думаю. Особенно, когда речь заходит о выборе, который почти ничего не значит и его надо просто сделать случайным образом.
Вопросы, которые не нужны и которые мешают
Позволю себе раскрыть это чуть подробнее. Есть список вопросов, которые меня заставляют просто зависнуть на несколько секунд:
1. Надо ли стирать это бельё? Если я выбил много кофе, то я становлюсь дерзким и сразу спрашиваю "зачем"? Мне говорят, про какое-то пятно и я тогда говорю, что да, стирать надо. Но, чаще всего, всё происходит не так: я думаю, хм, а надо ли? Или не надо? Надо? Вроде, норм. *Тут я перехожу в овощное состояние и могу задуматься и о чём-либо ещё". Короче говоря, оба варианта мне - безразличны, а зависаю я над ними надолго
2. Будешь чай? (Именно тогда, когда я его не сам хочу, а мне его предлагает кто-то). Я начинаю думать, ломаться, что-то там прокручивать в голове. Не слишком ли ещё поздно для кофеина, не буду ли я хотеть потом есть. А какого размера кружка - мне же потом в дорогу. И т.д.
Совсем другое дело, если бы меня спросили - давай я тебе сегодня долг верну? Ответ на этот вопрос возникает сам собой. Нет трудностей с ответом.
Что я вижу плохого в Kotlin'е
К сожалению, красивые языки вроде Kotlin'а порождают много стилистических вопросов. Не неся никакой практической нагрузки (вопрос только стиля), он порождает много неуверенности.
- Надо ли писать метод глобально или написать метод в companion object'е?
- Надо ли писать data class, или лучше на Java, т.к. стабильно?
- "Как бы сделать покрасивше?"
- Как бы это сделать на билдерах, чтобы переменную, которая часто встречается, вообще не надо было нигде указывать.
- Как extension-методе сохранить произвольную информацию об объекте? (оказалось, что никак)
- Стоит ли писать
fun getVelocity() = (x - lastX)/time
или лучше написать
fun velocity(): float {
return (x - lastX) / time
}
или лучше вообще
val velocity: float get() {
return (x - lastX) / time
}
И возникают ещё дополнительные проблемы:
- Почему ORM опять упал? Нужно сделать @JvmField? @JvmStatic? Ещё как-то?
- А почему десериализатор тогда не упал?
- А почему резко улетела память непонятно куда?
- Приложение стало собираться медленно из-за Kotlin/APT/ещё какого-либо фреймворка или из-за моих кривых рук?
И т.д. пишу я это всё, скорее для себя, т.к. попробую продолжать писать на Kotlin'е, но учитывая предыдущие ошибки.