Anonymous
"Они" говорили что дженерики не нужны. Потом "они" говорили что дженерики нужны? Кто "они"? Тот же Керниган или Пайк говорили? Основная задача разработки Go. Си-подобный код, максимально простой и понятный для "среднего" программиста с целью решения бизнес задач. Этим и объясняется недоООП и отсутствие других модных штук. И если средняя обезьяна не понимает ООП и дженерики... их не должно быть. Цель проста. Чтобы в коде разобрались и смогли поддерживать условные 100 миддлов. А не полтора сеньора, которых все ищут. Умные программисты безусловно нужны... но не нужны только Умные программисты, которых на рынке почти нет. Для работы программистом Go плох. Т.к со временем кардинально снизит уровень входа и зарплаты "умным". Задачи смогут решать не только они.
Господа. В корень проблемы взглянуть желаете? Идите сюда, покажу - локтями не толкаться, будьте друг к другу терпимее, у нас у всех одна задача разобраться, в не выяснить кто чьи педали одел. Гоу нацелен прежде всего на то, чтобы снизить влияние человеческого фактора на код. Для этого постарались выбрать базис , состоящий из элементов неоспоримых а ИТ индустрии и всем более менее понятных. Вместе с тем на язык существует давление со стороны "опытных" (консервативных) разработчиков. Это и привело к так называемому переобуванию. Сложная концепция объектов не оправдывает себя по затратам на изучение/ сложности поддержки. Лучшее решение проблемы ЧФ пока не найдено, но гоу ближе всего к эталону.
Maxim
Go это public poll Тупой опрос – 30 👍👍👍👍👍👍👍 88% Тупой C – 3 👍 9% Тупой Python – 1 ▫️ 3% Тупой JavaScript ▫️ 0% 👥 34 people voted so far.
Anonymous
Жжоте
Dmitry
Господа. В корень проблемы взглянуть желаете? Идите сюда, покажу - локтями не толкаться, будьте друг к другу терпимее, у нас у всех одна задача разобраться, в не выяснить кто чьи педали одел. Гоу нацелен прежде всего на то, чтобы снизить влияние человеческого фактора на код. Для этого постарались выбрать базис , состоящий из элементов неоспоримых а ИТ индустрии и всем более менее понятных. Вместе с тем на язык существует давление со стороны "опытных" (консервативных) разработчиков. Это и привело к так называемому переобуванию. Сложная концепция объектов не оправдывает себя по затратам на изучение/ сложности поддержки. Лучшее решение проблемы ЧФ пока не найдено, но гоу ближе всего к эталону.
а ну да. эти волшебные правила преобразования интерфейсов в другие типы и обратно. а если уж массив интерфейсов то совсем все просто
Dmitry
тоесть как бы чтото типа дженериков есть но лучше бы их не было в таком виде
Мерль
контрвариантность и ковариантность типов
Мерль
было бы неплохо
Dmitry
контрвариантность и ковариантность типов
да, вот эти умные слова неплохо бы воплотить в го
Мерль
контрвариантность и ковариантность типов
хотя бы для функций и методов (для контейнеров нужно вводить ещё иммутабельность)
Daniel
меня больше всего бесит обработка ошибок. 1. ошибке нужен стектрейс. сейчас я вынужден логировать ошибку на всех уровнях, на которых я ее обнаружил. даже если передаю ее выше без изменений. иначе поиски места, в котором ошибка действитель нопроизошла, становятся трудными 2. ошибке нужен тип. я хочу иметь возможность возвращать IO errors и input data errors так, чтобы их потом можно было отличить друг от друга. 3. ошибке нужен код. value который. я хочу иметь возможность сравнивать ошибки и выбирать обработку исходя из того, что именно вернулось. 4. Ошибке нужна возможность i18n сообщения
Мерль
* надо доклад сделать что ли
Daniel
ты ж понимаешь, что меня это беспокоит больше в отношении ошибок, которые мне возвращают снаружи...
Alexander
* надо доклад сделать что ли
Лучше в отдельную либу и на гитхаб
Мерль
Лучше в отдельную либу и на гитхаб
и кодогенератор всё есть, но пока сырое
Daniel
да оно тривиальное же! и на гитхабе уже есть несколько
Alexander
Ну так-то да. Да и на действительно, лучше это иметь на уровне языка
Daniel
ну или хотя бы на уровне стандартной либы и гайдлайнов (как в яве)
Мерль
вообще всё это лечится внесением тегированного enum (или тип сумм, или variant, называйте как хотите)
Daniel
именно ошибки - они уже интерфейсы, и на этом месте замену можно произвести не особенно напрягаясь
Мерль
const iota?
это кастрированная хрень, которая нравится только сишникам, которые ничерта кроме числовых ошибок не видели ты не можешь туда пропихнуть что-то сложнее строки или числа
Мерль
А надо ли пихать что-то сложнее? И типы, кстати, никто не отменял
нужно для нормальной передачи ошибок для нормальной работы с каналами вместе с интерфесами это будет прекрасно работать нет, ты можешь сделать с помощью iota только обёртку на числом
Мерль
Численная ошибка — это максимально дерьмовое решение
Maxim
var ErrMyCustomError = ...
Maxim
И проверка на совпадение
Мерль
И проверка на совпадение
как только ты захочешь что-то сложнее строковых констант, это перестаёт работать
Мерль
это раз
Maxim
Возможно у меня просто не было ситуаций, когда требовалось что-то сложнее
Мерль
во вторых, если по честному, множественные возвращаеме значения — это херовое решение, так как даёт много неопределённостей и позволяет игнорировать ошибки
Мерль
если у тебя что-то сложнее CRUD, то тебе нужны более развесистые ошибки
Мерль
Например?
например ошибки валидации если ты хочешь отдавать имена полей и конкретное описание ошибки, тебе нужно где то эту информацию хранить или если у тебя на методе висит что-то сложное, какой-нибудь нетривиальный процесс типа развёртывания какой-нибудь системы, тебе нужно знать, что зафейлилось при работе, и не только видеть это при отладке, но и обрабатывать
Dmitry
ммм. с точки зрения ооп это ведет к нарушению инкапсуляции
Dmitry
ты кишки наружу хочешь отдать
Мерль
в общем как только к ошибке нужно добавлять хоть какой-то контекст, то у тебя ошибки го работают не очень
Мерль
ты кишки наружу хочешь отдать
а? причём тут инкапсуляция тебе не обязательно отдавать подробности реализации, тебе нужно отдавать причины фейла
Мерль
ну отдавай как строку, в чем проблема ?
как эту строку потом обрабатывать? Парсить? JSON туда класть?
Igor
Извините за глупый вопрос: а почему нельзя отдавать стракт, который удовлетворяет интерфейсу Error?
Dmitry
зачем обрабатывать?
Мерль
зачем обрабатывать?
чтобы предпринять связанные с ошибкой действия да, такое нужно, если у тебя приложение — это не тупой интерфейс к СУБД
Мерль
если у тебя приложение — это обёртка над базой, то конечно. тупо логируешь ошибку и отдаёшь пользователю урезаную версию
Dmitry
окей, а что ты хочешь отдать такого что тебя не хзватает строки, ну как пример
Мерль
окей, а что ты хочешь отдать такого что тебя не хзватает строки, ну как пример
- поля с зафейленной валидацией - контекстные ошибки (например ошибки, пришедшие от других сервисов или компонентов) - стектрейс - таймстемп - какие-то параметры для рековери - id запроса
Мерль
в случае если у тебя ошибка уезжает на фронтенд, ещё хорошо бы отдавать кусок документации, которую наверное ещё нужно переводить на разные языки
Мерль
ошибки — это сложно
Dmitry
и вот как вот это ты собираешься в автоматическом режиме обрабатывать ?
Dmitry
поле зафейлило валидацию - повторить 1000 раз пока не пройдет ?
Мерль
и вот как вот это ты собираешься в автоматическом режиме обрабатывать ?
это зависит от бизнес логики, тут нет общего ответа
Dmitry
вернуло стектрейс, запустить автоматом дебагер, подключить ИИ для определения причины ошибки , исправить , запустить еще раз и все автоматом ?
Dmitry
вернуло тайстемп - проверить что мы в 21 веке , если нет запустить другую функцию ?
Мерль
поле зафейлило валидацию - повторить 1000 раз пока не пройдет ?
как раз такое сейчас очень часто делается, потому что не могут отличить ошибку разрыва сети от ошибки валидации той же
Мерль
и тупо долбятся запросом
Cat
вернуло тайстемп - проверить что мы в 21 веке , если нет запустить другую функцию ?
что за странные поиски оправдания ненужности ошибок?)
Dmitry
по мне все что не может быть решено на уровне вызывающем ошибки не должно выдавать детали реализации наружу
Dmitry
вернуть признак наличия ошибки и строку для пользователя.
Cat
для какого пользователя?)
Dmitry
это не про детали реализации же)
наименования полей - не деталь реализации. окей
Cat
какие наименования полей?) ты о чём?)
Dmitry
для какого пользователя?)
который в 2 часа ночи полезет в логи сонный смотреть что же там сломалось опять
Мерль
вернуть признак наличия ошибки и строку для пользователя.
у тебя может запрос зафейлится тремя разными способами, один требует ретрая через некоторое время, второй — сделать другой запрос, третий просто умереть
Мерль
твои действия?
Cat
который в 2 часа ночи полезет в логи сонный смотреть что же там сломалось опять
/ничего не хочу сказать, но большинство ошибок можно решить без вмешательства пользователя/
Dmitry
рефакторить
Dmitry
давай конкретную задачу
Cat
как?
мне вопрос?
Cat
restart-case (или как он там в common lisp)
Dmitry
я лишь говорю о том что вызывающей функции не надо возвращать какие то конкретные данные касающиеся реализации, достаточно типа ошибки для автоматической обработки этой ошибки.