
Sergey
12.04.2018
06:57:52
свои коллекции писать? монады?

Egor
12.04.2018
06:57:56
Щас бы в 21 веке делать язык с общим воркспейсом для всех проектов и говорить, что это фича

Sergey
12.04.2018
06:58:08

Тимур
12.04.2018
06:59:02

Google

Egor
12.04.2018
07:00:09
он не общий лол
Я хотел процитировать офф. документацию, но вообще то как можно назвать организацию, когда все билды кладутся в одну папку и это не папка в одной директории с исходным кодом?

Sergey
12.04.2018
07:01:09

Michael
12.04.2018
07:01:23
джинерики уменьшают дублирование кода
ещё они помогают ловить ошибки во время компиляции, а не в рантайме

Sergey
12.04.2018
07:01:47

Michael
12.04.2018
07:01:50
если это недостаточное обоснование их нужности, то я даже не знаю

Egor
12.04.2018
07:02:49

Sergey
12.04.2018
07:03:12
есть array/map/channel, которые отчасти генерики)

Andrew
12.04.2018
07:03:38
Вы тут снова спецолимпиаду проводите? :)

Egor
12.04.2018
07:04:11
А так говоря, действительно, зачем в Го дженерики? Там же даже ООП в присущем ему виде нет, там и без дженериков хорошо живётся

Sergey
12.04.2018
07:04:12
[]interface{} - почти тот же Collection<T>, один хер в рантайме нельзя до типа T достучаться)

Michael
12.04.2018
07:07:10
при компиляции можно

Sergey
12.04.2018
07:08:22
котлин нейтив будет сильно конкурировать с гошкой, когда релизнется
и "у нас есть генерики" это как-то не самый сильный аргумент)

Google

Тимур
12.04.2018
07:11:45
учитывая что в джаве они затираются...
затираются
но тем не менее они
1. убирают кучу мусора из исходного кода (касты типов)
2. спасают от огромного количества глупых ошибок на этапе компиляции
практически любой обобщенный код нуждается в дженериках
для обобщенного кода отсутствие дженериков = отсутствие типизации
без них получим багоопасное нетипизированное болото, которое сложно поддерживать

Andrew
12.04.2018
07:13:06
У нас кроме генериков есть весь остальной котлин, нормальный типобезопасный интероп с сями и обжом, возможность с первой версии генерировать юзабельные .a / .so, мульти-платформа, и это всё только первое, что в голову пришло.
Но любители отключать себе систему типов могут продолжать писать на Го :)

Michael
12.04.2018
07:13:53
По моему, Сережа нас просто троллит :)

Sergey
12.04.2018
07:13:56

Тимур
12.04.2018
07:14:05

Sergey
12.04.2018
07:14:11
?

Vitalii
12.04.2018
07:14:40

Sergey
12.04.2018
07:14:52

Vitalii
12.04.2018
07:14:58
Понял

Sergey
12.04.2018
07:15:03
котлин с корутинами и своей моделью памяти vs golang
там они в принципе будут на равных
я к примеру провел не один день в исходниках кубернетса и докера, и если б это была скала - я б дальше 2го класса в коде не ушел, тупо забил бы

Mikhail
12.04.2018
07:17:00

Boris
12.04.2018
07:18:49

Hip
12.04.2018
07:18:50
генерики везде нужны0

Тимур
12.04.2018
07:19:27
давай вспомним CNCF проекты, которые почти все написаны на го и о боже их поддерживают)
есть еще более огромное количество проектов написанных на питоне
но лично мое мнение: надо держаться как можно дальше от этого болота
на нетипизированных языках очень хорошо и здорово писать всякие мелкие говноскрипты для одноразового применения
перелопатить кусок данных, посмотреть и выбросить - питон для этой цели просто прекрасен
но боже упаси делать проект с большим объемом кода на нетипизированном языке

Sergey
12.04.2018
07:23:54
писать можно на чем угодно, вон сколько проектов на пхп 4м написано и ниче)

Тимур
12.04.2018
07:25:07
и на перле!

Egor
12.04.2018
07:25:12
О!

Aleksandr
12.04.2018
07:25:44

Google

Aleksandr
12.04.2018
07:25:55
есть такой вопрос - на сколько это идеоматичный код?

Egor
12.04.2018
07:25:55
а, чщерт, минус стикерпаки

Aleksandr
12.04.2018
07:25:59
и как сделать правильнее?

Sergey
12.04.2018
07:26:47
жесть какая

Александр
12.04.2018
07:26:49
Клевые стикоры, спасибо

Aleksandr
12.04.2018
07:27:09
как сделать на clj понятно - some-> и вперед
как на java тож
а как на kotlin пока не очень понятно

