wtf

Jul. 15th, 2014 09:53 pm
juan_gandhi: (VP)
[personal profile] juan_gandhi
IntelliJ 13 with Scala plugin
Screen Shot 2014-07-15 at 2.00.25 PM
(also, failed to upload this image to their bug reporting site)

Screen Shot 2014-07-15 at 9.52.26 PM
(atlas oreilly editor)

Date: 2014-07-16 03:11 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
В скале NPE случаются, но не от монад.

Date: 2014-07-16 09:09 pm (UTC)
stas: (Default)
From: [personal profile] stas
А вот интересно, что с монадами бывает в подобных случаях? В смысле, вызвали какую-то функцию с таким-то параметром, а она не знает, что с ним делать. Или, наоборот, вернула что-то, чего вызывающий не ожидает. Каков будет результат?

Date: 2014-07-16 09:49 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Рассказать по существу, что не получилось. В случае NPE - заворачивать в какой-нибудь тип; NPE вообще не должно существовать в природе.

Во втором случае само сообщение абсурдно. Хотя спасибо, что написали because. Но тут же мы как бы имеем дело с контролем версий - ну так и ведите себя реалистично; мерж, может быть, какой-нибудь. Глупо же удивляться неожиданностям и валить все это на юзера.

Date: 2014-07-16 11:42 pm (UTC)
stas: (Default)
From: [personal profile] stas
Ну NPE - это и есть "что-то не получилось". Рассказать по существу можно, если мы заранее позаботились проверить, получилось или нет. А если нет? Т.е., скажем, мы имеем метод, который, не знаю, нам число пи считает. И там внутри у него почему-то сломался думатель. И мы, допустим, по-умному сказали - пусть вернёт не Number, а Option какой-нибудь. И вот он вернул None. Мы в этом случае что будет сделать? Напишем - "не могу продолжать - мне не дают число пи, а дают None". А почему не дают? Неизвестно. Т.е. практически мы делаем немногим большее, чем делает бектрейс. А как сделать больше?

Т.е. либо надо каждую функцию оснастить специальной рассказывалкой (что в общем случае невозможно - есть же библиотеки), либо в конце концов будут всё равно случаи вида "что-то не так, а что - неизвестно, вот вам бектрейс".

Date: 2014-07-17 12:23 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
None особой пользы не приносит в данном случае; она только показывать может, что это, давай ошибку обрабатывай. Лучше что-то более детальное, разумеется.

Date: 2014-07-17 07:47 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>Ну NPE - это и есть "что-то не получилось".

На практике это нередко "что-то не получилось, но забыли такой вариант обработать и пытаемся вызвать метод". Т.е. необязательно не получилось и ничего нельзя было поделать, может и можно было, но вот забыли. А Option просто не дает забыть обрабатывать такие случаи.

Date: 2014-07-17 08:06 am (UTC)
stas: (Default)
From: [personal profile] stas
Ну как не даёт - вроде как Java не даёт не обрабатывать эксепшены, так тут же начинают писать catch(Exception e) { /* TODO */ } и так прямо в продакшен и пихают.

Date: 2014-07-17 08:31 am (UTC)
From: [identity profile] thedeemon.livejournal.com
А, кстати, NPE относится к тем checked exceptions? Java разве заставляет все обращения к методам и полям в try-catch заворачивать на случай NPE?

То, что ленивый человек может замять обработку None явно (каким-то аналогом catch(Exception e) { /* TODO */ }), это конечно правда, но все ж это не то же самое, что просто забыть.

Date: 2014-07-17 09:00 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
В общем да, с опшеном тa же фигня получается, если народ пишет option.get(). В этих всех скальных классах есть некоторое количество лишних функций, делающих фп несколько бессмысленным.

Date: 2014-07-16 11:17 pm (UTC)
From: [identity profile] zyxman.livejournal.com
В высоконадежном программировании применяют расширенную типизацию и гард-выражения.
Суть что в типе можно указать только те значения, для которых функция протестирована, соответственно виртмашина пристреливает процесс с ошибкой типа синего экрана, стектрейсом итп, естественно в некоторых пределах возможны всяческие try с обработкой ошибки.
Гард-выражения в сущности делают то же, что расширенные типы, но чуть другой синтаксис и проверка находится на входе в функцию и позволяет применять бюилтин функции виртмашины.
Пример - if (x%2 == 0)

Date: 2014-07-16 11:44 pm (UTC)
stas: (Default)
From: [personal profile] stas
Суть что в типе можно указать только те значения, для которых функция протестирована

А не упарятся на 2^64 значений тестировать? А если аргументов пять?

Date: 2014-07-17 12:57 am (UTC)
From: [identity profile] zyxman.livejournal.com
Для невычислимого применяется аналитическое доказательство - ну например, что корень квадратный при вещественной арифметике, определен только для положительных чисел.

Date: 2014-07-17 01:07 am (UTC)
From: [identity profile] zyxman.livejournal.com
На практике, в реально критических приложениях (самолеты/ракеты/спутники) диапазон входных значений очень сильно ограничен физикой - например, типичный самолет на 10+км просто в принципе летит на скорости 800км/ч +-10км/ч - если больше может развалиться, если меньше - упадет, так что и смысла нет тестировать за пределами этого диапазона - важно только чтобы эту цифирь тщательно и безошибочно вписали в контракт (см "контрактное программирование").
- Например, самая дорогая в истории программная ошибка, как раз и случилась от того что на "Ариан-5" реиспользовали софт от "Ариан-4", а в контракте не учли что "Ариан-5" летает выше и быстрее чем "Ариан-4".

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

June 2025

S M T W T F S
1 2345 6 7
8 9 10 11 121314
15161718 1920 21
222324252627 28
29 30     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 7th, 2025 07:20 am
Powered by Dreamwidth Studios