Re[12]: Go
От: Sharov Россия  
Дата: 10.05.24 11:20
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Return value, конечно же. И дело в "апологетстве", а в минимизации мест, где происходят side effects — для того, чтобы отладка всего этого не стала кошмаром. Дело в том, что любой side effect по сути своей является ничем иным как использованием "глобальной переменной". Которые ровно за этот самый недетерминизм и ругают.


Что такое глобальная переменная в контексте записи на диск? Содержимое жестокого диска + (опционально)RAM?
А в случае передеачи\приема данных из сети -- содержимое дисков и памяти, всех подсоединенных к сети
компьютеров? И как предполагается взаимодействовать, если нету глобальных переменных?
Очевидно, что мы общаемся благодарю изменению некой глобальной переменной (бд на диске). Без
изменения этой глобальной переменной общение и много чего еще, да почти все в ИТ, было бы
не возможно.

S>>И как добавлять эти метаданные без перехвата исключения на месте?

SD>В тех местах, где таки надо снабдить пролетающее исключение — хватай, добавляй метаданные, прокидывай дальше.
SD>Таких мест должно быть очень мало. Потому что если их много, отладка такой программы будет настоящим адом. Все-таки, эффективное программирование возможно только тогда, когда программа детерминированно делает что от нее ожидается. А не валится с рандомной диагностикой.

Это так, но такое не всегда возможно.

S>>Это именно реальный мир. В огороженном вольере сидять как раз программисты на фп языках. Ну или

SD>ФП тут не при чем, это вопрос грамотного дизайна. Детерминированное поведение ровно так же ожидается и от функций на все том же С++. Собственно, на этом базируется все авто-тестирование — подаются те самые детерминированные "моки", которые детерминированно возвращают ожидаемое значение.
SD>Если совсем уж простой пример привести, если функции на языке С++ передать все данные, и никакие другие глобальные переменные та функция не использует, ее поведение должно быть детерминировано. Легко тестируемо, и вообще, о такой функции легко рассуждать (reasoning). Даже если кому-то поначалу сложно научиться (ну как же так, всю жисть глобальные переменные дергали, а тут вдруг низ-зя), это таки вопрос освоения мощных инструментов. Речь, разумеется, о тех участках кода, где эти инструменты применимы (это подавляющее большинство non-performance-critical кода).

О каких инструментах речь? А почему именно инструменты, а не методологии?
Кодом людям нужно помогать!
Re[13]: Go
От: SkyDance Земля  
Дата: 10.05.24 16:26
Оценка:
S>Что такое глобальная переменная в контексте записи на диск? Содержимое жестокого диска + (опционально)RAM?

Речь о детерминизме: если содержимое диска (и RAM) детерминировано (т.е. мы _ЗНАЕМ_, что читаем таблицу умножения с диска, или знаем, что мы читаем ровно тот же файл, что и будет там дальше), смысла добавлять это в метаданные пролетающего исключения нет. Попробую еще раз повторить: перехватывать и модифицировать исключение нужно только в тех случаях, когда поведение функции проблематично из-за отсутствия повторяемости (детерминизма).
В контексте тестирования: зачем мы используем моки? Да ровно затем, чтобы поведение SUT (system under test) было детерминированным. Иначе вместо отладки своей системы мы будем отлаживать баги зависимостей.

Кстати, о метаданных. В контексте все того же pread, возвращающего ENOENT — сдается мне, редко когда в пролетающее исключение будут добавлять, например, половину прочитанных данных (потому что ошибка произошла при чтении второй половины).

S>компьютеров? И как предполагается взаимодействовать, если нету глобальных переменных?


Очевидно же, что целью запуска программ как раз являются какие-то побочные эффекты (например, вывод чего-то на экран). Но код, где эти эффекты создаются, при грамотном проектировании всегда хорошо локализован. К примеру, слой, который пишет данные на диск, обычно отделен от вычислительного слоя. Именно затем и отделен, чтбоы минимизировать те самые побочные эффекты. Чтобы можно было легко и надежно тестировать. Я не знаю, сколько раз уже говорили о том, что раскидывать state changes по всему коду так себе идея. Сколько уже этих разговоров про transactional behaviour (а ведь это не что иное как выделение побочных эффектов в две специальные области, read и write, так что первое осуществляется при старте транзакции, второе — при commit'е).

S>О каких инструментах речь? А почему именно инструменты, а не методологии?


Методологию я тоже считаю инструментом. Кроме методологии, могут быть и непосредственно технические решения (да те же транзакции), и языки (более-менее припоминается Haskell, ибо вышеупомянутый erlang ну очень прагматичен в этих вопросах, и не пытается ограничить создание побочных эффектов).
Re[7]: Go
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.05.24 00:25
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, Pzz, Вы писали:


Pzz>>При каких вообще условиях pread может вернуть ENOENT?

CC>В том случае прилетело через четвёртые руки.
CC>Т.е. на три уровня ниже файловой системы, на которой лежал тот самый файл. Даже не в том же стеке.

Чёй-то оно неуставные коды ошибок в pread суёт? Кривая реализация сетевой файловой системы?
Re[5]: Go
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.05.24 00:29
Оценка:
Здравствуйте, ononim, Вы писали:

Pzz>>> от обилия восклицательных знаков

A>>Раст для девочек?
O>хуже

Так и знал. Свяжешься с этим новомодным растом, пипиську отрежут, а косички приделают. Всё в духе времени.

O>ну или так


И заставят коров пасти...
Re[6]: Go
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.05.24 00:30
Оценка:
Здравствуйте, CreatorCray, Вы писали:

O>>хуже

CC>On a bright side: выглядеть они стали моложе и веселее

Ты не знаешь, сколько их туда зашло, чтобы две вышли.
Re[8]: Go
От: CreatorCray  
Дата: 11.05.24 06:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Чёй-то оно неуставные коды ошибок в pread суёт?

А какую оно должно было сувать если произошло нестандартное?
Втихаря сжевать реальную ошибку, которую вернули "снизу" и выплюнуть generic "Eнишмагла" — за такое сразу руки отрывать надо.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[7]: Go
От: CreatorCray  
Дата: 11.05.24 06:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ты не знаешь, сколько их туда зашло, чтобы две вышли.

Хм... Я смотрю там девайс внутри куда суровее чем казалось поначалу.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[6]: Ну да, ну да...
От: rudzuk  
Дата: 11.05.24 08:27
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz> мало того, что не обещают какой-либо определенный порядок обхода при итерации ассоциативного массива (который в Go называется map), а еще и делают, в ущерб даже и производительности, этот порядок псевдослучайным, разным при каждом вызове.


Понимаю смысл рандомизации при заполнении ассоциативного массива, но при итерации... Зачем?
avalon/3.0.2
Re[7]: Ну да, ну да...
От: m2user  
Дата: 11.05.24 08:57
Оценка:
R>Понимаю смысл рандомизации при заполнении ассоциативного массива, но при итерации... Зачем?

Ну чтоб при каждой итерации порядок был не гарантирован
С другой стороны ведь и на псевдослучайность можно завязаться.
Так что теперь это уже не поменять, а то вдруг где-то энтропия опасно понизиться
Re[2]: Go
От: uncommon Ниоткуда  
Дата: 12.05.24 04:13
Оценка: +1
Здравствуйте, rudzuk, Вы писали:

R>Go — тормозное гамно
Автор: rudzuk
Дата: 16.07.23
с конченым синтаксисом. Еще и исключений нет 🤮


Поразительно, насколько код по ссылке на Паскале выглядит чище и читабельне кода на Го. Сам с Го не сильно знаком, просто бросилось в глаза.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.