|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
в java 8 запихнули Optional из гуавы. Расскажите плиз пользуетесь ли вы этой новой фичей? я просто пока не понял как она помогает очистить код от проверок на null и сделать его красивее. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 01:17 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
questioner, Вот тут посмотрите 15.6 http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 12:13 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
А где там говорится что код станет красивее? Он станет уродливее, но зато будет точнее видно где подразумевается ноль :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 20:23 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Насколько я понял, это позволяет отловить NULL значения и обработать их, как нужно программисту. В принципе, удобно, но не факт, что красиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 20:59 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
private, Суть не в красивостях, а в избавлении от отслеживания значений и проверки на null. Есть ещё всякие штуки вроде getOrElse ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 21:04 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
> Суть не в красивостях, а в избавлении от отслеживания значений и проверки на null. Есть ещё всякие штуки вроде getOrElse Я понимаю что за проблему пытаются решить с введением опционал. Но это на мой взгляд плохое решение. Это как челу с перкосом лица на одну сторону сделали пластическую операцию и оно у него перекосилось на другую, типа поправили :). Если решать это то нужно было бы как-то пытаться интегрировать в систему типов явы, но поскольку сохранив обратную совместимость этого по-видимому сделать не удавалось - решили сделать такой костыль, который якобы помогает. Хе-хе, да вот даже в примере по ссылке написано что это "то-же самое" что и с нулл. авторif(person != null) { System.out.println(person) } else { System.out.println("Person not found!"); } То же самое, но с использованием Optional: if (person.isPresent()) { System.out.println(person.get()); } else { System.out.println("Person not found!"); } А это авторPerson personNew = person != null ? person : new Person(); То же самое, но с использованием Optional: Person personNew = person.orElse(new Person()); Ну надо-же, изобрели if / else, теперь эти конструкции можно делать не только с помошью встроенных функций языка, но надо еше и помнить кучу тарабарщины типа `orElse`, `orElseThrow` и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2015, 07:44 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
private, По порядку тогда. http://blog.jhades.org/java-8-how-to-use-optional/ What is wrong with just returning null? The problem is that the caller of the function might not have read the javadoc for the method, and forget about handling the null case. This happens frequently and is one of the main causes of null pointer exceptions, although not the only one. http://blog.jhades.org/java-8-how-to-use-optional/ How does Optional help with functional programming? In chained function calls, Optional provides method ifPresent(), that allows to chain functions that might not return values: Код: java 1. 2.
http://blog.jhades.org/java-8-how-to-use-optional/ What is Optional not trying to solve Optional is not meant to be a mechanism to avoid all types of null pointers. The mandatory input parameters of methods and constructors still have to be tested for example. Like when using null, Optional does not help with conveying the meaning of an absent value. In a similar way that null can mean many different things (value not found, etc.), so can an absent Optional value. The caller of the method will still have to check the javadoc of the method for understanding the meaning of the absent Optional, in order to deal with it properly. Also in a similar way that a checked exception can be caught in an empty block, nothing prevents the caller of calling get() and moving on. Здесь ещё отличный пример использования. Мне вообще не очень понятно как вы хотите пользоваться Stream API без Optional, и не ловить NPE на каждом шаге? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2015, 10:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
private... авторif(person != null) { System.out.println(person) } else { System.out.println("Person not found!"); } ... То же самое, но с использованием Optional: if (person.isPresent()) { System.out.println(person.get()); } else { System.out.println("Person not found!"); } Документацию на API нужно читать однако, а то как был дураком так дураком и помрешь. Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 08:29 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
https://dzone.com/articles/java-ptional-whats-point So to recap - in an attempt to get rid of NullPointerExceptions we have a new class that: -Throws NullPointerExceptions -Can itself be null, causing a NullPointerException -Increases heap size -Makes debugging more difficult -Makes serializing objects, say as an XML or JSON for an external client, much more difficult ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 09:13 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
questionerв java 8 запихнули Optional из гуавы. Расскажите плиз пользуетесь ли вы этой новой фичей? я просто пока не понял как она помогает очистить код от проверок на null и сделать его красивее. Вот ещё https://developer.atlassian.com/blog/2015/08/optional-broken/ Иногда пользуюсь, но только до тех пор пока она делает код проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 09:15 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Еще раз повторяю vimbaSystem.out.println(person.orElse("Person not found!")); тоже-самое что и System.out.println(person != null ? person : "Person not found!"); авторДокументацию на API нужно читать однако, а то как был дураком так дураком и помрешь. И в этом ты ошибаешься, то что ты начал читать АПИ вовсе не означает что ты перестал быть дураком. Попробуй напрягать мозги, может поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 16:47 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
> Мне вообще не очень понятно как вы хотите пользоваться Stream API без Optional, и не ловить NPE на каждом шаге? Особо не смотрел еще стрим АПИ, не могу сказать, с первого взгляда не понравилось. В сравнении с Ruby / JavaScript - выглядит сложнее и запутаннее. Это обычные функции, непонятно зачем ради них делать специальный стрим апи. Вспоминается совет одного из создателя Гуавы - по поводу ее использования и функционального стиля - ответ был - не нужно ее использовать, нужно испольовать обычные циклы. Жава слишком стара чтобы нормально в нее интегрировать функциональное программирование, у гуавы это не получилось, и судя по всему у стрим апи тоже не особо получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 16:54 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
private, privateОсобо не смотрел еще стрим АПИ Не смотрел, но осуждаю (с) [quote private]непонятно зачем ради них делать специальный стрим апи.[/private] Совместимости ради privateнужно испольовать обычные циклы. С такими советами вам на форум С++. Лично я ничего плохого в эволюции языка не вижу, тем более, если она проходит в верном направлении. privateу стрим апи тоже не особо получится. По-моему уже получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2015, 22:37 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Blazkowicz, Интересная статья. Могу предложить свою реализацию Optional. Это класс из моей библиотеки underscore-java. Он умеет хранить null внутри себя и .get() не выкидывает Exception. С уважением, Валентин ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 03:29 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
[quot DoSOfRedRiver] privateОсобо не смотрел еще стрим АПИ Не смотрел, но осуждаю (с) privateнепонятно зачем ради них делать специальный стрим апи.[/quot ] Совместимости ради privateнужно испольовать обычные циклы. С такими советами вам на форум С++. Лично я ничего плохого в эволюции языка не вижу, тем более, если она проходит в верном направлении. privateу стрим апи тоже не особо получится. По-моему уже получилось. Абсолютно согласен по каждому пункту. Вчера хотелось написать то же самое, но лениво было флейм разводить. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 09:26 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin KolesnikovBlazkowicz, Интересная статья. Могу предложить свою реализацию Optional. Это класс из моей библиотеки underscore-java. Он умеет хранить null внутри себя и .get() не выкидывает Exception. С уважением, Валентин А чего там особенного то можно придумать? класс простой ведь ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 19:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin Kolesnikovquestioner, Вот собственно ссылка . Сложно было правильно составить equals и hashCode. Нет, сложно было сделать столь много ошибок. 1. У Вас лишний boolean (который тривиально вычисляется). С учётом выравнивания- 8 байт лишних. 2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта. 3. get вполне может вернуть null. И зачем такое счастье? 4. У стандартного Optional есть константа EMPTY "раз и навсегда". 5. Там ещё и orElse и т.п. - удобные вещи. Т.е. когда нет Optional, но хочется- лучше копипастить проверенные решения, а не изобретать ломучий велосипед. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2015, 08:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
privateЖава слишком стара чтобы нормально в нее интегрировать функциональное программирование, к с++ лямбды пришили и мир не перевернулся ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2015, 09:24 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin Kolesnikov, https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided. Зачем вам оно понадобилось - не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2015, 16:25 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Alexey Tomin, 1. У Вас лишний boolean (который тривиально вычисляется). С учётом выравнивания- 8 байт лишних. boolean даёт возможность хранить null внутри Optional. 2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта. Это будет Optional со значением null внутри себя. 3. get вполне может вернуть null. И зачем такое счастье? Мне нужен был get, который может вернуть null для методов в библиотеке. 4. У стандартного Optional есть константа EMPTY "раз и навсегда". Можно добавить такую константу. 5. Там ещё и orElse и т.п. - удобные вещи. Можно добавить такой метод. В guava он называется or(). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 03:12 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin Kolesnikov2. Кстати, у Вас бага - вызов "new Optional(null)" приведёт к созданию невалидного объекта. Это будет Optional со значением null внутри себя. Т.е. у объекта есть три состояния- "значения нет", "значение есть, но оно null" и "значение есть"? Вот уж багогенератор... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 08:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Alexey Tomin, Optional хранит внутри себя объект (null допустимое значение) и признак absent (если оно истнино значение бъекта устанавливается в null и доступно для .get()). С уважением, Валентин ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 11:18 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin KolesnikovAlexey Tomin, Optional хранит внутри себя объект (null допустимое значение) и признак absent (если оно истнино значение бъекта устанавливается в null и доступно для .get()). С уважением, Валентин Тут одно из двух - либо null является допустимым значением (a.), либо null означает отсутствие значения (b.). a.) Option(null) == Present(null) => Absent.get() должен выбрасывать exception b.) Absent.get() == null => Option(null) должен возвращать Absent В любом случае в вашей реализации я вижу логическую ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 23:30 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
какаято фуета, зачем все это ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2015, 03:36 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез, Можно добавить для метода get() выкидывание Exception, если absent хранит истинное значение. Только NPE и так случится, если обращаться к методам для переменной со значением null. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2015, 04:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
bochkov, Это обсуждение статьи https://developer.atlassian.com/blog/2015/08/optional-broken/ У atlassian есть своя реализация Optional - класс Option. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2015, 05:39 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез, Добавил выбрасывание IllegalStateException для метода get() в случае если absent == true, появились методы fromNullable(final T nullableReference), or(final T defaultValue) и orNull(). Ссылка на код С уважением, Валентин ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2015, 08:41 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin Kolesnikov, Есть замечания, предложения для этой версии Optional? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2015, 17:00 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin Kolesnikov, Приятно, конечно, когда твои мысли находят отклик :) Но то замечание было риторическим, по большому счету... Тут я согласен с мембером private - не нужно тащить в Java идеологию функционального программирования. Для этого есть Scala, Groovy и десятки прочих языков. А для сильно желающих - есть fj, fugue итд. Какой смысл в еще одной библиотеке? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2015, 18:17 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез, Если вопрос про библиотеку underscore-java, то в ней ей польза для написания похожего кода в JavaScript и java. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2015, 21:59 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Valentin KolesnikovДиез, Если вопрос про библиотеку underscore-java, то в ней ей польза для написания похожего кода в JavaScript и java. JS: Код: javascript 1.
Java: Код: java 1. 2. 3. 4. 5.
Вы действительно считаете эти два примера похожими? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2015, 23:02 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез, Есть реализация всех методов из JavaScript библиотеки. Так будет выглядить код для метода map. Можно применить лямбды для JDK8. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2015, 01:23 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез, Пример кода с лямбда для JDK8: Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2015, 01:41 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Сегодня впервые увидал это чудо инженерной мысли. Меня переполняют матерные слова. Я мог бы понять, если бы такую ошибку дизайна сделал новичёк. В Оракле, что, специалистов больше не осталось? Oдни маркетологовые крикуны да маразматики? КАК, И ЧЕМ надо думать что бы ввести конструкцию, которая НИЧЕГО, абсолютно НИЧЕГО не улучшает и не упрощает, но добавляет количество необходимых (машинных) инструкций И потребление памяти? И даже проверки на уровне времени выполнения. НЕ компиляции. Маразм. Меня одно одно интересует, покажите мне хоть одного разумного, кто это добровольно использует? Кто нибудь вообще может подвести хоть какую нибудь разумную аргументацию для этого #@$#$#? Смотрим на C# 8.0 - разумный продуманный дизайн. Почему в Java не могут так, сразу сделать правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2018, 21:53 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
я прочухал кайф от Optional ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 07:57 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronСмотрим на C# 8.0 - разумный продуманный дизайн. Почему в Java не могут так, сразу сделать правильно? Я уже лет 10 не кодил на C#. И возможно там всё как-то стало красиво и кошерно. И поэтому к вам вопрос. Как у вас в C# решается проблема NPE или NullReferenceException (NRE) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 08:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
bochkovя прочухал кайф от Optional так раскажи, что курить надо, чтоб так вставляло. типа сидим, кодим а деньги идут? Или может мне это надо и кучу времени или денег сбережёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 09:07 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonКак у вас в C# решается проблема NPE или NullReferenceException (NRE) ? Так же как Overflow и OutOfMemmory - навешиванием шиздюлей программисту. В общем случае. Но иногда можно будет избежать. String! - обьект есть не нуль, компилятор гарантирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 09:17 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronmaytonКак у вас в C# решается проблема NPE или NullReferenceException (NRE) ? Так же как Overflow и OutOfMemmory - навешиванием шиздюлей программисту. В общем случае. Но иногда можно будет избежать. String! - обьект есть не нуль, компилятор гарантирует. 1. Тоесть ты считаешь что решение этой проблемы - не техническое а организационное? 2. Твой дополнительный комментарий про string я понял, но он - не в кассу. Optional, который обсуждается в топике имеет более общую природу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 09:46 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, NotNull типы и Option нужны для совершенно разных целей. Первое - для исключения null из набора допустимых значений. Второе - для явного возврата результата, который может иметь значение, а может не иметь. Да, исторически null использовался для индикации того, что значение не возвращается, но такое решение крайне кривое по многим причинам. Представьте себе ЯП, в котором вообще нет null. Как в нем указать, что метод может вернуть значение, а может не вернуть? Только вводя новый тип наподобие Optional. PS. На такой толстый троллинг тут уже не ведется никто. Тоньше надо, со знанием дела ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 10:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonmikron Так же как Overflow и OutOfMemmory 1. Тоесть ты считаешь что решение этой проблемы - не техническое а организационное? Я считаю что это не проблема. Программисты совершают ошибки - они такие же люди. Не будет NPE будут другие совершать. Поинт в том что Optinal не уменьшат риск появления ошибки. Более того, программист может с таким же успехом совершить ошибку и вернуть null там где ожидается Optinal. И если я пишу отказоустойчивый метод, то теперь к прверке на null добавится ешё isPresent. mayton2. Твой дополнительный комментарий про string я понял, но он - не в кассу. Optional, который обсуждается в топике имеет более общую природу. Я таки не понял в чём разница между null и optional. Так уж сложилось что null обозначает - обьекта нету. Какое тайное знание передаёт мне Optional? Если оставить проповеди Java - веруюших - никакого. Безполезное и даже вредное дополнение к яве и главниое - ничего не меняет. А String! - даёт гарантию. Это не условность, и не апель к карзаботчику. Жосткий факт. В результате код надёжнее, производителнее, компакнее. И время разработки умешается. Реально сохраняет время/нервы/деньги владельцев софта. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 11:51 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
ДиезДа, исторически null использовался для индикации того, что значение не возвращается, но такое решение крайне кривое по многим причинам. Но оно уже сложилось. И два "Null" хуже чем один. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 11:54 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезно такое решение крайне кривое по многим причинам.смотрим причины: ДиезПредставьте себе ЯП, в котором вообще нет null. А такой есть? Больше нет причин? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 12:42 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123А такой есть? Да полно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 13:14 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
мы используем и нам нравится ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 13:16 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никPetro123А такой есть? Да полно.не хочу такой)) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 13:19 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123забыл никпропущено... Да полно.не хочу такой)) Такими темпами в вадю превратишься ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 13:28 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никPetro123А такой есть? Да полно. Это типа как с указателями в Java - указателей нет, а Null Pointer Exception есть! Бардак! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 14:23 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никТакими темпами в .... превратишьсяне. Мне больше нравится так: collection?.Count без райзе. Или: String? s = null; А необходимость сабжа прошла мимо моего сознания) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 14:31 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиезДа, исторически null использовался для индикации того, что значение не возвращается, но такое решение крайне кривое по многим причинам. Но оно уже сложилось. И два "Null" хуже чем один. Категорически не согласен. Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений. А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 15:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, А по поводу String! - оно тоже от NPE не защитит, хотя бы потому, что Null можно просетать через рефлексию. В Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 15:51 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Optional нужен тогда когда контракт очень важен то есть если есть некий метод Код: java 1. 2. 3. 4. 5.
То мне это даёт гарантии(конечно не 100%, но надежда есть) что не будет RuntimeException и что не будет null вместо ожидаемого Details. А метода map, flatMap делает код прямее. Опять же без согласия в команде по использованию Optional всё это не будет работать. Мне лично не хватает ещё из коробки Either что есть в Scala, но Optional уже не плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 16:25 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
GregTkконтракт очень важена когда он так важен, что нужно писать больше, сложнее и неочевиднее? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 16:57 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123GregTkконтракт очень важена когда он так важен, что нужно писать больше, сложнее и неочевиднее? Не уверен что я понимаю ваше определение сложнее и не очевиднее. Для меня сигнатура метода которая возвращает Optional говорит что метод не вернёт больше ничего кроме как Optional и мне уже становится легче и проще жить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 17:03 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
ДиезВ Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете... В классическом scala коде просто нет никаких null, так что проблема надуманная, вообще если честно первый раз услышал про NotNull только сегодня. Optional в Java кривой конечно, наивная попытка перетащить частичку ФП. Но без for-comprehension и монад это ненанмого упрощает жизнь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 17:16 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
GregTk, Я примерно то же самое хотел написать по поводу усиления контракта в интерфейсе. Но перед этим меня заинтересовал другой камент участника по поводу языков в которых нельзя создать неинициализированный указатель. Дайте мне время подумать и я опишу этот поинт. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 17:24 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Я читал твой ответ. Щас неудобно. Тайпаю с телефона. Отпишу вечером. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 17:27 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Напомню про существование Bean Validation: Код: java 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 19:04 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никДиезВ Scala, например, давно есть маркер NotNull, который делает ровно то же самое - запрещает на уровне компиляции присваивать нулл ссылочным типам. Так вот, от него хотят избавиться, потому что проблем с ним больше, чем пользы. Можете поискать обсуждения в инете... В классическом scala коде просто нет никаких null, так что проблема надуманная, вообще если честно первый раз услышал про NotNull только сегодня. Что за проблема? Я пытаюсь донести до товарища mikron , что пресловутый тип "String!" из следующего C# - это не панацея. Это уже было в скале, и признано ее создателями ошибочным решением. забыл ник Optional в Java кривой конечно, наивная попытка перетащить частичку ФП. Но без for-comprehension и монад это ненанмого упрощает жизнь. Да, мы тут три года назад (ого!) уже об этом говорили. Но всё равно, даже с таким Optional лучше, чем без оного :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 19:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123Диезно такое решение крайне кривое по многим причинам.смотрим причины: ДиезПредставьте себе ЯП, в котором вообще нет null. А такой есть? Больше нет причин? Интересно рассмотреть вопрос с разных сторон и со стороны разных парадигм и ЯП. Lisp. В Лиспе Nil (null) имеет очень интересную семантику. 1. Он эквивалентен пустому списку. В примере второй и третий элемент равны по смыслу. Это также очень тесно связано с внутренними структурами памяти. Память - бинарное дерево и пустой список и Nil это физические указатели на определенную константу. Но "мыслимые" нами и транслятором как одно и тоже. Код: java 1.
2. В булевом контексте Nil рассматривается как false. Код: java 1. 2. 3. 4. 5.
О существовании NPE в Lisp я ничего не знаю. Возможно там есть какие-то классы ошибок связанные с разыменованием. Если кто знает - прошу в топике поделится. 2. SQL. . Я много лет использую SQL. Но не общий диалект а Оракловый. Но здесь тоже есть некоторые наблюдения. Oracle SQL постулирует определённую алгебру строк в которой пустая строка равна NULL. Это сделано давно из соображений экономии памяти сегмента таблиц а также пространства индекса в блоках. В других СУБД - возможно по другому. SQL (не только оракловый а вообще генерализованный) определяет семантику операций сравнения с null. Независимо от аргументов результат операции сравнения будет равен FALSE (Undefined) если хотя-бы один из аргументов слева или справа равен NULL. Забавен также факт что NULL не равен сам себе. NULL не участвует в операциях аналитики и агрегации. Тоесть расчет AVG(field) будет просто скипать поля которые равны NULL. Подытоживая эти два пункта я хочу сказать. Что в этих парадигмах программирования NULL вообще не является проблемой разработки. Он скорее по другому определяет операции над Null значениями. Null - не проблема. Проблема - семантика операций. В классических ЯП семейства Java/C++/C# любая попытка разыменования типизированной Null-переменной вызовет немедленную реакцию прерывания основного потока с выбросом различного рода исключений. В С++ может быть разное поведение. Как говорится depends on. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 21:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronЯ считаю что это не проблема. Программисты совершают ошибки - они такие же люди. Не будет NPE будут другие совершать. Поинт в том что Optinal не уменьшат риск появления ошибки. Более того, программист может с таким же успехом совершить ошибку и вернуть null там где ожидается Optinal. И если я пишу отказоустойчивый метод, то теперь к прверке на null добавится ешё isPresent. Это интересный поинт. Я-бы его рассмотрел с разных сторон. Но в первую очередь я как человек дотошный начал-бы с основ. Давай посмотрим что такое вообще Optional и что о нем пишет сайт производителя. Я буду читать здесь. С вашего позволения я возьму просто последнюю версию (да щас это уже можно) JDK API, в разделе Optional. https://download.java.net/java/early_access/jdk11/docs/api/java.base/java/util/Optional.html Цитата. Насколько мне позволяет мой слабый intermediate я дам творческий перевод. Если я где-то ошибся - можете дополнить. public final class Optional<T> extends Object Контейнер объекта который МОЖЕТ или НЕ-МОЖЕТ содержать не нулевое значение. Если значение есть - isPresent() вернет true. Если значения нет - объект рассматривается как пустой и isPresent() вернет false. Дополнительные методы которые зависят от наличия или отсутствия значения предоставляются как orElse() (возвращает дефолтное значение если основное значение отсутствует) и ifPresent ... и т д. Это - value-based class, использование identity-sensitive операций (включая сравнение ссылок (==), сравнение хеш-кодов, и синхронизацию) на экземплярах Optional может иметь непредсказуемые резульатты и их следует избегать. API Note: Optional изначально введен для использования как метод возвращающий тип где четко нужно представить "отсутствие результата" и где использование null, чрезвато возникновением ошибок. Переменная чей тип Optional, никогда не должна быть нулевой; у нас всегда есть опциональный экземляр. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 21:57 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronЯ таки не понял в чём разница между null и optional. Так уж сложилось что null обозначает - обьекта нету. Какое тайное знание передаёт мне Optional? Если оставить проповеди Java - веруюших - никакого. Безполезное и даже вредное дополнение к яве и главниое - ничего не меняет. А String! - даёт гарантию. Это не условность, и не апель к карзаботчику. Жосткий факт. В результате код надёжнее, производителнее, компакнее. И время разработки умешается. Реально сохраняет время/нервы/деньги владельцев софта. Я думаю что польза или вред от Optional определяется практикой. В нашем случае - практикой защиты от NPE. ,Из таких практик я лично использовал. 1. Модульный тесты . Нудно. Скучно. За это неплатят. Я не всегда придерживаюст 100% покрытия (а у вас сколько только честно?). В некоторых случаях (перед рефакторингом) я делал тест закрепления. Я специально толкал null везде где только можно в модульных тестах в публичные методы и закреплял их через такие себе странные утверждения Код: java 1.
2. Аннотации семейства jsr305. @Nulllable/@Nonnull Их понимает IDE и SonarQube. И если где-то есть нарушение контракта на фазе статик-анализа кода то сонар или среда выкинет красный флажок. Это мой любимый метод закрепления гарантий по NPE. У них есть братья близнецы в пакетах sun и много еще где. 3. Фабричные методы. Лет 5 назад у нас были серъезные проблемы с биллингом для одного моб-провайдера. Приложение Java/GWT. UI регулярно сыпался. Причем ловля NPE в GWT старых версий была настоящим мучением. Обфускация и прочее. Мы достигли внутри группы опеределённх соглашений. Мы вообще отказались от конструкторов для бизнес энтитей. Мы заменили их 100% на фабричные методы. Методы фабриковали нам объекты с полями которые были инициализированы специальными магическими констатнами. Строки - "". Даты - дефолтная дата типа 0001 год от Рождеста Христова. И если это обёртка числового типа - то соотв 0.0. Мы рассудили таким образом. Что левая констана в UI не приносит столько демеджа сколько NPE. Это было согласовано и заэстимировано и реализовано. Мы побороли 99% NPE. Дальнейшие фиксы были уже минорчиками. Кастомер был доволен. 4. EMPTY_LIST, EMPTY_MAP e.t.c. Это религия. Мы принципиально отказались от возврата NULL как признака пустой коллекции. Забано. Но после этого код содержащий for(..) стал проще. Негативных эффектов не было. Optional мы тогда (Java 1.6) не использовали. Возможно сейчась оглядываясь на 3-й пункт я-бы об этом подумал. Те практики что мы использовали не были идеальны. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2018, 22:16 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... Но оно уже сложилось. И два "Null" хуже чем один. Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений. Звучит не плохо, но как обычное маркетингавое словоблудие. Задави меня фактом, покажи: где детская болезнь? хорошее типобезопасное решение: Почему хорошие, чем лучше, где польза от типабезопасности? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 07:56 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... Но оно уже сложилось. И два "Null" хуже чем один. А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :) Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 08:02 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Согласен с вами. Маркетингом пахнет. забыл ник, Scala не знаю. Не понял, как мне без null жить? Если метод дайМнеВозраст() а база недоступна? Или райзе форсмажор в середине подготовки ответа? mayton, Согласен. Коллекции тоже всегда создаю на выход, даже если пустая. У меня соседний проект на шарпе. Вроде у них такой метод: - всегда простые переменные не могут быть null пока не поставишь знак вопроса. int i? = null разрешено. Без вопросика запрещено. Вроде изящное решение. По умолчанию нигде не будет null ))) Imho ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 08:39 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123У меня соседний проект на шарпе. Вроде у них такой метод: - всегда простые переменные не могут быть null пока не поставишь знак вопроса. int i? = null разрешено. Без вопросика запрещено. Вроде изящное решение. По умолчанию нигде не будет null ))) Imho Мда. Я тоже слышал об этом. Дотнетчики пошли по пути изменения синтаксиса языка в угоду некоторым задачам разработки. Насколько глубока эта проверка? Это фаза компилляции? Или рантайм? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 08:55 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonЦитата. Насколько мне позволяет мой слабый intermediate я дам творческий перевод. Если я где-то ошибся - можете дополнить. public final class Optional<T> extends Object Контейнер объекта который МОЖЕТ или НЕ-МОЖЕТ содержать не нулевое значение. Если значение есть - isPresent() вернет true. Если значения нет - объект рассматривается как пустой и isPresent() вернет false. Дополнительные методы которые зависят от наличия или отсутствия значения предоставляются как orElse() (возвращает дефолтное значение если основное значение отсутствует) и ifPresent ... и т д. Это - value-based class, использование identity-sensitive операций (включая сравнение ссылок (==), сравнение хеш-кодов, и синхронизацию) на экземплярах Optional может иметь непредсказуемые резульатты и их следует избегать. API Note: Optional изначально введен для использования как метод возвращающий тип где четко нужно представить "отсутствие результата" и где использование null, чрезвато возникновением ошибок. Переменная чей тип Optional, никогда не должна быть нулевой; у нас всегда есть опциональный экземляр. то что написано в жавадоке в точности соответствует 21598781 - не больше, не меньше, т.е. "A variable whose type is Optional should never itself be null; it should always point to an Optional instance." - это такая настоятельная рекомендация, а не часть языка, т.е. потенциально никто не мешает вместо Optional возвращать null, но делать так настоятельно не рекомендуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 08:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Андрей Панфилов, а меня еще интересует такой вопрос. Есть два DAO. Один - декларирует безопасный способ возврата значения. Второй - классический. Кто ответственен за отсутствие NPE в первом случае. В большей степени - автор реализации SafeDao, или программист который это Dao использует. Тоесть я хочу понять на чьей стороне будет мяч. Код: java 1. 2. 3. 4. 5.
Код: java 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
GregTkOptional нужен тогда когда контракт очень важен то есть если есть некий метод Код: java 1. 2. 3. 4. 5.
То мне это даёт гарантии(конечно не 100%, но надежда есть) что не будет RuntimeException и что не будет null вместо ожидаемого Details. Кто тебе это гарантирует? Компилятор не гарантирует. И там где ты вызываеш featchDetail ты даже не знаешь кто этот метод реализовал. А писал его какой нибудь индус самоучка. А он тебе вообще ничего не обещал и не должен. Ему так звёзды подсказали. Значит ты делаешь свой код надёжнее и отрабатываеш проверку на null. Или ты хочешь NPE в своем коде? Потребителю ведь не видно что у тебя там, и ему и не в домёк про того индуса. Это реалии таковы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:12 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonНасколько глубока эта проверка? Это фаза компилляции? Или рантайм? Компиляции. Но оставим C#, Optional проблема явы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:28 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Отлично берём некий код, который написан с возможностью выкинуть RuntimeException(нет соединения с сервисом или ещё хрен знает что) теперь оборачиваем код в try-catch и возвращаем Optional с нужными данными, таким простым способом я избавляюсь от side-effects в коде, который заведомо не безопасен без создания дополнительных моделей данных, а с использованием готового решения в лице Optional. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:46 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronmaytonНасколько глубока эта проверка? Это фаза компилляции? Или рантайм? Компиляции. Но оставим C#, Optional проблема явы. Ну ты хитер! Всех взбаламутил. Втащил в тему обсуждение c#. Рекомендовал синтаксис уровня компилляции. А тепер говоришь - оставим! Ну баламууут! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:51 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиезпропущено... Option - лишён детских болезней Null, поэтому это не второй нулл, а хорошее типобезопасное решение для описания опциональных значений. Звучит не плохо, но как обычное маркетингавое словоблудие. Задави меня фактом, покажи: где детская болезнь? 1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения. В случае Optional, EMPTY - обычный объект, поэтому можно писать конструкции вида Код: java 1.
2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения) А вообще, гуглить "billion dollar mistake". mikronхорошее типобезопасное решение: Почему хорошие, чем лучше, где польза от типабезопасности? [/quot] В чем польза от типобезопасности? Это шутка такая? :) Ну, многие любят JavaScript... Но мы тут, вроде, обсуждаем языки со строгой типизацией, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:52 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronНо оставим C#, Optional проблема явы.нет логики. Чтобы в java не было проблем, надо знать как у других). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:53 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиезпропущено... А если говорить глобально про новые возможности ЯП - то наличие альтернативы всегда лучше ее отсутствия. А не нравится - не используйте :) Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:) Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell. "Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 09:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:) Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell. "Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага? Отсутствие значения в аргументах функции хаскель васпринимает нормально. Он в качестве резалта генерирует новую функцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:07 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonДиезпропущено... Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell. "Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага? Отсутствие значения в аргументах функции хаскель васпринимает нормально. Он в качестве резалта генерирует новую функцию. Это вы про частичное применение? Ну, тут нет неинициализированных значений, которые можно "потом" заполнить, как в случае переменных в ООП. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:19 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
По моему только я и микрон сделали попытку расширить тему топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:25 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonАндрей Панфилов, а меня еще интересует такой вопрос. Есть два DAO. Один - декларирует безопасный способ возврата значения. Второй - классический. Кто ответственен за отсутствие NPE в первом случае. В большей степени - автор реализации SafeDao, или программист который это Dao использует.Причем тут вообще ответственность? Если метод возвращает Optional, то это заставляет консьюмера заморочиться чтобы получить реальное значение, т.е. писать isPresent/get/orElse/orElseGet - сама по себе лапша с проверками на null никуда не делась - просто перешла из императивной в функциональную (это и есть предмет открытого спора: почему Optional в жаве такой кривой). Единственный профит здесь - это map/flatMap, они вроде как количество кода уменьшают, хотя с эстетической точки зрения код лучше не становится. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения. В случае Optional, EMPTY - обычный объект, поэтому можно писать конструкции вида Код: java 1.
Сравним: Код: java 1.
Или тот же Црешётка Тут нет никакого подвоxа или скрытыx типов, один gолый null Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:36 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... Вы восхваляли языки где нуля нет. Я воспользуюсь вашей аргументацией: null - алтернатива, которая обогощает. Значит можно добавить во все языки, где его нет:) Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell. "Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага? Я не знаю этих языков, поэтому не понимаю вашу рагументацию. Я хотел показать от противного - наличие алтернативы не всегда лутше. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:42 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диез Код: java 1.
Давайте немного поправим, а то совсем убого выглядит Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Андрей ПанфиловДиез Код: java 1.
Давайте немного поправим, а то совсем убого выглядит Код: java 1.
Хотел, чтобы было нагляднее для mikron. В C# же нет method references, как в Java ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 10:55 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиезпропущено... Ну, попробуйте добавить null в понимании Java/C# в какой-нибудь Haskell. "Неинициализированное иммутабельное значение.." - мне кажется, это бред ))) . Подумайте тоже, ага? Я не знаю этих языков, поэтому не понимаю вашу рагументацию. Я хотел показать от противного - наличие алтернативы не всегда лутше. Вы пришли в раздел Java, подняли топик трехлетней давности, и начали в довольно агрессивном тоне критиковать разработчиков Java, при этом не вполне понимая, что ими двигало. Ну какой тут конструктив может быть ? )) . Так, флейм на тему... Сорри, сольюсь пожалуй, работать надо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:00 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
ДиезВ C# же нет method references, как в Java Есть, называются delegate. ДиезNull нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения. ваше утверждение таким образом опровергнуто: Мои примеры показывают как легко null может итегрироватся в цепочку вычислений. И главное - даже пример на яве лаконичней и еффективней. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:05 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
ДиезВы пришли в раздел Java, подняли топик трехлетней давности, и начали в довольно агрессивном тоне критиковать разработчиков Java, при этом не вполне понимая, что ими двигало. Я пришёл спросить как себя чувствуйт другие. А здесь есть разработчики явы? Если есть те кто придумал "Оптинал"? им откыто, прямым текстом - кретины! Ко всем осталным отношения не имеет. Так что вы не обрашяйте внимания, это не к вам. Я не хотел вас обидет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:12 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиезВ C# же нет method references, как в Java Есть, называются delegate. (facepalm) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:15 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronЯ пришёл спросить как себя чувствуйт другие. А здесь есть разработчики явы? Если есть те кто придумал "Оптинал"? им откыто, прямым текстом - кретины! Ко всем осталным отношения не имеет. Так что вы не обрашяйте внимания, это не к вам. Я не хотел вас обидет. Детский сад, вторая четверть. Ваша истерика нам очень важна. Пишите ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:26 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Я предлагаю не мешать функциональный ЯП и не функциональный. Нахрена приводить языки где null нет или логика с null не используется? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 11:37 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Я думаю что невозможно (не удастся) обсуждать сферический Optional в вакууме. Мы так или иначе в поисках альтернатив будем делать сравнения с другими яп, парадигмами и подходами. И это хорошо. А самое плохое - ругать не разобравшись. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 13:44 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123забыл ник, Scala не знаю. Не понял, как мне без null жить? Многие до сих пор без goto не могут. Подумай, зачем тебе вообще нужен null? Ты просто привык смотреть на программирование с точки зрения императивного языка. Мир меняется, функциональщина и декларативный подход лезет во все щели, пора самообразовываться, бро. Если так подумать, то null используется в двух местах - 1) когда не знаешь что вернуть из метода и идешь по пути наименьшего сопротивления, вместо создания NullObject или NullCollection ты просто возвращаешь нулл и живитесь как хотите:) 2) Когда некоторые переменные в классе неинициализированы. Тут можно долго холиварить о том, а нужен ли вообще изменяемый стейт(чем его меньше тем лучше тут думаю согласны все), и решается это созданием полностью инициализированного объекта с выполнением всех инвариантов, например через factory methods как писал mayton. Оба эти случая лишь ведут к тому что программист плодит вероятные проблемы там, где их не было бы, не будь null. Petro123Если метод дайМнеВозраст() а база недоступна? Option конечно, но не кривой как в java. Petro123Или райзе форсмажор в середине подготовки ответа? Exceptions, null - это все side-effects, которых надо избегать, чтобы иметь мало-мальскую возможность "reason about code", к сожалению формат форума не подразумевает чтение лекции, в которой можно было бы обьяснить что это и главное, зачем это. Отличие scala - в том что Option там это монада. Грубо говоря это абстракция, или контекст в котором происходит цепочка вычислений, результат следующего зависит от предыдущего. В каждой монаде запрограммировано как обрабатывать нестандартные результаты(отсутствие результата или неправильное значение и тд) и контекст сам решает как быть дальше, программисту просто надо писать бизнес-логику. В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Обрати внимание, все функции принимают конкретные объекты, а не Option. Задача распаковать\запаковать Option лежит на методах map и flatMap монады(в данном случае Option), твоя задача писать бизнес-логику а не париться о null и т.д. Но так как синтаксиса for{ <- } в Java нету, то и Optional намного менее мощная и нужная штука. Относится не только к Scala, а к любому декларативному языку, на самом деле я тоже долго не понимал почему Java так не любят, пока не потрудился и не разобрался с Haskell и попутно Scala. И хотя я до сих пор вижу некоторые преимущества в Java(не языке, а платформе и сообществе), но знание двух парадигм конкретно помогает посмотреть на код с разных сторон, так что рекомендую. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 14:31 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123Я предлагаю не мешать функциональный ЯП и не функциональный. Нахрена приводить языки где null нет или логика с null не используется? Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования? Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 14:36 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никМир меняется, функциональщина и декларативный подход лезетне верю что залезет)). Про ООБД совсем недавно тоже пророчили. Но РСУБД как была так и осталась. Я за императивный код. Но мысли твои интересные. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 15:37 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
господа, идея Option проста как валенок... если программа открывает порт, или файл, или парсит строку в цифру может случится исключение. сигнатура метода заставляет Вас быть готовым обработать это исключение либо переебросить его для обработки выше. Вы не можете избежать этого. в добавление к этому Option, также как и как исключения, будет заставлять програмиста быть готовым к обработке None. That's it! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 16:46 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Cheblinгоспода, идея Option проста как валенок... если программа открывает порт, или файл, или парсит строку в цифру может случится исключение. сигнатура метода заставляет Вас быть готовым обработать это исключение либо переебросить его для обработки выше. Вы не можете избежать этого. в добавление к этому Option, также как и как исключения, будет заставлять програмиста быть готовым к обработке None. That's it! А обьяснишь чем это отличается от checked exceptions?:) Не все так просто ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 17:00 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
CheblinNone А что такое None и зачем быть готовым к его обработке? например в ф-ции: Код: java 1. 2. 3.
Чем None лучше/хуже, чем выход за Integer.MAX_VALUE, Integer.MIN_VALUE ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 17:03 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
А если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing. В общем, вещь явно совершенно не бесплатная IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 17:07 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
А что такое None и зачем быть готовым к его обработке? сори в Rust е по-уши, машинально написал. надеюсь все поняли о чем я. Leonid KudryavtsevА если говорить об эффективности, то .... вещь явно совершенно не бесплатная хочется поговорить о эффективности Exceptions? не надо себя сдерживать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 17:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл ник, чистые функции и борьба с side-effects наше всё :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 17:42 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Cheblinхочется поговорить о эффективности Exceptions? не надо себя сдерживать. Ну раз "не сдерживать" ))) Зачем в реальные проекты тащить 100500 ново-модных классов и концепций, которые мало чем помогают - лично я не понимаю. 1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date. Простейшие требующиеся по бизнесу операции в РАЗЫ и НА ПОРЯДКИ ( 3-5, до десятков) раз медленнее. Конвертация между различными code page, поищите в гугле, кому не хватает производительности, народ аж через Unsafe извращается (((( 2) Стандартные коллекции с атомик типами в бохсинге - перерасход ресурсов в разы (если большие коллекции данных, например для вычислений, то нормальные атомик коллекции - просто день и ночь по сравнению со стандартными), банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0). 3) Стримы... Ну видел я стримы в реальном проекте. Сказать, что бы код был более читабельный, нет, не сильно читабельный. Компактный... ну да, вместо 10 строк цикла, 2-3 строки на стримах.... Только, если Java код с циклом по ArrayList оптимизирует (JIT избавляется от array bound чекинг), то на стримах, легким движением руки, весь проход по коллекции оказался через "универсальный" iterator + array bound чекинг во весь рос - потяря производительно опять таки в разы (приложение: высоко нагруженный сервис). Понятно, что это была ошибка программиста и на стримах (в конкретных случаях) тоже код можно переписать так, что бы использовался специализированный интератор - только требования к знаниям стримов и опыту программиста уже становятся на порядок выше. 4) Гугле ProtoBuf - а кто нибудь из разработчиков вообще сам его запускал? Под каким нибудь профайлером? Создавать при де-сериализации ровно столкько же фабрик, сколько и элементов в коллекциии.... Бл.... Я когда на это наткнулся, мне вспомнились слова одного из начальников "человек который такое написал, должен был бы пойти в лес и закопаться". 5) ByteBuffers - документация заявляет, что создан для того, что бы при IO уменьшить кол-во копирований память-память. Реальные библиотеки (Apache HTTP Components) - все с точностью до наоборот. Т.к. обрашение к элементу в ByteBuffer на порядки дороже, чем к byte[] (уже упоминаемый мною array bound check + возможно native call), то одно сплошное "туда-сюда-обратно, тебе и мне приятно" (уже упоминаемое множ конвертация кодовых страниц String'а). 6) Лямбды - конечно круто и местами, удобно. Только про обработку эксепшенов в 99% забыли начисто. 7) когда работал на последнем Java проекте и читал И-нет, просто поразился, в скольких разных проектах и в скольки местах используется класс Unsafe... п...ц.... при многопоточном программирование - почти в любой серьезной либе, в каждом классе, по нескольку раз. IMHO На самом деле, давно уже назрело полно изменений, которые требуют значительного пересмотра концепций языка. И включение в стандарт JRE/JIT. Но пока вместо этого - костыль на костыле и подпорка на подпорке. Поскольку язык живет уже давно, уже стали появлятся костыли которые подпирают подпорки и подпорки которые костылят старые костыли ((( Optional - одна из таких подпорок и костылей. Если без него не обойтись, то да, нужно/приходится использовать (я пока с этим не сталкивался) . Но тащить костыли в проекты и использовать их везде, где только можно, лично мне не понять. Все по улицам ходят с палочками для селфи... и мы будем... и пофиг, что у нас даже смартфона нет, зато палочка для селфи - есть! Круто! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:31 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никExceptions, null - это все side-effects, которых надо избегать, чтобы иметь мало-мальскую возможность "reason about code", к сожалению формат форума не подразумевает чтение лекции, в которой можно было бы обьяснить что это и главное, зачем это. Отличие scala - в том что Option там это монада. Грубо говоря это абстракция, или контекст в котором происходит цепочка вычислений, результат следующего зависит от предыдущего. В каждой монаде запрограммировано как обрабатывать нестандартные результаты(отсутствие результата или неправильное значение и тд) и контекст сам решает как быть дальше, программисту просто надо писать бизнес-логику. В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None. Не понял, почему exception и null это side-effects Exception это банальная возможность прервать обработку и вернуть ошибку не взирая на глубину вложенности вызова (замена longjump в старом C), т.е. IMHO ровно один в один как Вы описываете "В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None" Чисто концептуально. Scala не знаю и даже не видел. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:38 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevCheblinNone А что такое None и зачем быть готовым к его обработке? например в ф-ции: Код: java 1. 2. 3.
Чем None лучше/хуже, чем выход за Integer.MAX_VALUE, Integer.MIN_VALUE ? None(в других языках, не Java) лучше тем, что он ЯВНО описывает что что-то могло пойти не так, в случае же Integer.MIN_VALUE это банальный Integer, неотличимый для компилятора и программиста от Integer i = 0; По идее это должно давать более типобезопасный код, переводя некоторые проверки на уровень компилятора и это круто, ведь мы не любим javascript, так? Другое дело как это реализовано в Java ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:49 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Гугле ProtoBuf ловите наркомана он ProtoBuf запускал.... ;) именно поэтому и появился https://github.com/cheblin/BlackBox] BlackBox не мой взгляд лучшее, что могло бы случиться с java уже произошло - SCALA. но на данном форуме, это вероятно экстремизм. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing. В общем, вещь явно совершенно не бесплатная IMHO Только потому что java-компилятор не умеет инлайнить такой синтаксический сахар. Да и в принципе аргумент такой с натяжечкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevCheblinхочется поговорить о эффективности Exceptions? не надо себя сдерживать. Ну раз "не сдерживать" ))) Зачем в реальные проекты тащить 100500 ново-модных классов и концепций, которые мало чем помогают - лично я не понимаю. 1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date. Простейшие требующиеся по бизнесу операции в РАЗЫ и НА ПОРЯДКИ ( 3-5, до десятков) раз медленнее. Конвертация между различными code page, поищите в гугле, кому не хватает производительности, народ аж через Unsafe извращается (((( 2) Стандартные коллекции с атомик типами в бохсинге - перерасход ресурсов в разы (если большие коллекции данных, например для вычислений, то нормальные атомик коллекции - просто день и ночь по сравнению со стандартными), банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0). 3) Стримы... Ну видел я стримы в реальном проекте. Сказать, что бы код был более читабельный, нет, не сильно читабельный. Компактный... ну да, вместо 10 строк цикла, 2-3 строки на стримах.... Только, если Java код с циклом по ArrayList оптимизирует (JIT избавляется от array bound чекинг), то на стримах, легким движением руки, весь проход по коллекции оказался через "универсальный" iterator + array bound чекинг во весь рос - потяря производительно опять таки в разы (приложение: высоко нагруженный сервис). Понятно, что это была ошибка программиста и на стримах (в конкретных случаях) тоже код можно переписать так, что бы использовался специализированный интератор - только требования к знаниям стримов и опыту программиста уже становятся на порядок выше. 4) Гугле ProtoBuf - а кто нибудь из разработчиков вообще сам его запускал? Под каким нибудь профайлером? Создавать при де-сериализации ровно столкько же фабрик, сколько и элементов в коллекциии.... Бл.... Я когда на это наткнулся, мне вспомнились слова одного из начальников "человек который такое написал, должен был бы пойти в лес и закопаться". 5) ByteBuffers - документация заявляет, что создан для того, что бы при IO уменьшить кол-во копирований память-память. Реальные библиотеки (Apache HTTP Components) - все с точностью до наоборот. Т.к. обрашение к элементу в ByteBuffer на порядки дороже, чем к byte[] (уже упоминаемый мною array bound check + возможно native call), то одно сплошное "туда-сюда-обратно, тебе и мне приятно" (уже упоминаемое множ конвертация кодовых страниц String'а). 6) Лямбды - конечно круто и местами, удобно. Только про обработку эксепшенов в 99% забыли начисто. 7) когда работал на последнем Java проекте и читал И-нет, просто поразился, в скольких разных проектах и в скольки местах используется класс Unsafe... п...ц.... при многопоточном программирование - почти в любой серьезной либе, в каждом классе, по нескольку раз. IMHO На самом деле, давно уже назрело полно изменений, которые требуют значительного пересмотра концепций языка. И включение в стандарт JRE/JIT. Но пока вместо этого - костыль на костыле и подпорка на подпорке. Поскольку язык живет уже давно, уже стали появлятся костыли которые подпирают подпорки и подпорки которые костылят старые костыли ((( Optional - одна из таких подпорок и костылей. Если без него не обойтись, то да, нужно/приходится использовать (я пока с этим не сталкивался) . Но тащить костыли в проекты и использовать их везде, где только можно, лично мне не понять. Все по улицам ходят с палочками для селфи... и мы будем... и пофиг, что у нас даже смартфона нет, зато палочка для селфи - есть! Круто! Ну вот да, по нмогим пунктам согласен, но это не вина концепции, а вина тех кто криво перетаскивает функциональность из ФП в императивную Java + попытка сохранить backward compatibility ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:52 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНе понял, почему exception и null это side-effects Exception это банальная возможность прервать обработку и вернуть ошибку не взирая на глубину вложенности вызова (замена longjump в старом C), т.е. IMHO ровно один в один как Вы описываете "В случае Option - если какая-то из функций цепочки вернет None(индикатор отсутствия результата) то вычислять цепочку далее бессмысленно, и результатом всего выражения будет None" Чисто концептуально. Scala не знаю и даже не видел. Exceptiion является side-effect именно потому, что он влияет на control-flow программы непредсказуемым образом, "чистые" функции из ФП, всегда должны возвращать некое значение(зависимое от инпута, и при чем одно и тоже для одного и того же инпута). Поэтому в ФП не кидают эксепшен, а возвращают Either[Result, Exception]. По сути Either это развитие концепции Optional, только он описывает не только что "что-то пошло не так", а может вернуть либо значение либо описание ошибки. И именно поэтому в стримах никаких Exception нет, и не может быть by-design. null - это не сайд эффект, тут я не был точен. Просто наличие null расхолаживает девелопера, когда не знаешь что делать - верни null, быстрый костыль, который потом забывается убраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Cheblinне мой взгляд лучшее, что могло бы случиться с java уже произошло - SCALA. но на данном форуме, это вероятно экстремизм. В скале хватает своего WTF, но то что прочищает мозги и заставляет посмотреть на программирование с другой стороны - это да. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 18:59 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никCheblinне мой взгляд лучшее, что могло бы случиться с java уже произошло - SCALA. но на данном форуме, это вероятно экстремизм. В скале хватает своего WTF, но то что прочищает мозги и заставляет посмотреть на программирование с другой стороны - это да. При ФП нет состояния. Для меня это непреодолимый рубеж)). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 19:19 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123забыл никпропущено... В скале хватает своего WTF, но то что прочищает мозги и заставляет посмотреть на программирование с другой стороны - это да. При ФП нет состояния. Для меня это непреодолимый рубеж)). Состояние - зло, боишься копий? Ну раньше тоже боялись уходить от HttpSession, а поди ж ты как оно сейчас ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 19:22 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никТолько потому что java-компилятор не умеет инлайнить такой синтаксический сахар. Да и в принципе аргумент такой с натяжечкой. Так он же не "синтаксический сахар". Это просто класс и экзепляр класса в куче (память, перформанс) На правах бреда: Сделали бы реальный "синтаксический сахар", взяли бы например стандартное C'ное обозначение ->, но не NPE кидали, а просто возвращали бы null. Хотя не очень понятно, что возврашать, если результат атомарный тип String s = billsCollection->findById( billId )->getCustomer()->getAddress()->getStreet()->getName()->toString(); Было бы и удобно и лаконично (хотя с точки зрения синтаксиса, было бы удобнее наоборот: при -> кидать NPE, а при . не кидать ((( ) Для работы с атомарными типами, можно было бы ввести операцию .? int i = address -? getHouseNumber() : 0; + разрешение на exception int i = address -? getHouseNumber() : throw new NullPointerException(); + длинная запись операции -> Street street = address -? getStreet() : NULL; С Optional же, все осталось по старому. Много букв + мусор в heap ((( Работа выполнена успешно, положительный результат не достигнут ( C ) забыл ник.... "чистые" функции из ФП, всегда должны возвращать некое значение(зависимое от инпута, и при чем одно и тоже для одного и того же инпута). Поэтому в ФП не кидают эксепшен, а возвращают Either[Result, Exception]. По сути Either это развитие концепции Optional, только он описывает не только что "что-то пошло не так", а может вернуть либо значение либо описание ошибки. И именно поэтому в стримах никаких Exception нет, и не может быть by-design. ... На мой взгляд, это и называется "костыль" - У нас все ф-ции чистые! - Но у меня не получается (( У меня ф-ция грязная ((( - Не беда! Заверните грязную ф-цию в чистое полотенце, она будет считаться чистой ! 100% костыль ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 19:35 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНу раз "не сдерживать" ))) ... 1) Иммутабельные объекты, это конечно круто - но это же полнейший п....ц производительности на банальных операциях. Что java.String, что java.Date. ... банальные проверка и арифметика с датами - на иммутабельных датах, так же полный писец (переписал на мутабельные JodaDate скорость улучшилась на порядки, потребление памяти стало равно 0). Стоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные . Вы уверены, что сделали правильные выводы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 19:59 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
ДиезСтоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные . Я имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object ))) Т.к. в старых ни тайм зон, ни нормальной арифметики. В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел. Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовал ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 20:40 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevТак он же не "синтаксический сахар". Это просто класс и экзепляр класса в куче (память, перформанс) Он то есть, в Java. Мне в принципе непонятно почему до сих пор этот боксинг\автобоксинг и враппинг не инлайнится. Сколько раз вам нужен был объект Integer именно как объект? А не враппер над примитивным типом? В той же scala опять же нету примитивных типов, есть тип Int с кучей методов, но компилятор умный, и транслирует все в JVM-ный int, в коде красота, в хипе порядок. То же самое можно сделать и с Optional и т.д. Leonid KudryavtsevНа правах бреда: С Optional же, все осталось по старому. Много букв + мусор в heap ((( Работа выполнена успешно, положительный результат не достигнут ( C ) Так по поводу java-шного optional я и не спорю, просто я знаю как оно должно работать в принципе(концепт) и его реализация в java вызывает недоумение. Leonid KudryavtsevНа мой взгляд, это и называется "костыль" - У нас все ф-ции чистые! - Но у меня не получается (( У меня ф-ция грязная ((( - Не беда! Заверните грязную ф-цию в чистое полотенце, она будет считаться чистой ! 100% костыль ))) В JVM да, именно из-за наличия null и exceptions наследия трудно быть в чем-то уверенным, если не пишешь все сам:) Но это не проблема подхода в целом, это проблема реализации ФП-ных плюшек в Java. Scala тоже страдает из-за этого кстати, но в меньшей степени. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 20:48 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никPetro123Я предлагаю не мешать функциональный ЯП и не функциональный. Нахрена приводить языки где null нет или логика с null не используется? Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования? Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет Уже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока. http://openjdk.java.net/jeps/305 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 20:54 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonзабыл никпропущено... Так нахрена совать ФП концепт(Optional, Stream..) в сугубо императивный язык программирования? Это был риторический вопрос, реалии таковы, что ФП идеи просачиваются в ООП языки, а не наоборот, ну и если делаете новые фичи, ну так делайте нормально. Есть подозрение что pattern-matching тоже кривой будет Уже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока. http://openjdk.java.net/jeps/305 Та я в курсе:) Читал Шетца еще полгода назад, аналога case классов вводить в Java не собираются, как и алгебраические типы данных, а в сочетании АДТ и паттерн матчинга вся соль. Будет также как и с опшионал без монад:) Ну посмотрим как оно в итоге будет конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 20:57 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevДиезСтоп-стоп! Строго наоборот - стандартный java.util.Date - мутабельный . Объекты из Joda Time - иммутабельные . Я имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object ))) Т.к. в старых ни тайм зон, ни нормальной арифметики. В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел. Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовал Ок, убедили ) Если не секрет, каким классом задач вы занимаетесь? Мне давно не требовался такой уровень оптимизации для задач. Последнее, что помню - FastUtils для примитивных коллекций, да и то потом перетащили на нативный inmemory движок через shared memory. Для текущих бизнес-задач предсказуемость поведения важнее производительности внутри процесса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА если говорить об эффективности, то это "синтаксический сахар" который фактически приводит еще к одному уровню boxing/unboxing. В общем, вещь явно совершенно не бесплатная IMHO Я поспешу вас успокоить. Разумеется мы понесем свою плату за еще один паттерн. Но давайте вспомним фразу которую сказал один участник несколько страниц назад. Код: java 1.
Это суммарная цена. Но я-бы сюда еще добавил наши с вами репутационные потери. Когда наш код который писали мы, внезапно обнаруживает пустой объект вместо ожидаемого непустого - то фраза "обосрались" - это самая мягкая фраза которую мы можем сказать. Уже прошло без малого 100 лет со времен Алана Тюринга но мы позволяем себе допускать подобное. Это - роспись в некомпетентности. А теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary, Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится мне эта пропорция. Но если вы не согласны - я готов заслушать вашу оценку. По перформансу. Разумеется мы не экстремисты и не собираемся покрывать опшенами системные и другие библиотеки. Я-бы покрыл меж-модульное взаимодействие. Везде где есть некая граница где ходят бизнес объекты. И я вангую что на самом деле потери на этом у нас будут небольшие. 1-5%. Потери на тернарный оператор завёрнутый в коробочку. Сюда еще можно добавить расходы на GC, но они у нас уже учтены в количестве продуцируемых бизнес-объектов в коробочках. Графов и циклических ссылок на опшенах не предвидится. GC справится с ними. В 1 шаге достижимости от бизнес-объекта. Тоесть 1-5 % нагрузки CPU - это тот налог который я готов заплатить за стабильность. Давайте также вспомним что компиллятор умён и уже умеет делать прозрачными getters/setters. Он умеет покрывать интринзиками наиболее горячие системные вызовы такие как java.lang.String::substr() e.t.c. И если действительно так выйдет что Option - горячий объект. И это объект пространства имен java.lang то я думаю что регулировка перформанса на нём будет выполнена на другом уровне. Возможно даже в компилляторе. А вот чего я-бы точно не стал делать - так это переписывать код который уже есть и протестирован. Тут как-бы ясно. Я - достаточно ленив в этом плане. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:14 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonУже зареган джеп. От самого Брайана Гоетца. В статусе кандидата пока. http://openjdk.java.net/jeps/305 По мойму, какой-то бред. if, case с проверкой на тип - это какой-то говнокод ((( IMHO ((( В ООП парадигме или общую логику (в примере Brian Goetz форматирование обхекта для вывода) надо выносить в предка (пример Object.toString() ), или, тогда уж, делать перегрузки операторов/функций наподобие << и >> для потоков ввода-вывода в C++. Т.е. a la генерик классы/методы, но наоборот. Перегруженные классы/методы (к сожалению глобальных ф-ций в отличие от C нет), конкретная реализация которых определяется в RunTime по реальному типу параметров. В C++ вроде такое можно. Появился новый тип(класс), для которого нужно добавить правило форматирования. Создал имплементаци/перегрузку класса Formatter. Существующий код его подхватил. Не нужно добавлять еще одни ветки if или case в сущ. программу. Своего рода, получились бы динамические plugin'ы на уровне языка. Но не понятно, как описывать это компактно (т.к. каждый раз делать класс - крайне много букв). Ну и как-то приходим к JavaScript'у ((( т.к. по правильному, весь код Brian Goetz можно было бы сделать в виде HashMap<Class, Formatter>, зарегистрировать форматтеры для каждого типа/класса и весь код свести к return (Formatter)configuration.get( val.getClass() ).formatValue( val ); IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:28 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevт.к. по правильному, весь код Brian Goetz можно было бы сделать в виде HashMap<Class, Formatter>, зарегистрировать форматтеры для каждого типа/класса и весь код свести к return (Formatter)configuration.get( val.getClass() ).formatValue( val ); IMHO & AFAIK Мыслите в правильном направлении. Но тут все еще интереснее, ООП и ФП по сути дуальны, есть такая задача, называется Expression Problem, она о том, как много надо усилий чтобы писать расширяемый код. ООП идет по пути - все операции описывать в интерфейсе, а имплементации добавлять в сабклассы. Таким образом легко расширить имплементации, но архисложно добавить новую операцию. В ФП все ровно наоборот. Там нет стейта, и entities это просто сборище полей без логики(привет anemic model), в таком случае паттерн матчинг самое оно. Любая операция это по сути паттерн матчинг на всем множестве типов(гарантировано компилятором) и операции соотвественно добавлять легко, а вот тип данных добавить сложно, ибо надо модифицировать все операции. На самом деле все решаемо как в рамках ООП(Object Algebra) так и ФП(Type classes), благодаря которым можно добавлять как новые имплементации так и операции не меняя существующий код. К чему сей пассаж. А к тому что паттерн матчинг - моджно стильно молодежно, НО в ФП языках, где он действительно дает преимущества и нужен, а тут опять тянут абы было:) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:40 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonто фраза "обосрались" - это самая мягкая фраза + плюсуюсь когда разрабатывал под Oracle CC&B, мы грустно шутили, что в Java существует только одна ошибка: Null pointer exception никаких других ошибок от приложения - мы даже и не видели ((( maytonА теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary, Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится мне эта пропорция. С цифрой 80% я согласен. Но вот с ее интерпретацией. Т.к. 20% от "обосрались" == "обосрались" Запашок уже есть, в приличный ресторан/ночный клуб/бордель уже не пустят Тут, что 100%, что 20% - одинаково. maytonТоесть 1-5 % нагрузки CPU - это тот налог который я готов заплатить за стабильность. Да хоть 50%. Проблема в том, что от "обосрались" с Optional мы не избавимся. Те же проверки, только вид с боку. Был null, теперь будет null вложенный в Optional. Была ошибка Null Pointer Exception, будет ошибка NoSuchElementException. (смотрю доку по Optional: get() - If a value is present in this Optional, returns the value, otherwise throws NoSuchElementException.) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:47 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
забыл никК чему сей пассаж. А к тому что паттерн матчинг - моджно стильно молодежно, НО в ФП языках, где он действительно дает преимущества и нужен, а тут опять тянут абы было:) Я скажу честно что целиком я не читал идею Брайена. Паттерн матчинг видел в Scala. Но из опыта Java могу предположить что создатели очень-очень неохотно меняют language во взаимодействии с текущим статусом виртуальной машины. Яркий пример - Java Generics. По сути это вообще никакие не Generics а просто дополнительные уровни строгости в фазе компилляции. JVM при этом остаётся в неведении относительно собранного в бинарник generic. Switch со строковым аргументом шёл очень долго. Ничто не мешало его запилить в ранних версиях. Но очевидно кто-то очень сильно хотел взаимного однозначного соответствия байткода и исходника. Машинная инструкция tableswitch - тому подтверждение. Она работает с целыми числами. Подозреваю что с паттерн матчингом будет таже-история. Сделать-то может сделают но будет какой-то ограниченный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 21:56 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Главное, не понятен сокральный смысл null в Java В C, NULL это просто.... 0 (НОЛЬ!). Стандартное значение для непроинициализированного указателя. В Java, не проинициализированных переменных быть вообще не может, попытка обращения к непроинициализированной переменой, ошибка на этапе компиляции. То что же такое null в Java? Может его вообще просто из языка исключить? Не будет такого слова, не будет и проблемы ))) По факту, если программист написал процедуру, которая возвращает null, задача программиста этот возврат проверить. Никакой Optional ничего не поменяет. Если процедура вернула Optional, задача программиста проверить есть ли значение в данном Optional. Проблема то только в том, что сейчас кода стало очень много. Вот я никогда длинную портянку через точку ни пишу. Но сейчас, 100500 вызовов через точку, общепринятый стил (например паттер Builder) ((( Понятно, что при таком стиле, NPE стали проблемой. И не только само NPE, но еще и локализация его место возникновения. (т.к. ссылки на строчку в коде уже не достаточно). Пока программы писали олд скульные разработчики, null и NPE особо никого не нервировали. Как только код программы стал "паттерн на петтерне, геттер на геттере, стильно модно молодежно" NPE стали валится в самых неожиданных местах. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 22:03 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Ну есть класс проверок которые компилятор видит. Это "восклицательный знак" возле декларации типа в шарпах о котором так эмоционально говорил микрон. Но что делать с динамикой? Что делать с кодом который появится только в рантайме? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2018, 22:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В C, NULL это просто.... 0 (НОЛЬ!). Стандартное значение для непроинициализированного указателя. нет. Стандартное значение для непроинициализированного указателя, рандомный мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 02:50 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЯ имел в виду "новые" из пакета java.time, а не "старые" из java.lang.Object ))) Т.к. в старых ни тайм зон, ни нормальной арифметики. В Joda Time - два комплекта классов. Иммутабельная + мутабельная версии на самом деле, в принципе, я в результате почти всю арифметику на long в миллисикундах перевел . Честно говоря, сейчас даже не очень вспомню, зачем мне Joda Time в вычислениях был нужен... но зачем-то использовалБгг, не удивительно. До java.time.* в жаве единственный нормальный способ работы со временем был java.util.Calendar, при этом java.util.Date вообще какое-то недоразумение - внутри у нее часовой пояс есть, а API для его смены нет, т.е. если вы пытались сделать какую-то нетривиальную арифметику на java.util.Date, то остается только посочувствовать. Что произошло после появления java.time.*? Да ничего нормального не произошло, а именно: - все преобразования все равно нужно через long (java.time.Instant) делать - еще нужно за смежными модулями следить (ну вот не умеет старый оракловый jdbc-драйвер биндить новые типы правильно, т.е. его нужно или обновлять, что не всегда возможно, или говнокодить) Вообщем приобретение Sun Ораклом таки сказывается, при этом негативно: движение есть - результата нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 07:34 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме? Не пойму. Это ведь логика программы. Это задача программиста. Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист. От этого нет защиты как от деления на ноль. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 07:36 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Petro123maytonНо что делать с динамикой? Что делать с кодом который появится только в рантайме? Не пойму. Это ведь логика программы. Это задача программиста. Значит код пошел не предсказуемым образом как ПЛАНИРОВАЛ программист. От этого нет защиты как от деления на ноль. В коде всегда есть интерфейсы которые реализовывал кто-то другой. В использовании мы обычно оптимисты. Мы , когда прототипируем , всегда полагаем что string это строка и Никаких других состояний быть не может. Мы считали что контракт сильный. И мы - не параноики чтобы каждый раз ставить проверки условия кажущуюся очевидность. Мы - в меру ленивы. Что даёт optional? Молчаливое напоминание. Напоминание а том что есть варианты. Варианты волучения нашего string. get с генерацией нового класса исключений. getOrElse где мы обязаны указать альтернативу. orElseGet с указанием функции разрешения опционала. orElseThrow с указанием функции генерации нашего типа исключения в зависимости от ситуации. Разумеется я не тешу себя иллюзиями по поводу того что программист правильно выберет нужный метод вскрытия коробочки. Но протокол получает определенные критерии строгости. Обычное разыменование (string)nulll уже не работает. Работает коробочка. Самый первый метод требует предварительной проверки isPresent. По крайней мере среда разработки это видит. Кстати sonarqube и findbug обладают слепотой относительно анализа использования интерфейса реализация которого неизвестна в фазе компиляции. Они также считают что поставщик всегда вернет что то непустое. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 08:17 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Диезmikronпропущено... покажи: где детская болезнь? 1. Null нельзя использовать в цепочке вычислений, получим NPE в случае отсутствия значения. Первый аргумент уже опровергнут примером. Займёмся вторым. Диез2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения) Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:08 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
BlazkowiczДетский сад, вторая четверть. Ваша истерика нам очень важна. Пишите ещё. Мы тут аргументами и логикой занимаемся а не моралью. Проповеди - мешают. проходи мимо, если нечего сказать по делу. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:18 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mayton Код: java 1.
Чистый PR. Звучит красиво: "мы нашли 1М$ ошибку" или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта. maytonА теперь цифры. Как вы думаете? Какой % потенциальных NPE мы закроем если будем внедрять Options в наши новые бизнес сущности такие как скажем Dao, Repositary, Entity/DTO/Pojo. Мне кажется.... 80%. Почему 80? Не знаю взял 4 к 1. Нравится мне эта пропорция. Но если вы не согласны - я готов заслушать вашу оценку. Реально - 0. Люди как совершали ошибки так и будут их совершать. Компилятор (машина) в данном случае им нечем помочь не может. Оптинал сам - обьект и подвержен тем-же опасностям. Я так думаю: если бы Оптионал был всегда, с самого первого дня, то можно было бы отверждать и требовать что любое возврашаемое значение из функции обязателно сушествует. Это позволило бы избежать ненужных проверок в вызываюшем коде если метод возврашает тип а не оптионал<тип>. Другими словами можно было бы утверждать Код: java 1. 2. 3. 4. 5.
Метод getName всегда возврашает значение. И проверок на наличие значения в вызываюшем коде не делать. Метод getNickname имеет оптионалное значение. Проверки нужны. И компилятор мог бы это проверять. Другими словами плюс Optinal был бы втом что есть "не оптионал". Но сейчас есть куча кода кототрый уже никто не будет переписывать. Есть куча методов которые возврашают null. Следовательно нельзя обеспечить соблюдение первого утверждения. И таким образом сейча плюса - нет. А вот минусы в потреблении пямяти и циклов процессора есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:02 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronЧистый PR. Звучит красиво: "мы нашли 1М$ ошибку" или "мы исправили1М$ ошибку". Хочется каждому дать премию и повесить на доску почёта. Боже, какой бред. То есть ты даже не потрудился почитать статью? Какой, в дырку от бублика, пиар. Речь о том что если бы в null reference изначально распознали бы вселенское зло ещё в далёком 1965 году, то это могло бы съэкономить массу времени в современной разработке. https://en.wikipedia.org/wiki/Tony_Hoare Это даже к Java отношения не имеет. Зачем так кичиться своим невежеством мне не совсем понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:29 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonВ коде всегда есть интерфейсы которые реализовывал кто-то другой. В использовании мы обычно оптимисты. Мы , когда прототипируем , всегда полагаем что string это строка и Никаких других состояний быть не может. Мы считали что контракт сильный. И мы - не параноики чтобы каждый раз ставить проверки условия кажущуюся очевидность. Мы - в меру ленивы. Почему мы полагаем, что String это строка? Только потому, что разработчики Java заявили, что ponter'ов у них нет, а на самом деле, Object / String это тот же поинтер только "вид сбоку" С атомарными типами, у нас же такой проблемы нет. Хотя, и в атомарных типах может быть null ))) например Double.NaN, чем не аналог null'а ? maytonЧто даёт optional? Молчаливое напоминание. Напоминание а том что есть варианты. Варианты волучения нашего string. Это какой-то язык для дебилов получается. Сделайте программу которой сможет пользоваться даже идиот и только идиот будет пользоваться вашей программой ( C ) Вот я ожидаю, что по контракту метод getInn() вернет строку ровно в 10 символов и только цифры. И так как я в этом уверен, то потом к этим символам буду обращаться напрямую по индексу и ожидать только символы 0..9. И Optional мне никак не поможет защититься от строки в 9 символов, т.е. я все равно получу null pointer exception (или array out of bound) только парой строчек ниже. Или строгая типизация во всем или это какая-то "обосрались на 20%" ((( maytonget с генерацией нового класса исключений. getOrElse где мы обязаны указать альтернативу. orElseGet с указанием функции разрешения опционала. orElseThrow с указанием функции генерации нашего типа исключения в зависимости от ситуации. Чем это отличается от обычного и стандартного if ? Т.е. мы предполагаем, что дебил-программист написать стандартный if - поленится, а написать orElseGet не поленится? Проблема же не в том, что человеку жаль написать if. Проблема в том, что СОВРЕМЕННЫЕ средства (раньше такая проблема была значительно сглажена), приводят к огромным цепочкам через ".". Например какой нибудь Hibernate. String streetName = getBillById( billId ).getCustomer().getAddress().getStreet().getShorName(); Совершенно осмысленная конструкция, вероятность которой в современных программах крайне высока. И обычный "нормальный" программист готов добавить проверку streetName на null, но делить ВСЮ цепочку вызовов на кусочки и проверять каждый шаг - явно не готов. Почему я говорю, СОВРЕМЕННЫЕ средства. Раньше, когда все классы создавали "ручками", проблема была значительно менее острая. 1) Не было такой глубины вложенности классов. Нормальный человек, в этом случае, просто бы поля адреса кустомера прямо бы в Bill и "вхерачил". Т.к. "ручками" создавать такую клюкву классов, ему было бы лениво 2) В данной конструкции и структуре классов совершенно явно нарушен принцип инкапсуляции. (ну не считать же get/set методы за инкапсуляцию?). А теперь перепишите вышеприведенную строчку на Optional )))) - это же совершенно ничитабельная помойка получится ((( Я вот с ходу даже переписать не могу ((( т.ч. не понимаю, что в getOrElse() указывать нужно ((( 95% NPE с которыми сталкивались в Oracle CC&B 1. Длинные простыни через "." при обращение к полям базы через Hibernate. Какое-то поле в БД не заполнено, получили NPE 2. Аналогичные простыни при работе с DOM XML. Какую-то ноду или элемент в XML пропустили, получили NPE При этом, проверка на null НА ВХОДЕ функции и НА ВЫХОДЕ ф-ции - обычно присудствует. Но делать проверку по всем простыням "." - это действительно умопомрочительно. IMHO Вот реально, банальный оператор a->b являющийся синонимом конструкции ( a!=null ) ? a.b : null в 95 % случаев, был бы совершенно достаточен и реализовать легко. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Интересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора. В kotlin есть какой то сахар по усилению проверок на использование null. Вечером посмотрю. Ну... В scala тоже что то было. Вобщем если рассматривать java не как яп. А как платформу с семейством языков то защита от NPE имеется. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:38 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronДиез2. null совместим по типу с любым reference-типом по определению, и проверка на null полностью лежит на программисте. С другой стороны String и Optional<String> - это два разных, несовместимых типа, поэтому потребуется явное приведение между ними (просто не получится "забыть" проверить на отсутствие значения) Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. Нет, не логично. Тип типом, значение значением. 1) В СУБД, практически у любого типа может быть значение NULL. Но (в большинстве случаев) информация про тип при этом сохраняется и все операции допустимые для данного типа - остаются валидны. Попытка выполнить операции над объектом со значением null - какой-то результат, правда не всегда очевидный, 2) В Java, null это указатель в пустоту. Объекта нет. Никакие операции над объектов не допустимы ((( В Java попытка выполнить операцию над объектом со значением null - Null Pointer Exception. Вот смотрю доку на Optional, и вижу, что он обеспечивает гарантию выполнения только одной операции - equals(....). Как-то совсем ни о чем ((( Все же другие операции над объектом, как нужно было обрамлять if, так и нужно будет и с Optional. (синтаксис изменился, но суть то осталась та же. Тот же if который нужно кодировать руками) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonИнтересно что в c/c++ раньше различали null pointer и wild pointer. Как бы два состояния. Щас наверное зависит от компиллятора. Да никак. wild pointer - вещь мне кажется встречающаяся не часто static (глобальные переменные) и члены класса - всегда по умолчанию инициализируются null'ом. Или в момент старта программы (сегмент данных просто инициализируется нулем) или в дефолтном конструкторе Pointer'ы в структурах WinAPI - общепризнанный способ из MS документации, изначально заполнять структуру нулями memset'ом. остаются только локальные переменные ф-ции - но их обычно не много, они долго не живут, программист за ними сам следит IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 12:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Боюсь, что задачи обработки null в бд и в яп совершенно разные. Там кортежи и null полноценная операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 13:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevmikronпропущено... Помоему логично - если обьекта нет то о типе обьекта не может быть речи. Глупо рассуждать о типе теста в дырке от бублика. Но это обстрактно. Покажи на примере что ты имееш в виду. Нет, не логично. Тип типом, значение значением. Интересно однако. Вот тут какой тип у переменной cc? И какое значение? Код: java 1.
А вот тут? Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 13:56 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Во всех случаях jvm будет видеть objectref. Коллекция объектов внутри будет представлена более сложным образом. Зависит от имплементации. Но сами объекты также будут представлены такими же ссылками. Впрочем.. Это я нагнетаю. Для старта дискуссии. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 14:32 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПочему мы полагаем, что String это строка? Только потому, что разработчики Java заявили, что ponter'ов у них нет, а на самом деле, Object / String это тот же поинтер только "вид сбоку" С атомарными типами, у нас же такой проблемы нет. Хотя, и в атомарных типах может быть null ))) например Double.NaN, чем не аналог null'а ? Да. String стоит особняком среди других типов. Хотя-бы потому что ему нет соответствия среди примитивов. Double.NaN - это редкое исключение из правил. Это специальная константа которая обозначает остутствие числа внутри примитива. Но к сожалению мы не сможем применить это например к целым числам byte/short/int/long. Сюда-же специальный символ который зарезервирован в С/С++. Хотя аналогия интересная. Согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 22:19 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Андрей ПанфиловБгг, не удивительно. До java.time.* в жаве единственный нормальный способ работы со временем был java.util.Calendar, при этом java.util.Date вообще какое-то недоразумение - внутри у нее часовой пояс есть, а API для его смены нет, т.е. если вы пытались сделать какую-то нетривиальную арифметику на java.util.Date, то остается только посочувствовать. Что произошло после появления java.time.*? Да ничего нормального не произошло, а именно: - все преобразования все равно нужно через long (java.time.Instant) делать - еще нужно за смежными модулями следить (ну вот не умеет старый оракловый jdbc-драйвер биндить новые типы правильно, т.е. его нужно или обновлять, что не всегда возможно, или говнокодить) Беда в том что java.util.Date создалал инженеришко Джеймс Гослинг. А он закрывал мелкие задачи связанные с кофеваркми и тостерами. Не ставил он себе глобальных задач. Не думал об иммутабельности. О глобализации. Ему - важно чтоб байт-код летал на жлобских процессорах, микроконтроллерах и даже внутри кредитной карты. В Йоде-тайм конечно всё обдумали и причесали. Но ме еще десятилетия будем выкорчёвывать из кода всякие там календари, даты, и не дай бох еще java.util.Vector. А ребята которые озабочены перформансом - вообще считают время внутри long в милисекундах. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:10 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevЭто какой-то язык для дебилов получается. Сделайте программу которой сможет пользоваться даже идиот и только идиот будет пользоваться вашей программой ( C ) Вот я ожидаю, что по контракту метод getInn() вернет строку ровно в 10 символов и только цифры. И так как я в этом уверен, то потом к этим символам буду обращаться напрямую по индексу и ожидать только символы 0..9. И Optional мне никак не поможет защититься от строки в 9 символов, т.е. я все равно получу null pointer exception (или array out of bound) только парой строчек ниже. Я для себя как-то определял семейство функций типа substr(), indexof(), e.t.c, толерантных к ошибкам. Их любая реакция на переполнения индекса была безопасной. Тоесть если вы хотите взять substr() позади диапазона исходной строки - то ошибки не будет. Будет просто пуская строка. Ну и null никогда не возвращается. Ну и я там везде логгеров понапихал. С уровнем trace. Надо подсмотреть - включил трейс. На безрыбье - и рак - рыба. Впрочем Optional - это тоже та самая рыба. Контролирует рантайм. А всякие забавные случаи статических анализов о которых так горячо говорил микрон и так среда подсвечивает и Сонар-Куб. Вобщем-то нечего там искать. Хотя как сахар - да. Я согласен что сахар иногда не помешал-бы. По поводу дебилов и всего прочего. Я положа руку на сердце тоже иногда внедряю NPE. Я очень люблю прототипирование и макеты. По любому поводу создаю. И не в модульных тестах а именно в приложениях. main() - и погнал. Разумеется в гонке за прототипом я не всегда ставлю проверки. Это уж как бох даст. Вот сейчас надо померять (оценить объем предполагаемого Lucene-индекса для логов торговых сообщений). Цена вопроса - на сколько порядков больше или меньше заказывать новые виртуалки. Меня спрашивают - а сколько надо диска? Сколько мемори? Сколько будет среднее время отклика? А я - что? Прототипирую. Смотрю. Ну сил коненчо не хватает везде if понаставить. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:31 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev95% NPE с которыми сталкивались в Oracle CC&B 1. Длинные простыни через "." при обращение к полям базы через Hibernate. Какое-то поле в БД не заполнено, получили NPE 2. Аналогичные простыни при работе с DOM XML. Какую-то ноду или элемент в XML пропустили, получили NPE При этом, проверка на null НА ВХОДЕ функции и НА ВЫХОДЕ ф-ции - обычно присудствует. Но делать проверку по всем простыням "." - это действительно умопомрочительно. Знакомая ситуация. Многоэтажные этажерки мне тоже приходилось писать. Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 23:45 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikronНо сейчас есть куча кода кототрый уже никто не будет переписывать. Есть куча методов которые возврашают null. Следовательно нельзя обеспечить соблюдение первого утверждения. И таким образом сейча плюса - нет. А вот минусы в потреблении пямяти и циклов процессора есть. Есть у меня приложение на котором гоняю бенчмарки. Текстовый CSV-файл на 5 млн строк. База MaxMind. Привязка IP-диапазонов к гео-сущностям. Города. Страны. Для него я созда сущность GeoEntity (без Options). Потом то-же самое с Options. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
В двух экспериментах я загружал CSV-файл с использованием Apache Commons CSV и ложил его в Lucene. За 120 секунд на моём ноутбуке этот файл загружался в БД и индексировался. Никакой разницы с Optional и без Optional я не обнаружил. Она вобщем-то была в рамках стат-погрешности. 1-2 секунды. Это время можно не учитывать. Это по сути случайный шум. Чисто технически имели место 5 млн * 9 полей = 45 млн. полей аллоцировано в хипе и освобождено GC. Размер исходного файла - 450 мб. Размер индекса Lucene - 300 мб. Для себя пока делаю вывод что Optional не влияет на производительность. Если кто-то скажет что влияет - welcome. Прошу бенчмарки. С описанием что и как. Задача разумеется должна быть осмысленной. Тоесть мерять надо полезную задачу + Optional а не сферический Optional в вакууме. Квантовые эффекты нам не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 00:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonЕсли не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 07:49 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonЗадача разумеется должна быть осмысленной. Тоесть мерять надо полезную задачу + Optional а не сферический Optional в вакууме. Диалог в рюмочной: - А скажите, сколько стоит капля Водки? - Ничего не стоит. - Хорошо, накапайте мне пожалуста рюмочку. Это я к чему: На фоне других операций не заметно, но когда зараза расползётся обшая производителность просядет. Только никто не заметит. это как дурной стиль программирования: в отделной операции не заметно, но если пременять глобално то эфект огромный. Скажем на отделном месте из 40 тактов 4 безполезных. значит применяя повсеместнио 10% производителности - просто горячий воздух и вклад к глобальному потеплению. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 12:40 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mikron, Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации. Optional - одно из возможных решений. От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм. Анекдот про водку - хороший. Но эти метафоры не приближают никакого решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 12:55 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonmikron, Надо решать проблемы по мере их поступления. Есть проблема. NPE. Бьет по репутации. Optional - одно из возможных решений. От тебя пока не поступило альтернативных пропозиций кроме операции "восклицательный знак" которая не покрывает рантайм. Анекдот про водку - хороший. Но эти метафоры не приближают никакого решения. Лутче чем решать проблемы - избегать проблемы. Моё конструктивное предложение: забудьте этот бред смутьянов и не делайте хуже. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 13:42 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Скажем на отделном месте из 40 тактов 4 безполезных. значит... чувствую что не туда пишу? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 14:23 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mayton.... Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html iMHO Вполне изяшно. Могли бы и в Java добавить ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 11:37 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
mayton...Для себя пока делаю вывод что Optional не влияет на производительность.... Мусор в Heap на современных процессорах начинает влиять, когда у нас сервер + несколько клиентов + требуемые совокупный eden за 1-2 Gb перебирается ((( Тогда уже тущите свет. Пауза в GC становится заметной и eden уже не увеличить. Возможно G1 коллектор спасение. Но когда я с таким стакивался, G1 еще только появлялся. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 11:42 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
В одно потоковом варианте - мусор живет в eden и никого особо не беспокоит В много пользовательском выполнение - если eden не хватает, мусор пробирается в Heap. И тут уже начинаются жалобы "Java плохой язык, все тормозит, давайте перепишем приложения на Go". В 80 % случаев, настройкой памяти тормоза убираются (банально eden выкручиваем на максимум). Но если приложение написано так, что плодит дофига мусора (((( то никакого eden может и не хватить. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 11:47 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, что такое eden ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 12:58 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
См. старое устройство Heap в Java. AFAIK (в 1.8 поменялось) young generation: Eden Space Survivor Space old generation: Tenured Generation и: Permanent Generation (non-heap) / Metaspace (java 1.8) Code Cache (non-heap) сейчас еще должна быть non-heap под приложение ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 13:44 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
В G1 garbage collector от этого ушли. Но я с G1 НЕ работал, ничего сказать не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 13:46 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, спасибо, у нас 8я версия, значит, нас не касается ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 14:21 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Герой дняLeonid Kudryavtsev, спасибо, у нас 8я версия, значит, нас не касается касается не от версии, а от используюемого GC у меня тоже была 8, но GC использовался старый, т.к. разбираться и эксперементировать с новым не было желания / распоряжения ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 14:33 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevmayton.... Я вот недавно почитал про Котлин. Если не панацея - то вполне себе решение подобных вопросов. Safe Calls. Elvis Operator. https://kotlinlang.org/docs/reference/null-safety.html iMHO Вполне изяшно. Могли бы и в Java добавить ((( Хех.. Консерваторы. Я вот думаю. Допустим мы евангелисты языка. Своего. И владеем мастер репозитарием кода. Тоесть любую фичу можем вкоммитить. А теперь вопрос. Какие идеологические причины нам могут помешать? Ну или технические. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2018, 20:01 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
maytonА теперь вопрос. Какие идеологические причины нам могут помешать? Ну или технические. Технические - лень Идеологические - тогда мы будем как Kotlin. Мы же - Java! Самойстийная Java, на всякую фигню из Kotlin не поведется. ))) +Технически - расширить типы постфиксами with null и not null. Это может потребовать менять описания формата class'ов и class loader. Т.е. нужно продумывать решение на обратную совместимость. (например всегда генерировать сразу три class файла, один оригинальный и два синонима/алиаса для with null и not null) Добавить Kotlin'овские операции, проблем не вижу совершенно. Другое дело, без расширение типов, упремся в субж данного топика ))) Т.к. вводить в спецификацию JRE (как результат операторов) генерики Optional<X> и NotNull<X> - это попахивает жутким костылем граничащим с бредом. (но лямбды тоже достаточно костыльно реализовали, но ведь пользуемся) На самом деле, т.к. исходники Open JDK и javac доступны - никто не мешает скачать и вхерачить. Вхерачить новый элвис оператор IMHO работы на пару дней ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2018, 11:29 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevВхерачить новый элвис оператор IMHO работы на пару дней ))) Но Leonid KudryavtsevТехнические - лень))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2018, 11:53 |
|
Используете вы Optional ?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevВ одно потоковом варианте - мусор живет в eden и никого особо не беспокоит В много пользовательском выполнение - если eden не хватает, мусор пробирается в Heap. И тут уже начинаются жалобы "Java плохой язык, все тормозит, давайте перепишем приложения на Go". В 80 % случаев, настройкой памяти тормоза убираются (банально eden выкручиваем на максимум). Но если приложение написано так, что плодит дофига мусора (((( то никакого eden может и не хватить. IMHO & AFAIK Вы как-то странно термин heap вставили. Как будто не туда. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:15 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2121883]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
150ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 589ms |
0 / 0 |