Sergey
12.04.2018
07:27:23
во-первых познакомся с early returns

Egor
12.04.2018
07:27:30

Ivan
12.04.2018
07:28:33
"when (...) null -> " не идиоматично, есть же ?: и safe-call операторы

Aleksandr
12.04.2018
07:28:57
ну вот с let? как раз попытка обработки если есть

Mikhail
12.04.2018
07:29:03
Выдели null ветку в отдельную функцию, можно в локальную, и when замени на if

Aleksandr
12.04.2018
07:29:05
но ощущение "через жопу" остается и непонятно

Sergey
12.04.2018
07:29:15
if (depth >= MAXDEPTH) return null
val avail = exchangeRates[from] ?: return null
val rate = avail[to]
if (rate != null) return Path....
return avail.map(..)

Aleksandr
12.04.2018
07:31:18
ага то есть надо поближе к java < 8

Ivan
12.04.2018
07:31:19

Sergey
12.04.2018
07:31:28

Mikhail
12.04.2018
07:31:49

Ivan
12.04.2018
07:32:00
?.someStuff()?.someMoreStuff() ?: defaultValue

Google

Ivan
12.04.2018
07:32:15
Зачем if'ом на null проверять?

Sergey
12.04.2018
07:32:17
вот вам код, сделайте лучше)
не ударяясь во вложенность

Aleksandr
12.04.2018
07:33:05
задача - поиск оптимального пути при конвертации из одной валюты в другую
если целиком
при том что такого пути может не существовать вообще

Egor
12.04.2018
07:33:28
Черт ногу сломит

Sergey
12.04.2018
07:33:29

Egor
12.04.2018
07:33:40
Вот вам и однострочники идиоматичные

Ivan
12.04.2018
07:33:45
Лол. Тогда можно без элвиса же.

Sergey
12.04.2018
07:34:35
ну ок сорян, вот обновленная версия
if (depth >= MAXDEPTH) return null
val avail = exchangeRates[from] ?: return null
val rate = avail[to] ?: return Path..
return avail.map(..)

Ivan
12.04.2018
07:34:42
Я не понимаю желания сделать кучу return'ов в одной функции, неудобно же читать

Sergey
12.04.2018
07:34:56
наоборот же

Mikhail
12.04.2018
07:35:08

Жабра
12.04.2018
07:44:49
val avail = exchangeRates[from]
if (depth >= MAXDEPTH || avail == null) return null
val rate = avail[to]
return if (rate != null) Path(...)
else avail.map(..)
Я бы так написал
А avail.map(...) выделил бы в отдельную функцию

Aleksandr
12.04.2018
07:53:00
понял спасибо, переверну посмотрю свежим взглядом
вообще что стоит почитать чтобы понять "как принято"?

Google

Жабра
12.04.2018
07:53:46

Alexey
12.04.2018
07:58:56

Sergey
12.04.2018
08:00:34
это троллинг надеюсь?
конечно же лучше такое
function()
{
HRESULT error = S_OK;
if(SUCCEEDED(Operation1()))
{
if(SUCCEEDED(Operation2()))
{
if(SUCCEEDED(Operation3()))
{
if(SUCCEEDED(Operation4()))
{
}
else
{
error = OPERATION4FAILED;
}
}
else
{
error = OPERATION3FAILED;
}
}
else
{
error = OPERATION2FAILED;
}
}
else
{
error = OPERATION1FAILED;
}
return error;
}

Alexey
12.04.2018
08:01:47
Очередное утрирование ?

Андрей
12.04.2018
08:04:54
1 return не всегда "читаемей" чем несколько, тут главное в крайности не впадать

Boris
12.04.2018
08:05:43
Конечно, вообще ранний выход это хорошая практика
Избавляет от лишней вложенности и контекста

Sergey
12.04.2018
08:06:21
отрезаешь по пути все прекондишены и невалидные условия, а в конце возвращаешь результат

Ivan
12.04.2018
08:06:32

Sergey
12.04.2018
08:07:08

Ivan
12.04.2018
08:07:43
Убирает кучу дупликации как раз в таких случаях

Michael
12.04.2018
08:08:21
ранний выход нужен если в теле функции происходит не только полезная работа, но ещё и валидация
зачем их засовывать в одну функцию - хз

Sergey
12.04.2018
08:10:24
вообще такое ощущение что Clean Code никто не читал, там это все описано было хз сколько лет назад

Ivan
12.04.2018
08:11:38
Так у тебя контекста не меньше получается в функции, error code это вообще зло ж
Но там еще явно не указано, что "error", оказывается, не только ошибку может означать, но и успешное выполнение

Mikhail
12.04.2018
08:29:59