|
Используете вы 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 |
|
|
start [/forum/topic.php?fid=59&msg=39678439&tid=2121883]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 320ms |
total: | 506ms |
0 / 0 |