|
Используете вы 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 |
|
|
start [/forum/topic.php?fid=59&msg=39679274&tid=2121883]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 174ms |
0 / 0 |