LINUX.ORG.RU

Ответ на: комментарий от hippi90

Можно посмотреть на Kotlin, там вроде by-design решена эта проблема.

Я у себя во фреймворке (на PHP) как-то делал закладку на NPE-less работу. Вместо NULL свой объект Nil, любые операции от которого возвращают такой же Nil. Хотел вообще всё ядро перевести на такой подход. Но потом задолбался выискивать места ошибок, потому что почти любые конструкции формально безошибочными получались. И оставил это только на уровне финального вывода в шаблонах и т.п. :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Я у себя во фреймворке (на PHP) как-то делал закладку на NPE-less работу. Вместо NULL свой объект Nil, любые операции от которого возвращают такой же Nil.

Это немного не то что имеется ввиду под npe-less.

Обычно вводится тип вроде Maybe a (конкретизированный пример Maybe Int) который может иметь одно из двух значений - либо Just val (например Just 3) либо Nothing.

И во время написания кода там где функция может не вернуть значение (например, в случае ошибки) вместо объявления вроде Int myDivision(Int a, Int b) и возвращения Null в случае ошибки пишут нечто вроде

(Maybe Int) myDivision(Int a, Int b) {
  if b == 0 then Nothing else Just (a / b)
}
Смысл здесь в том что при вызове функции нужно проверять значение, вроде вот такого:
case myDivision(v1, v2) of
  (Just res) => echo 'Результат: ' . ( toString(res) )
  Nothing => echo 'Неожиданный результат. Вы что на ноль что ли делите?!'
А если просто написать echo myDivision(v1, v2) то код не скомпилируется потому что эхо ждёт строку, а получает Maybe Int. И такой вызов не скомпилируется myDivision(myDivision(v0, v1), v2) потому что внешний myDivision первым аргументом ждёт Int, а получает Maybe Int.

Т.е суть в том что компилятор предупредит если забудешь обработать возврат пустого значения.

Ну и понятное дело что в языках которые это умеют хорошо и правильно, есть целая плеяда инструментов для работы с такими вещами: функторы, аппликативы, монады, эффекты, изо-,ката-,гило- и прочие морфизмы..

А то что получилось у тебя как я понял по описанию - это просто замена «громогласного» npe на «тихий» npe. Как по мне так станет только хуже, потому что даже во время выполнения ошибка будет дополнительно маскироваться и вылезать уж в самом конце операции.

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 8)

Я, конечно, в джаве сугубо диванный аналитик, но...

Криво написать программу можно на ЛЮБОМ языке. Только при этом на одних ЯП приложение в случае чего будет честно валиться, на других - вываливать стек ошибок на 2 страницы, на третьих - молчать, продолжать работать, делая абсолютно не то, что подразумевал программист.

Угадайте, какой из этих трёх вариантов я считаю наиболее неприемлемым?

Это даже не говоря о том, что кривость может проявляться не в кодировании, а в проектировании, про которое зачастую вообще не думают.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Вроде как строго типизированный язык

Лол, посмотри на стандартную библиотеку: https://docs.oracle.com/javase/10/docs/api/java/util/Map.html

Спойлер:

Map<Integer, String> m = new HashMap<>();
m.put(1, "one");
m.get("oops"); // no warnings, no exceptions, just silently always fails

И если это кажется надуманным, то можно круче:

Map<Long, String> m = new HashMap<>();
m.put(1L, "one");
m.get(1); // this even looks valid

Естественно, все это великолепие происходит благодаря тому, что get() принимает Object. И из такого убогого говна состоит весь язык.

Сколь-нибудь большое приложение будет прилагать огромные усилия на превозмогание:

  • убогих дженериков
  • отсутствие const-объектов
  • как следствие, убогой стандартной библиотеки
  • как следствие, тонн мусора, образующегося на ровном месте
  • убогой пародии на ffi под названием jni (не понимаю, как это дерьмо не закопали до сих пор)
  • отвратительно низкой выразительности языка, когда на ровном месте высирается тонна лапшекода для, казалось бы, тривиальной задачи
  • ужасный инструментарий
  • отдельным пунктом стоит упомянуть Spring - редкостный кусок кала, который даже без XML конфигов превращает твой код в огромный клубок сношающихся зависимостей, не поддающихся человеческому пониманию.
  • в среднем, весьма низкой квалификацией разработчика, потому что многие ошибочно считают, что основная проблема - это порча и утечки памяти, а значит можно взять любую макаку с улицы выдавать 2k+ строк божественного энтерпрайза в день
  • как следствие, jre содержит огромное количество костылей и подпорок, чтобы упомянутый выше «божественный энтерпрайз» не тормозио
  • ну и вишенкой на торте можно считать невозможность делать что-то серьезное без IDE (которые, кстати, говно, как и прочий инструментарий, о чем было упомянуто выше)

Язык, на самом деле, редкостное говно. Не знаю, что может побудить нормального человека в 2019 году посмотреть в сторону Java.

anonymous
()
Ответ на: комментарий от anonymous

Spring

Вот по поводу этого уг из мира java - почему-то у него всегда находятся приверженцы и «защитники», мол, «всё там по уму»… Почему они жрут это за щеки и не краснеют - и мне не понятно.

menangen ★★★★★
()

Вроде как строго типизированный язык, как с++ и ошибки сведены к 0 теоретически.

Ошибки типизации сведены к нулю

Какие подводные камни будут при написании крупного(относительно) приложения на андроид?

Арифметические ошибки, логические ошибки, ресурсные ошибки, UI ошибки

Можно ли в Java написать криво программу?

Можно, разрешаю

Crocodoom ★★★★★
()
Ответ на: комментарий от Twissel

Там у них какой то java апплет который они когда то купили естественно не имея исходников и теперь им насрать на всех...

dem ★★
()
Ответ на: комментарий от hobbit

Только при этом на одних ЯП приложение в случае чего будет честно валиться, на других - вываливать стек ошибок на 2 страницы, на третьих - молчать, продолжать работать, делая абсолютно не то, что подразумевал программист.

1) python 2) Java 3) GO

Вот только вчера столкнулся с гениальной штукой GO

dem ★★
()

Можно ли написать её не криво? Все приложения, что я видел, перманентно зависали при соблюдении ряда примитивных условий. Только наверно там где у си assert failure или сегфолт, у джавы дедлок, хотя удавалось и вм засегфолтить (нормальным использованием прошу заметить), но она оставалась висеть. А ещё многие текли как сучки, угу.

anonymous
()
Ответ на: комментарий от anonymous

Естественно, все это великолепие происходит благодаря тому, что get() принимает Object

Нормальные люди, экономящие деньги и время, пишут в IDE. Там все два варианта подчеркнуты ворнингами.

убогих дженериков
отсутствие const-объектов

Это в процессе фиксинга.

как следствие, убогой стандартной библиотеки

Библиотека, как библиотека. Где видел лучше?

убогой пародии на ffi под названием jni

В GraalVM сделали лучше. Опять же в процессе новое ffi.

ужасный инструментарий

Какой-то бред. Один из лучших в отрасли.

которые, кстати, говно, как и прочий инструментарий, о чем было упомянуто выше

Всё понятно, с этого и надо было начинать.

что может побудить нормального человека в 2019 году посмотреть в сторону Java

А на что посмотреть нормальному человеку?

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.