/ / Как се различава съставянето на elm от проверените изключения на Java? - java, elm, checked-exceptions

Как се съставя компилацията на elm от проверените изключения на Java? - java, elm, checked-exceptions

elmтвърдение на нулеви време на работа-изключения е една от основните му точки за продажба (вж Официален сайт),

Но ако спрете да мислите за това, нищо не спира да разделяте на нула или да изчерпите паметта.

Какво elm компилатор, на практика, ви принуждава да покриете всички възможни пътища, които могат да доведат до изключение.

Например:

import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val

Но как се различава това от скандален функцията "проверени изключения" в java ?

public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}

Никога не съм чувал каквито и да било твърдения java е език с нулево време на изпълнение.

Отговори:

5 за отговор № 1

Моля, не се докосвайте до това, което е основно маркетингова хипербола. Разбира се има класове грешки, които никога няма да можете напълно да изключите с компилатор.

Като такива винаги съм ги вземалИзвестно е, че аз разбирам намерението на пропагандата. Elm е създаден като алтернатива на разработването на приложения отпред в Javascript, което е разхвърлян свят, където изключенията изобилстват и са част от тях от ежедневието. Elm прави много по-трудно да се застреляш в крака и без да се занимаваш с много усилия, ако ти минава през основните тестове за здравословно състояние на твоето приложение, най-вероятно спечели "т имат изключения по време на изпълнение в производството.

Elm драстично намалява възможността за изключения по няколко начина.

  1. Няма понятие за хвърлящо се изключение от езика Debug.crash, което, както подсказва и името му, трябва наистина да се използва само за отстраняване на грешки и заличаване на непълни логически пътеки.

Тъй като няма изхвърляеми изключения, проблемите с манипулациите най-често се извършват чрез такива типове Result и Maybe.

Това би могло да се смята за толкова слабо аналоговаJava е проверила изключения, но концептуално те се чувстват много по-различни от мен. Изключенията са били злоупотребени. Споменавате пример в Java, където Integer.valueOf() казва, че ще върне int, но ако типредавайте всичко друго, той разгръща комина и мехурчета, докато се надяваме, че някаква функция го хваща. Това ми се струва много объркано и сигурно изключенията, които са проверени, могат да помогнат за намаляване на прозореца за разпространение на неизправности, но основният факт е, че изключението е грешен инструмент за бизнес логика.

Алтернатива на хвърлянето на изключение би било да има класове, аналогични на Result и Maybe Elm типове, но това би било почтиневъзможно в първите дни на Java да се направи чисто, и дори с Generics, написването на такива видове е по-досадно и грешка, по-склонни от простотата на Elm видове.И поради системата на Elm затворен тип,

  1. Неизчерпателните шаблони на шаблона причиняват отказ при компилирането

В Java и Javascript, няма начин да имаизчерпателна проверка на съвпадението на шаблони, тъй като типовата система не го позволява. Разбира се, Typeescript е въвел някои функции, но трябва да се включите в нея. В Елм трябва да се справите изрично с всички случаи. Разбира се, предполагам, че бихте могли да твърдите, че Елм не позволява да се откажете от изчерпателното съвпадение на модела, като приключите всички изявления на делата с уловител _, но това би било просто глупава злоупотреба сезик. Тези чекове са там, за да ви помогнат, и аз се чувствам много по-безопасно от факта, че не мога да се включа в проверката на грешки в Elm - това е там по подразбиране!

  1. неизменност

Имулативността избягва много потенциални видове грешки, твърде много, за да влязат тук

  1. Elm Architecture предлага чисто разделение между Javascript и Elm

Елм ​​се свежда до Javascript, но ElmАрхитектурата предлага хубава чиста бариера, за да запази всички лоши парчета от Javascript далеч от чистия код, написан от Elm. Всяко изключение, което може да се случи в Javascript, трябва да се обработва от тази бариера, така че грешките за вход / изход винаги да бъдат преведени в тип Elm-friendly, exceptionless.

В крайна сметка изключенията по време на изпълнение са все още възможни (в случая: следващия маркиран с Elm въпрос се занимава с добре известно изключение, причинено от време за изпълнениес рекурсивно дефиниране на десктопа на Json), и се свивам малко, когато чуя някой да казва, че е невъзможно да получи изключение в Elm. Фактът е, че изключенията са възможни, но почти всяко изключение, в ежедневното развитие на Javascript е по същество невъзможно в Елм.


4 за отговор № 2

Както отбелязва коментатор, Java има нерегистрирани изключения, така че грешките по време на изпълнение правя възникне. Елм ​​също има нерегистрирани изключения за неща като разделянето на нула, но се отървава от тези, които най-често се наблюдават на практика. И тъй като отговорът на Чад споменава, Елмс Maybe/Result типовете работят съвсем различно на практика, отколкото Java изключенията. Опитен програмист на Elm няма да напише функция като toIntOrZero (и ако го правят, вероятно няма да го използват case ... of, предпочитайки нещо подобно toIntOrZero = String.toInt >> Result.withDefault 0).

Свързване на множество операции заедно с Result.map, Result.andThen, и така нататък дава много изразителен начинобработка на грешките, без да принуждава програмиста да прекалява дълбоко в плевелите. Например, ако искаме да напишем функция, която потвърждава идентификационния номер, като го преобразува в Int, търси в дадена структура от данни (когато това може да не е там) и след това проверява някои свойства, свързани с този потребител, можем да напишем нещо като това:

lookupUser : Int -> Result String User
lookupUser intId = ...

userInGoodStanding : User -> Bool
userInGoodStanding user = ...

isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False

Това гласи: "преобразувайте ID в int, след това погледнете(и много програмисти на Elm, мисля!), за да намерят това като истинско нещо, а след това да провери потребителя, а ако нещо не успява, върнете False. "Вашият километър може да варира, но след като сте свикнали с това, хубав начин за писане на код, надежден за грешки.