1. Java / Говнокод #18291

    +78

    1. 1
    2. 2
    if (optional != null && optional.isPresent()) {
        ...

    Запостил: zazazazazaza, 07 Июня 2015

    Комментарии (250) RSS

    • Что не так-то? Или жаба проверяет второе условие, даже если первое зафейлилось?
      Ответить
      • Не должна - шарп точно не проверяет
        Ответить
        • Насчёт шарпа, я знаю. Вот и думаю: может быть, отсталая жаба проверяет.
          Ну и чё не так с этим кодом, если жаба всё-таки не проверяет второе условие в случае фейла первого?
          Ответить
      • Скорее всего сама архитектура, которая позволяет и null и !present. Надо или крестик снять или трусы надеть. А в самом условии говнокода нету.
        Ответить
        • А как же жавка, в которой был null, а в 8й добавили еще и "int?"?
          Ответить
          • Не, я о том, что отсутствие показывается джвумя способами:
            1) нулл
            2) флажок в объекте

            Имхо, надо что-то одно оставить.
            Ответить
            • Да, а я про то что часть кода могла быть из жавы до 8, а часть - из 8
              Ответить
        • Но опять же телепаты в отпуске, нужно больше кода
          Ответить
      • Ленивые вычисления в жабе есть. В коде, который выложен, все нормально.
        Тут ГК на тему "пофантазируйте, каким надо быть уебаном, чтобы в переменную Optional<?> optional поставить null". Например, выше по коду что-то вроде

        Optional<?> optional = someShit();
        ...
        @Nullable
        private Optional<?> someShit() { ... }


        Или такое, например:
        Optional<?> optional = rndBoolean() ? null : Optional.empty();
        Ответить
    • А в чем смысл optional? Только в том, чтобы не вылетало npe на любой метод?
      Ответить
      • доп состояние - значение не задано

        По сути - патерн special case для valueType
        Ответить
        • >доп состояние - значение не задано
          как и в null
          Ответить
          • valueType не может быть null
            Ответить
            • valueType может не содержать значения.
              Ответить
              • Я забываю, что разговариваю с идиотом

                valueType -> значение -> содержать -> всегда. Всегда.

                Ты наверное переутомился, хочешь банан?
                Ответить
                • Мудачонок, просвещайся https://docs.oracle.com/javase/8/docs/api/java/util/OptionalInt.html#getAsInt--

                  Throws:
                  NoSuchElementException - if there is no value present
                  Ответить
                  • там специально для таких как ты написано
                    Class OptionalInt

                    а класс не вельютайп ну ни как
                    Ответить
                    • По русски говорить научись, блядина.value type. Примитивный тип? Или говорящие по русски у вас ассоциируются с быдлом? Чего ж тогда в другие страны защищать их лезете?
                      Ответить
                      • kegdan в http://govnokod.ru/18291#comment289186 написал:
                        >> вельютайп

                        >> По русски говорить научись, блядина.value type.

                        Чет я не помню таких русских букв.

                        >> Примитивный тип?

                        Еще на хохлятский переведи устоявшийся термин

                        Можно еще с греческого перевести

                        Хроника - временица
                        Ипподром - конебежка
                        Библия - книга

                        Хотя у вас такой бред практиковался после оранжевой революции.
                        Ответить
                        • Это где value type - устоявшийся термин в русском языке? Как и стейт-машина вместо конечного автомата. В интернете?

                          >Хотя у вас такой бред практиковался после оранжевой революции.
                          Откуда ты знаешь, ты тогда не в детсад ходил случайно?
                          Ответить
                          • http://www.youtube.com/watch?v=hDi6EX7_IeA

                            Страшен не ты, Сема, страшно то, что тебя породило
                            Ответить
                            • Давай, школьник, бздани погромче, может, рубль подпрыгнет!
                              Ответить
                          • Пидорашка в треде, а тред в говне
                            Ответить
            • В жабе типами-значениями могут быть только примитивы. Собственные, как в шарпике, объявлять нельзя.
              Ответить
              • Я в курсе. Но это не отменяет того, что int не может быть null. Integer может, но это уже совсем другая история оболочка для инта
                Ответить
      • Чтобы не полагаться на IDE, расставляя @Nullable/@NonNull, на которые стандартному компилятору начхать.
        Если чего-то может и не быть, Optional<T> в типе скажет всё без аннотаций и излишней документации. И компилятор заставит тебя делать дополнительный шаг (get()), прежде чем ты обратишься к значению.
        Ответить
        • Ну вот только в коде ОП'а сама ссылка на optional тоже может быть null'ом :) Почему я и писал выше про крестик и трусы.
          Ответить
          • Я понял, просто пояснил рациональ введения Optional. Чтобы сильнее ощущалась бредовость происходящего в топике.
            Ответить
        • Но get() тоже может вернуть null или кинуть исключение. Что, получается, говно поменяли на мочу?
          Ответить
          • В теории можно срать в приватные поля через рефлексию и распидорасить жабий кэш интов так, что арифметика перестанет работать.
            При правильном использовании в Optional не будет пустых ссылок. Например, в Optional есть метод-конструктор fromNullable, который автоматом конвертирует null в nothing.
            Если ты дереференсишь Optional без проверки - ССЗБ, тебя предупреждали.
            Ответить
            • Дык эксепшен просто вывалится.
              Ответить
            • Дык при правильном использовании и npe не будет, я спрашивал, что поменялось?
              Ответить
              • Раньше чтобы понять, что происходит при вызове функции - исключение или возврат null - нужно было лезть в доку. С Optional понятно из типа.

                Например, у Map есть метод ValueType get(KeyType). Если ключа нет, что будет? Надо читать доку. Пистон в похожей ситуации кидает KeyError (если рассматривать его оператор [] а не метод get()), жаба возвращает null. Если бы сигнатура была Optional<ValueType> get(KeyType), то подобных вопросов не возникло бы. Особенно это приятно при ревью кода. Сразу видно, что может пойти не так, и где автор кода схалтурил на проверках.

                В функциональных языках есть удобные функции, позволяющие вместо унылых проверок isPresent() использовать более компактные варианты с map/flatMap, ориентируясь на положительный кейс, но для жабы версии <8, где нет нормальных лямбд, это не аргумент.
                Ответить
                • >нужно было лезть в доку.
                  Или навести указатель на имя функции?

                  Так это единственный плюс? "Сразу видно"?
                  Ответить
                  • > Или навести указатель на имя функции?
                    В вебе? Ты в код-ревью хоть раз участвовал?

                    Когда уже вы, идеёбы, вылезете из своего уютного мирка и поймёте, что код нужно уметь нормально писать и читать без IDE?
                    Ответить
                    • >Ты в код-ревью хоть раз участвовал?
                      А он тоьлко в вебе?

                      >Когда уже вы, идеёбы, вылезете из своего уютного мирка и поймёте, что код нужно уметь нормально писать и читать без IDE?
                      Но для этого надо выкинуть жаву нахуй. Что ж ты, жаваеб, тогда делать будешь?
                      Ответить
                      • > А он тоьлко в вебе?
                        Так участвовал или нет? Какой инструмент ты использовал? Все более-менее вменяемые и популярные инструменты веб-ориентированы. Crucible, GitHub, Gerrit, Differential, ReviewBoard.

                        > Но для этого надо выкинуть жаву нахуй.

                        Ты удивишься, но я могу неплохо писать на жабе и не только на жабе без IDE.
                        Ответить
                        • Так optional только для веб ревью придумали? :) Другие причины есть?

                          >Ты удивишься, но я могу неплохо писать на жабе и не только на жабе без IDE.
                          Я тоже хелловерд могу сбацать, но без ide жава сосет у динамических языков, а с иде - они сосут на среднекрупных проектах. Своим умением писать на жаве без ide ты в лучшем случае на проезд заработаешь.
                          Ответить
                          • > жава сосет у динамических языков
                            А динамические языки сосут хоть с иде хоть без иде. Доказано весёлой отладкой чужого серверного кода на пистоне.
                            Ответить
                            • Я ебу где ты там что отлаживал. На небольших проектах они себя вполне окупают, пока ты ide запустишь у меня уже прога рабочая будет.
                              Ответить
                              • > пока ты ide запустишь
                                За 5 секунд пишешь проги?
                                Ответить
                                • > прога рабочая будет
                                  Рабочая ровно до той ветки, в которой опечатка.
                                  Ответить
                                • В голове - да.
                                  Ответить
                                  • > В голове - да.
                                    А я только что написал в голове операционную систему, компилятор, социальную сеть и 3d игру.
                                    Ответить
                                    • Серьезно, небольшой скриптик я могу в голове примерно написать пока запускаю ide или иду к компу.
                                      Ответить
                                      • А борманд, стало быть, не может накидать в голове классы и методы пока идет к компу? Или ты думаешь что это ебать как сложно потому что не осилил ничего кроме своего пидона?

                                        Динамически языки - для мелкой питушни - типа юзерскриптов - навалил и забыл
                                        Ответить
                                        • >потому что не осилил ничего кроме своего пидона?
                                          Еще один. Кто тебе сука сказал что я больше ничего не осилил? Просто падсибя он удобнее языков со статической типизацией. О, да ты сам это и написал.
                                          Ответить
                                    • И посмотрел порно
                                      Ответить
                          • > Так optional только для веб ревью придумали? :) Другие причины есть?

                            Я уже всё написал, если непонятно, перечитай ещё раз.

                            Придумали для того, чтобы снизить вероятность случайно натолкнуться на NPE. Чтобы код, который может ничего не вернуть, декларировал эту возможность явно. Т.к. явное лучше неявного, import this. Проверку на null легко забыть. Проверка содержимого Optional естественна, её необходимость видна без всякого null-анализа.
                            Ответить
                            • Я других аргументов от тебя не слышал. А на NoSuchElementException наткнуться нельзя что ли?
                              Ответить
                              • Ты дебил или притворяешься? Ещё раз написать?

                                Optional не может предотвратить обращение к несуществующим элементам, он просто делает вероятность случайной ошибки меньше за счёт введения дополнительного типа-контейнера.
                                Ответить
                                • Забей, Ром. Питанутым и экмаскриптанутым это не понять. Вот поработает побольше с сишкой/жабой - поймёт в чем соль.
                                  Ответить
                                  • А в чём отличие? В JS пустота - undefined, в Java - null, в сишке - (void*)0. И я во всех этих языках могу вернуть её и нарваться на это полностью аналогичным образом.
                                    Ответить
                                    • В том, что optional<x> как бы намекает нам, что значение может отсутствовать, и о нём не стоит забывать (да и забыть не получится, ибо оно в x без get()'а не кастанётся). Причём сразу известно, какое именно. А не null/undefined/false/0.

                                      А NPE в жабе стараются избегать, по возможности, не юзая null. Т.е. если возвращаешь массив - просто верни пустой массив. Если значение или null - можешь вернуть optional. и т.п.
                                      Ответить
                                      • Не всегда ты по логике можешь просто вернуть пустую коллекцию.

                                        Так никто мне не ответил чем лучше optional, кроме того, что не надо лезть в доки без ide.
                                        Ответить
                                      • Но void* и Object тоже намекают на это. Не сразу, конечно, но программиста с пятилетним опытом, который ни разу не встречал с C/Java нулевой указатель, надо ещё найти.

                                        > Причём сразу известно, какое именно. А не null/undefined/false/0.
                                        Что значит "какое именно"? Там можно задавать своё значение по умолчанию? Вроде бы не я такого видел, если только не наследоваться от этого. Или это про orElse?

                                        > да и забыть не получится, ибо оно в x без get()'а не кастанётся
                                        Подождём появления на ГК отрывков кода, где будут использовать get без проверок.

                                        В общем, из-за orElse и подобных методов фича полезна, а в остальных случаях только усложнит код всякими Optional<pitux> и теми же проверками на null внутри Optional и становится чем-то похожим на принципиально разные undefined и null в жс. Только до двух пустых значений в жс додумались за неделю, а в жабе - за несколько лет.
                                        Ответить
                                        • >а в остальных случаях только усложнит код всякими Optional<pitux> и теми же проверками на null внутри Optional
                                          Ну, бля, а я о чем? Пока что это тот же null вид сбоку. Кстати а зачем в js джва типа null?
                                          Ответить
                                          • По-моему, null - это нулевой указатель на объект, а undefined - совсем пустота (где-то была статья про это: из-за этого typeof null === 'object'). Скорее всего, просто за неделю автору не удалось придумать что-то более логичное.
                                            Ответить
                                            • И что реально полезного это дает?
                                              Ответить
                                              • Да вроде бы ничего. Разве что некоторые считают, что надо возвращать null как символ намеренно возвращённой пустоты, а undefined - "само получилось".
                                                Но если null выпилить, будет только лучше.
                                                Ответить
                                        • Вы с другой планеты все чтоли?

                                          Вот два куска кода:
                                          User user = users.get(userId);
                                          printIt(user.toString());
                                          Optional<User> maybeUser = users.get(userId);
                                          printIt(maybeUser.get().toString());
                                          Где проще разглядеть потенциальную ошибку? Где проще её допустить при первом написании?
                                          Ответить
                                          • Тут каждый со своей планеты, каждый привык к своему языку или своей парадигме и считает, что он прав.

                                            В примере, что в первой части, что во второй так же просто/сложно разглядеть/допустить ошибку.
                                            Сначала программисты тренировались писать != null, теперь придётся чуть изменить написание. Но суть не изменилась, разве что IDE стала что-то подсказывать.
                                            Ответить
                                            • > Тут каждый со своей планеты, каждый привык к своему языку или своей парадигме

                                              Пока всё же складывается 2 лагеря - статическая типизация vs динамика.

                                              Приверженцы динамики не понимают усложения, т.к. они не привыкли, что есть компилятор, который проверяет типы, что можно проектировать код так, что структура программы сама мешает тебе допускать ошибки. А запомнить один универсальный == null проще, чем париться с какими-то дополнительными проверками.

                                              Рекомендую смотреть видео Yaron Minsky, квинтэссенция неплохой книжки Real World Ocaml, полезной даже тем, кто не собирается писать на Ocaml
                                              http://www.youtube.com/watch?v=DM2hEBwEWPc
                                              Сёме разрешается не смотреть - видео на английском.
                                              Ответить
                                              • В общем случае лагерей больше.

                                                Мы привыкли, что если вместо объекта типа X поставить Y, то это обнаружится на этапе запуска. Любители статической типизации узнают это на этапе компиляции.
                                                Но тут два механизма позволяют делать одно и то же: хранить либо пустоту, либо значение. В обоих случаях нельзя подставить X вместо Y, в обоих случаях можно положить null вместо значения, оба механизма ведут себя как Maybe.

                                                Пока что мне удалось услышать про намеренный возврат null. То есть это типизация в головах поддерживаемая компилятором? Как говорил Борманд, программисты избегают null, из-за чего у них X - значение, никогда не null (потому, что программист так решил; как константы в питоне), а Optional<X> - значение, иногда null, что проверяется на этапе компиляции.
                                                Ответить
                                                • В общем, опытные java-погромисты стараются возвращать null как можно реже (даже Блох об этом пишет). Основная причина в том, что погромисты - народ оптимистичный и не любит проверять редкие ошибочные кейсы.
                                                  Optional - дополнительное напоминание. Мне лично нравится, когда код сам напоминает мне об ошибках. До тех пор, пока это не Checked Exceptions.
                                                  Ответить
                                                  • у пользователей нормальных IDE есть Nullable/NotNull аннотации.... .... ... кстати, они уже и в JCP есть
                                                    Ответить
                                                • Да нифига не проверяется. Иде не матерится на get() без ловли NSEE.
                                                  Ответить
                                              • Причем тут блядь конпелятор? Конпелятор за тебя словит Nosuchelementexception?
                                                Ответить
                                              • >Сёме разрешается не смотреть - видео на английском.
                                                Если это какая-то то банальность разжеванная 100 раз на русском в письменном виде - действительно, нах?
                                                Ответить
                                              • Ну и как уже неоднократно говорилось. Люди которые противопоставляют "динамические" и "статические" языки не понимают разницу между временем проверки и качеством проверки.
                                                Например, Шен, язык в котором проверку типов можно включить или выключить во время выполнения програмы. Каким языком его считать? Система типов в Шене примерно такая же по выразительности / количеству инструментов как и в МЛ-подобных языках.

                                                От того, что в Си типы проверяются на этапе компиляции никто не даст никаких гарантий по поводу правильности типов. При желании указатель одного типа можно привести к какому угодно другому типу, и получить ошибку типизации.
                                                Что интересно, при этом, в языках без типов, например в Форте, получить ошибку типизации нет возможности.

                                                В языках логического програмирования, как правило от системы типов в том понимании в котором она присутствует в МЛ-подобных языках нет толку, т.как сами языки как правило могут лучше выразить то, что должна выразить традиционная система типов. И там аргументы "динамический" против "статический" вообще как на корове седло.
                                                Ответить
                                                • Каждый раз когда кто-то где-то говорит о типизации, на волю из кащенки выбегает один поциент и начинает вещать о том, что статическая типизация может быть нестрогой.

                                                  Дорогой поциент! Мы все как-бы в курсе что правила того, что во что кастится не имеют никакого отношения ко тому, когда именно эта проверка выполняется: в рантайме или в моменте компиляции/трансляции.

                                                  Можете смело возвращаться в свои пинаты, пить опипромол и ложиться спать.
                                                  Ответить
                                                • Люди понимают что есть еще слабая и сильная типизация, и она в общем-то условная (в питоне слабая типизация между int, float/double и bool, в жаве - между string и всем остальным)
                                                  Ответить
                                                  • Не бывает сильных и слабых типизаций... типы - это объекты теории типов (тип принадлежности, тип кортежа и тип функции и их производные). Т.как это логическая система, то она может обладать свойствами логических систем, т.е. система типов может быть полной / неполной, правильной (sound) или нет. Может принимать аксиому выбора, или нет, принимать рекурсию, или нет, быть эквивалентной логике предикатов, логике первого или второго порядка с/без каких-то аскиом.

                                                    Она так же не может быть статической или динамической. Это просто не применимо к вопросу о качествах системы типов.
                                                    Ответить
                                                    • >Не бывает сильных и слабых типизаций
                                                      А википедия не знает.
                                                      Ответить
                                                    • >> Она так же не может быть статической или динамической. Это просто не применимо к вопросу о качествах системы типов.

                                                      Динамическим или статическим может быть ее представление(?) в языке, так?
                                                      Ответить
                                                      • Нет, динамическая и статическая типизация: выдумка маркетологов с целью продвинуть какой-то програмный продукт.

                                                        В конце девятнадцатого - начале двадцатого века математики старались найти формализм обобщающий всю математику. Их было несколько идеологических груп: платонисты, типа Геделя, логики, типа Фреге, Хилберта, Рассела и т.д., идеалисты типа Брувера. Самая привычная картина мира, по крайней мере для обывателя - это платонизм, т.е. ситуация при которой математические идеи существуют в своего рода "параллельной реальности" не зависимо от людей которые о них знают. Для этой же системы мировосприятия очень подходит описание математики базирующееся на теории множеств. Т.е. то, как в современных вузах обычно преподают введение в математику - это как раз наследие платонистов.

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

                                                        Теория типов - это попытка избежать зависимости от аксиомы выбора в фундаментальном описании математики. Другая такая попытка, например, - лямбда исчисление.

                                                        Как это относится к нашей дискуссии: типы и системы типов, это один из основополагающих математических формализмов. Мы можем с уверенностью говорить о том какими свойствами обладают типы / их системы, и какими нет. С точки зрения програмиста, система типов - это инструмент для описания правильности и выразительности програм. То, что обычно подразумевается под "статической" или "динамической" типизацией имеет столько же общего с системой типов, как качество бумаги на которой напечатана книга к содержанию книги.
                                                        Ответить
                                                        • Я возможно неправильно высказался, но имел я ввиду примерно следующее - то, что называется статической или динамической типизацией - это лишь способ взаимодействия программиста с системой типов. Сама система типов не имеет таких свойств

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

                                                          Я правильно понимаю?
                                                          Ответить
                                                          • Да тоже нет. Код на том же Хаскеле, который выполняется в ghci / hugs - он как типизирован, статически или динамически?
                                                            Где, на мой взгляд есть настоящие различия (при том, что типы вообще имеют место быть):
                                                            - язык может позволять формально указывать типы: иногда, всегда, никогда.
                                                            - язык может гарантировать, что информация касающаяся типов будет присутствовать во время выполненя програмы: вся, частично, никакая.

                                                            В зависимости от выбраной системы типов (выразительность и правильность) у языка могут быть другие качества. Например, если выбрана неправильная (unsound) система типов, то у языка появляется плюс в выразительности, но меньше гарантий в отношении правильности (пример: Си, Ява). Пример обратного: Хаскел, Окамл. Для языков, которые стараются сохранить правильность характерно стараться компенсировать потерю выразительности за счет ограниченого принятия дополнительных правил из логики более высокого порядка (полиморфизм, мета-логические предикаты типов).
                                                            Ответить
                                                            • А можно ли где нибудь почитать об этом подробно но не сильно заумно?

                                                              Интересно, но увы, мне не понятно
                                                              Ответить
                                                              • вот, тоже самое хотел сказать. Впрочем, я думаю, www и так не ожидает что его посты кто-то поймет.
                                                                Ответить
                                                              • Ну, я уже как-то раз давал ссылку на эту книжку: http://homotopytypetheory.org/book/
                                                                http://www.amazon.com/dp/0262162288/?tag=stackoverfl08-20 - нужно читать после какого-нибудь подготовительного материала. Я сдался после нескольких абзацев :)
                                                                Можно еще вот это почитать: http://math.boisestate.edu/~holmes/holmes/nf.html - это напрямую не связано с програмированием, но очень даже связано с теорией типов.
                                                                Ответить
                                                                • >> http://www.amazon.com/dp/0262162288/?tag=stackoverfl08-20 - нужно читать после какого-нибудь подготовительного материала. Я сдался после нескольких абзацев :)

                                                                  Что уж обо мне говорить)

                                                                  Я как то хотел почитать серьезную книжку о лямбда исчислении, но концентрация непонятных слов на сантиметр текста вынудили меня отказаться от этой идеи. Поэтому познаю сквозь призму ФП
                                                                  Ответить
                                                                  • > ~holmes
                                                                    А вот Шерлок Холмс не изучал всякую ненужную фигню и был крайне эффективен. Не засоряйте свой чердак, Ватсон, ненужным хламом.

                                                                    Это аналогично знанию "в байте может быть не восемь бит". Справедливое утверждение, но вероятность того, что оно потребуется, крайне мала. Обладая этим знанием, человек лишь сможет разочароваться в жизни и писать длинные посты на форумах, о том, какие все тупые и забыли, сколько бит в байте.

                                                                    Уж лучше пойти в практическое русло: погрузиться в область алгоритмов или изучать доказывающую питушню вроде языка Idris.
                                                                    Ответить
                                                                    • И окуклиться в своей системе представлений о мире?

                                                                      Мир - огромен и загадочен. Мне интересно прикасаться к его тайнам.
                                                                      Ответить
                                                                      • Хе-хе... Это уже происходит, так и будет. Одна сторона знаний всегда будет преобладать. В данном случае - математика.

                                                                        > интересно прикасаться к его тайнам
                                                                        Системы типов, придуманные математиками - это тайна мира? Тайна мира? Тайна? Мира? Какого мира?
                                                                        Это искусственная придуманная ненужная фигня. Паразит, который не может жить без подпитки мозговой энергией жертвы.
                                                                        Это всё равно, что устанавливать игру за игрой и утверждать, что так познаётся мир, утверждать, что умеешь водить машину, стрелять и прыгать на два метра, утверждать, что видел леса, поля и реки.
                                                                        Это всё равно, что жрать полиэтиленовый пакет и утверждать, что ты - гурман.

                                                                        Уж лучше тогда изучать геологию и химию. В отличие от "типов", они связаны с реальным миром.
                                                                        Ответить
                                                                        • >> Одна сторона знаний всегда будет преобладать. В данном случае - математика.

                                                                          Самообман. Человек может стать кем угодно. Я сейчас я больше занят религией чем математикой, и преобладает религиозный взгляд. Когда я начну читать книгу, которую мне посоветовали, я переключусь

                                                                          >>Это искусственная придуманная ненужная фигня

                                                                          Потому что любая вещь за пределами твоего мира - ненужная тебе нафиг фигня. Окукливание.

                                                                          И за игрой познается. И в музыке познается. Ничего не бывает просто так. Ты просто привык думать, что знаешь причины и следствия.
                                                                          Ответить
                                                                          • > Человек может стать кем угодно.
                                                                            Но времени мало. Сорокапятилетний семейный человек не сможет измениться. Вероятность крайне мала.

                                                                            > Потому что любая вещь за пределами твоего мира - ненужная тебе нафиг фигня. Окукливание.
                                                                            И это правильно.

                                                                            > любая вещь за пределами твоего мира
                                                                            Разные вещи стоят на разном расстоянии. Но некоторые всегда будут за пределами.
                                                                            1. Биология, химия, медицина, физика - всегда актуальны, всегда в нашем реальном мире. Работают над тем, чтобы помочь и улучшить мир.
                                                                            2. История, информатика, педагогика - стоят на стыке реального и виртуального миров, из-за чего могут давать сбои. Например, изучение древних времён без соотнесения с действительностью и учёта опыта, преподавание ненужной фигни и написание ненужных факториалов на хаскеле. Но при правильном использовании служат реальному миру.
                                                                            3. Математика, философия, религия - вне нашего мира. Иногда могут давать удобные модели, которые можно использовать в реальном мире.

                                                                            > И за игрой познается. И в музыке познается.
                                                                            Ладно, договорились, они не бесполезны. Они вспомогательны дают аналогическую ступеньку, по которой можно подняться, изучая реальные объекты.

                                                                            > Ты просто привык думать, что знаешь причины и следствия.
                                                                            Не привык, я же не тот мужик из матрицы.
                                                                            Ответить
                                                                            • >>> Человек может стать кем угодно.
                                                                              Но времени мало. Сорокапятилетний семейный человек не сможет измениться. Вероятность крайне мала.

                                                                              > Потому что любая вещь за пределами твоего мира - ненужная тебе нафиг фигня. Окукливание.
                                                                              И это правильно.

                                                                              > любая вещь за пределами твоего мира
                                                                              Разные вещи стоят на разном расстоянии. Но некоторые всегда будут за пределами.
                                                                              1. Биология, химия, медицина, физика - всегда актуальны, всегда в нашем реальном мире. Работают над тем, чтобы помочь и улучшить мир.
                                                                              2. История, информатика, педагогика - стоят на стыке реального и виртуального миров, из-за чего могут давать сбои. Например, изучение древних времён без соотнесения с действительностью и учёта опыта, преподавание ненужной фигни и написание ненужных факториалов на хаскеле. Но при правильном использовании служат реальному миру.
                                                                              3. Математика, философия, религия - вне нашего мира. Иногда могут давать удобные модели, которые можно использовать в реальном мире.

                                                                              > И за игрой познается. И в музыке познается.
                                                                              Ладно, договорились, они не бесполезны. Они вспомогательны дают аналогическую ступеньку, по которой можно подняться, изучая реальные объекты.

                                                                              > Ты просто привык думать, что знаешь причины и следствия.
                                                                              Не привык, я же не тот мужик из матрицы.

                                                                              Я только что прикоснулся к твоей тайне.
                                                                              Ответить
                                                                            • >Но времени мало. Сорокапятилетний семейный человек не сможет измениться. Вероятность крайне мала.
                                                                              Скорее, мотивация не та, слишком сильная потеря комфорта.
                                                                              Ответить
                                                                            • >> Но времени мало. Сорокапятилетний семейный человек не сможет измениться. Вероятность крайне мала.

                                                                              Стоит только захотеть. Но захотеть сложно. Проще думать что ты не можешь. Мир тебя наебывает

                                                                              >>И это правильно.

                                                                              В твоем мире - да. Но это даже не жизнь

                                                                              13 Входите тесными вратами, потому что широки врата и пространен путь, ведущие в погибель, и многие идут ими;
                                                                              14 потому что тесны врата и узок путь, ведущие в жизнь, и немногие находят их.

                                                                              Ты не ищешь - ты идешь где идется

                                                                              >> Работают над тем, чтобы помочь и улучшить мир.
                                                                              Над этим, но не по этому. Работают - потому что нравится

                                                                              Ты видишь мир из одной точки и тебе так удобнее. Для тебя все - во имя пользы и выгоды. Но в мире нет пользы и выгоды. Это все придумал человек. Миру параллельно на суждения. И человек волен делать все, что угодно

                                                                              >> Не привык, я же не тот мужик из матрицы.

                                                                              Не поверишь, но твой мир очень на нее похож.

                                                                              ибо истинно говорю вам, что многие пророки и праведники желали видеть, что вы видите, и не видели, и слышать, что вы слышите, и не слышали.

                                                                              Ты не хочешь ни видеть ни слышать
                                                                              Ответить
                                                                              • > Проще думать что ты не можешь.
                                                                                Старость, сэр. Не надо думать, что в любой момент жизни можно захотеть, измениться и совершить чудо.

                                                                                > Ты не ищешь - ты идешь где идется
                                                                                Итеративный подход. Там, где идётся - и есть дорога. Легче идётся - твоя дорога. Повернул и стало сложнее? Это чужая дорога, поверни в обратную сторону.

                                                                                > Для тебя все - во имя пользы и выгоды.
                                                                                Не всё, не всегда.

                                                                                > Ты не хочешь ни видеть ни слышать
                                                                                Пойду почитаю надписи на заборах и посты пи_дара. Может, мне откроется высшее знание. Может, я начну думать по-новому!

                                                                                Фильтрация крайне важна, иначе потоки данных и наши решения будут подобны белому шуму. Это единственная наша задача здесь - создавать и поддерживать порядок, а значит фокусироваться на своей цели и следовать её, не размазываясь, не тратя себя на генерацию белого шума.
                                                                                Ответить
                                                                                • >> Старость, сэр. Не надо думать, что в любой момент жизни можно захотеть, измениться и совершить чудо.

                                                                                  >> Не надо думать

                                                                                  Вот ты и не думаешь. Надо - не надо - установки. Установки разрушают волю

                                                                                  >> Итеративный подход. Там, где идётся - и есть дорога. Легче идётся - твоя дорога. Повернул и стало сложнее? Это чужая дорога, поверни в обратную сторону.

                                                                                  Ты отнимаешь у себя выбор. Впрочем это тоже выбор

                                                                                  >> Это единственная наша задача здесь - создавать и поддерживать порядок

                                                                                  И кому нужен твой порядок?

                                                                                  Человек придумывает свои задачи САМ. Почему ты решил, что твоя задача поддержания порядка нужна еще хоть кому то кроме тебя?

                                                                                  Ты всегда будешь находить то, что ищешь. Ты ищешь подтверждение собственной правоты. Попробуй наоборот
                                                                                  Ответить
                                                                                  • > Вот ты и не думаешь.
                                                                                    Думаю

                                                                                    > Ты отнимаешь у себя выбор. Впрочем это тоже выбор
                                                                                    Идти по своему пути - лучше, чем бросаться в крайности. Зачем мне метаться, распыляться на мелочи и стараться найти неоптимальный путь? Призрачное счастье в будущем? Зачем мне готовиться к будущему, которого не настанет и выбирать чужой путь, когда можно всю жизнь идти по своему?

                                                                                    > Почему ты решил, что твоя задача поддержания порядка нужна еще хоть кому то кроме тебя?
                                                                                    Потому. Либо порядок, либо смерть. Даже если убить всех человеков, это правило останется.

                                                                                    > Ты ищешь подтверждение собственной правоты. Попробуй наоборот
                                                                                    Интересный ход, симметричный.
                                                                                    Наоборот я пробую, но мне это часто мешает. Всё начинает казаться чистой правдой, так можно и с ума сойти.
                                                                                    Ответить
                                                                                    • >> Думаю
                                                                                      1024-- в http://govnokod.ru/18291#comment289628 написал:
                                                                                      >> Не надо думать, что в любой момент жизни можно захотеть, измениться и совершить чудо.

                                                                                      Так зачем думаешь, если не надо?

                                                                                      >> Идти по своему пути - лучше, чем бросаться в крайности. Зачем мне метаться, распыляться на мелочи и стараться найти неоптимальный путь? Призрачное счастье в будущем? Зачем мне готовиться к будущему, которого не настанет и выбирать чужой путь, когда можно всю жизнь идти по своему?

                                                                                      Тут уже - как хочешь. Но ты рискуешь в один день понять, что упустил что то важное. Делать нужно все, что нравится делать.
                                                                                      Будущее - иллюзия. Как говорил Воланд - человек смертен внезапно. Все что у тебя есть - это сейчас. Поэтому если тебе что о хочется - то для этого есть только один момент - сейчас.

                                                                                      >> Либо порядок, либо смерть.

                                                                                      И в этом твой мир

                                                                                      Но не живу в нем. А значит можешь и ты. Но ты не веришь, что можешь, и думаешь, что все такие же)

                                                                                      >> Всё начинает казаться чистой правдой, так можно и с ума сойти.

                                                                                      Так и есть. А когда ты остановишь мир - поймешь что нет ни правды - ни лжи, ни добра - ни зла
                                                                                      Ответить
                                                                                      • > Так зачем думаешь, если не надо?
                                                                                        Молоток - не философский камень. Молоток не может превратить хрень в золото, но молоток продолжает забивать гвозди. Так зачем забивает, если не надо?

                                                                                        > Делать нужно все, что нравится делать.
                                                                                        Вот и делаю.

                                                                                        > Но не живу в нем. А значит можешь и ты. Но ты не веришь, что можешь, и думаешь, что все такие же)
                                                                                        > А когда ты остановишь мир - поймешь что нет ни правды - ни лжи, ни добра - ни зла
                                                                                        Сойти с ума ради нейтральной пустоты или жить и радоваться? Нет, я уж лучше поживу и порадуюсь.
                                                                                        Ответить
                                                                                        • >> Молоток не может превратить хрень в золото, но молоток продолжает забивать гвозди. Так зачем забивает, если не надо?

                                                                                          Незачем) Я не понимаю. Ты делать то, что не должен по своему же мнению? Почему? Забей.

                                                                                          >> Сойти с ума ради нейтральной пустоты или жить и радоваться? Нет, я уж лучше поживу и порадуюсь.

                                                                                          Пустота в твоем мире. Всем нет ничего, кроме тебя самого. Все остальное - отражения тебя. За пределами кокона настоящий мир. Не интересно?
                                                                                          Ответить
                                                                                          • Я не могу понять, что тут происходит. Думать в общем или думать о том, что можно захотеть? Думать в общем - надо. Думать о том, что захотеть - по желанию.

                                                                                            > Не интересно?
                                                                                            Не интересно. Чтобы прорваться во внешний мир (если он есть), придётся найти уязвимость и сломать этот. Работает - не трогать.
                                                                                            Ответить
                                                                      • Прикоснись к моей тайне..
                                                                        Ответить
                                                        • Обзъян, ну что с того что в некоторых ситуациях понятие статической/динамической типизации не имеет смысла?
                                                          В остальных-то ситуациях смысл есть!

                                                          Приходит wvxvw на вокзал, и просит билет до Крыжополя.

                                                          Кассирша: Вам на южный вокзал или северный?
                                                          wvxvw: север и юг -- выдумки маркетологов. Когда я стою на южном полюсе где юг и где север?

                                                          кассирша: Вам на вечер или на утро?
                                                          wvxvw: вечер и утро -- выдумки маркетологов. Когда я пересек горизонт событий и падаю в сраную сингулярность, то нет не только утра и вечера, времени даже нету.

                                                          И тут приходят санитары, и забирают wvxvw обратно в дурку, а за ним бегут чумазые 2014 и kegdan и кричат: "дяяяденька, а что это вы там про сингулярность говорили? Вы наверное такой умный! Самый умный тут! Расскажите нам, пожалкйста"!

                                                          Но санитары уже вкатили wvxvw галлопередолу и слюни текут.

                                                          Тьфу.
                                                          Ответить
                                                          • А где часть с блистающим и всепросвещающим стретором, который советует вьебать говна?
                                                            Ответить
                                                          • Все по полочкам разложил.
                                                            Ответить
                                          • >Где проще разглядеть потенциальную ошибку?
                                            Я не в курсе как проще жаваёбам, то на чем я обычно пишу не кидает исключений если пытаться напечатать null. Может жаваёбы к наллам привыкли. И там и там надо проверять на отсутствие значения.
                                            Ответить
                                  • Это сколько жавой в очко долбиться надо, чтобы это понять, но при этом не уметь это внятно объяснить?
                                    Ответить
                                • Нет, просто ты что-то бубнишь себе в залупу, а если надутую упаковку твоих комментариев раздавить и выпустить из нее воздух - внутри будет чпок.

                                  >он просто делает вероятность случайной ошибки меньше за счёт введения дополнительного типа-контейнера.
                                  Потому что код ревью проводится в вебе?
                                  Ответить
                                • Так и думал, сам нихуя объяснить не можешь кроме "да ты же жаву толком не нюхал, вот посидишь как я в веб страничке без иде тогда поймешь".
                                  Ответить
                                • У опции есть еще одно полезное использование: не выбрасывать ошибки в местах, где это не критично, а критична производительность. NaN в ж.скрипте, например, это тот же тип опции, т.как к нему применимы все операции, которые применимы и к числам, но к ошибкам это не приведет. Обычно в качестве примера использования приводится такая ситуация: скажем, у нас есть таблица на несколько миллионов записей, где с, например, 10% вероятностью, данных может не быть. Допустим, мы хотим над всемы данными выполнить одну и ту же операцию. Вот вместо того, чтобы обрабатывать 10К ошибок, мы после операции заменим 10К пустых значений на значение по умолчанию.
                                  Ответить
                              • Давай-ка я попробую.

                                Смотри: один из смыслов статической типизации в том, что ты кое-что знаешь о возвращаемом типе. Например если вертаемый тип int, то это значение от INT_MIN до INT_MAX. Соответственно можно спокойно пихать его в функцию, ожидающую int без боязни что функция ожидает указатель на строку и поедет по пезде. Компилятор решает эти проблемы за тебя, чувак! Халява!

                                Из этой строгого, статического рая джав и сишарпов вываливалась ситуация с объектами. Когда речь идет о примитивах (в джаве) или валуе-тайпах (си шарпе) все прекрасно, но когда речь идет об объекте, то тебе могут вернуть не только указатель на объект но еще указатель на хуй (по научному -- null). Значит, уже нельзя спокойно сунуть его в любой метод без боязни получить по влажным губам толстым NPE (или NRE в терминологии острых сей). Проверить это на уровне компилятора никак нельзя, потому что авторы языка пидарасы нулл -- валидное значение для указателя.

                                В идеальном мире пони срут радугами, и программист *каждую* функцию документирует на предмет возвращения нула, и пользователь функции понимает кто может нулл вернуть, а кто нет. И если кто-то может, то он проверяет на нул и делает какие-то логичные действия вместо получения постыдного NPE.

                                В действительности же никто никогда не пишет никаких доков, и все как дебилы каждый результат проверяют на нул, засирая код ненужными проверками, а стоит только забыть как ты получишь NPE.


                                ПРОДОЛЖЕИЕ СЛЕДУЕТ
                                Ответить
                                • ПРОДОЛЖЕНИЕ



                                  Кто-то решает проблему аннотациями для статического анализа (Nullable/NotNull), кто-то решает это на уровне компилятора вводя реальные обертки, этакие Maybe: Nullable, Optional итд.

                                  Когда функция вертает Optional, она как-бы говорит "эй, я могу вернуть нул, проверь меня!!" и программист вынужден явно проверить значение. Он не может уже тупо передать его дальше по цепочке, или нарушить закон деметры дернув у него метод и получить отсосный, мининглесс, тупой и бесполезный NPE.

                                  Программист -- тупая, ленивая сука, надо заставлять его проверять ошибки, отсюда и Optional, и Checked Excpetions (которыми ни один человек в мире пользоваться не умеет) да и вся статическая типизация современности в целом
                                  Ответить
                                  • Зачем плодить лишние сущности? Во первых как ты сказал есть аннотации, во вторых - готовые null/обертки для примитивных типов. Зачем еще одну плодить?
                                    Ответить
                                    • Аннотации не решают, к сожалению, проблему на уровне компиляции, а с примитивными типами-то как раз все в порядке. Речь о ссылочных.

                                      В идеале эта штука должна быть оформлена на уровне языка, а не на уровне сторонней приблуды.
                                      Ответить
                                      • >Аннотации не решают, к сожалению, проблему на уровне компиляции
                                        Не понял. Ты хочешь чтобы без аннотаций не конпелировалось?

                                        >В идеале эта штука должна быть оформлена на уровне языка
                                        Ну это в жаве исторически все оформляется в виде сторонней приблуды. Там даже сложение строк в компилятор встроено.
                                        Ответить
                                        • хочу, да)

                                          посмотри как сделано в котлине, например. Там нельзя тупо скастить ненулабл тип в нулабл
                                          Ответить
                                  • Когда вообще имеет смысл возвращать null? Почему не условный default?
                                    Ответить
                                    • ну вот есть у тебя код

                                      User getUser(int userId);


                                      вопрос: что возвращать когда нету юзера с таким id? Какого-то специального DefaultUser? И так на каждый случай? Не много ли букв писать?

                                      Паттерн *Null object* (именно так правильно называется то, что ты предложил) имеет смысл только в одном случае: когда мы хотим скрыть от клиента что такого пользователя нет, и подставить реализацию которая выполняет контракт и ничего не делает. Например _EmptyUser_, который по методу getName() будет возвращать пустую строку, по методу sendEmail() ничего не делать итд.

                                      Тогда клиент может и не знать что этот пользователь чем-то отличается от особенного.

                                      С другой стороны если он вдруг захочет это узнать, то будет проверять instanceof (или is) и будет еще хуже.
                                      Ответить
                                      • Хм.
                                        Ну можно делать, как в go. Возвращать заодно ошибку. Тогда правда придется проверять ошибку :) Кода столько же примерно, зато семантически выглядит целесообразно.

                                        Другой вопрос, а не стоит ли тогда проверять сначала, есть ли такой id отдельным способом? И, если есть, тогда брать юзера.
                                        Ответить
                                        • 1) в го на самом деле тоже самое, просто это более красиво встроено в язык

                                          2) нельзя проверять сначала, иначе придется задирать уровень транзакции (если речь идет о БД) или налетать на рейс кондишены: пока проверял он был, а как получил так не стало.

                                          Можно еще checked exception кидать, но на свете нет ни одного человека которому бы это нравилось.
                                          Ответить
                                          • >> налетать на рейс кондишены: пока проверял он был, а как получил так не стало.
                                            -
                                            делать это атомарно? Понятно, что это требует поддержки фреймворком/языком, но в данном случае во главу угла ставится читаемость и т.д.

                                            И кстати точно так же можно попасть на ситуацию, когда, пока получали, он был, но, пока начали с ним работать, ему лапти настали. С этой точки зрения проверки на null придется разбрасывать везде, где работаем с объектом, разве нет?
                                            Ответить
                                            • 1) конечно атомарно
                                              2) в базе может лапти и настали, а в памяти у нас он уже есть, и если загрузка там не ленивая то можно и поработать.
                                              Ответить
                                          • >Можно еще checked exception кидать, но на свете нет ни одного человека которому бы это нравилось.
                                            Да ну. Просто эксепты сравнительно медленные, а так это как раз правильный вариант.
                                            Ответить
                                            • )))))))да, большинство проектов тормозит именно по причине скорости ексепшенов
                                              Ответить
                                              • Ну по этой причине жаваёбы их не юзают. Другой причины кагбэ имхо нет.
                                                Ответить
                                                • боже, какая чушь!

                                                  скорость работы эксепшенов это будет последний боттлнек в твоей системе, сразу же за фрагментированным HDD:)

                                                  Джависты просто не понимают их смысла, потому что нигде нет нормального туториала, и у людей в башке каша: они не понимают что чекд эксепшены это часть контракта, а рантайм -- признак этого контракта нарушения
                                                  Ответить
                                                  • OOME - это нарушение контракта?
                                                    Ответить
                                                    • нет, это паршывая овца.

                                                      а вот NPE, IllegalArgument и IllegalState -- таки да
                                                      Ответить
                                                    • на самом деле рантайм ексепшет ознает "все пиздец тред должен умереть а то и вся машина"

                                                      а причин бывает несколько
                                                      1) контракт нарушен и в памяти теперь хуйпоймичо
                                                      2) память кончилась
                                                      итд

                                                      ну сервера приложений могут конечно это поймать и не дать умереть, но задачу они точно должны завалить
                                                      Ответить
                                                      • > на самом деле рантайм ексепшет ознает "все пиздец тред должен умереть а то и вся машина"

                                                        О, иксперты набижали.
                                                        Ты путаешь RuntimeException и Error, гений.
                                                        Ответить
                                                        • ну вот ты отличный пример того, что никто на самом деле нифига не умеет эксепшенами пользоваться.

                                                          Рантайм ексепшен это нарушение контракта. После этого система остается в непонятно состоянии и совершенно не очевидно что делать дальше. В идеальном варианте надо закрыться и умереть. А чекд эксепшен это часть контракта и из него можно восстановиться, но бабуины вроде тебя этого не знают и засрали пол Инета криками о том что "иксепшены это плохо", ага
                                                          Ответить
                                                          • > Рантайм ексепшен это нарушение контракта.

                                                            Да, так должно было быть по задумке авторов жабы. На деле чекед-эксепшены настолько громоздки и неудобны, что 146% авторов библиотек не связываются с ними.
                                                            Даже авторы JDK косячат, не следуя придуманным ими же гайдлайнам.
                                                            Это явный признак того, что гайдлайны, выглядящие хорошо в теории, на практике могут быть полным говном.
                                                            Ответить
                                                            • В целом верно.

                                                              Эксепшены -- отличная в теории конструкция, но никто их не осилил к сожалению. Может быть потому что они правда малоудобны, а может потому что таки да -- нет туториала и никто не понимает когда какой эксепшен кидать и когда его ловить.
                                                              Ответить
                                                    • Это вообще не эксцепшн, если что
                                                      Ответить
                                                      • кстате да
                                                        это еррор

                                                        непонятно правда чому assert это error
                                                        Ответить
                                        • > Другой вопрос, а не стоит ли тогда проверять сначала, есть ли такой id

                                          Мы любим делать два запроса в базу вместо одного, не правда ли?
                                          Ну и ладно юзеры, их обычно не удаляют, но есть ведь объекты, которые могут быть удалены в промежутке между двумя запросами.
                                          Ответить
                                          • Ну, я не буду спорить, потому что согласен, но, чисто теоретически, разве это нельзя уместить в один запрос? Закешировав результат в недрах вместе с флагом, null он или нет?
                                            Ответить
                                      • >что возвращать когда нету юзера с таким id?
                                        null или кидать эксепт.

                                        >Паттерн *Null object* (именно так правильно называется то, что ты предложил) имеет смысл только в одном случае: когда мы хотим скрыть от клиента что такого пользователя нет, и подставить реализацию которая выполняет контракт и ничего не делает. Например _EmptyUser_, который по методу getName() будет возвращать пустую строку, по методу sendEmail() ничего не делать итд.
                                        Тогда получим пых, который *как-то* фурычит всегда.
                                        Ответить
                        • > могу неплохо писать на жабе и не только на жабе без IDE
                          В общем-то я тоже могу. Но писать на жабе без IDE не особо приятно. Приходится юзать читы типа import java.util.*; и т.п. С чтением всё-таки полегче.
                          Ответить
                          • Писать на жаве без ide это как забивать гвозди камнями. Автодополнение работает действительно идеально, кто посидит на динамических языках тот поймет.
                            Ответить
                            • Но во время ревью код, внезапно, читают. А Роман именно про ревью.
                              Ответить
                              • Императивную мешанину на жаве читать не очень интересно. Алсо я обычно когда читаю скачу по вызовам, чем тебе веб тут поможет?
                                Ответить
                                • Дык в том и соль, что код должен быть написан так, чтобы его даже в таких спартанских условиях можно было понять...

                                  А если тебе приходится скакать по вызовам (и, не дай бог, ещё какие-то вычисления в уме проводить) - код хуёвый.
                                  Ответить
                                • Вот есть класс на питоне. У него есть поле self.context. Как мне понять, какие методы я могу дёрнуть у этого context'а? Как мне понять, что я должен реализовать, чтобы передать свой объект в конструктор этого класса в качестве context? Поможет ли мне IDE?

                                  Печально, но в жабе на все эти вопросы очень легко ответить.

                                  P.S. Доку к классу не завезли, да.
                                  Ответить
                                  • >Печально, но в жабе на все эти вопросы очень легко ответить.
                                    Положительно?
                                    Ответить
                                    • > Положительно?
                                      Само собой. Посмотреть, какого типа context. Это будет или интерфейс или класс. Дальше всё тупо. А в ide даже смотреть не надо будет, само подскажет.
                                      Ответить
                                      • И в чем смысл твоего поста? Что в жабе от ide есть польза, а в питоне - гораздо меньше?
                                        Ответить
                                        • В том, что то самое императивное говно на жабе читать проще, чем идеальный питоний код. Даже без ide, да.
                                          Ответить
                                          • Кому проще? Хелловелдщику? Ололо
                                            Ответить
                                          • существует противоположная точка зрения:

                                            в нехуево написанной программе даже без помощи IDE примерно понятно о чем речь (всякие венгерские нотации и иже с ними в помощь). Как-то же писали люди программы в середине 90х, без всякого код инсайта, и неплохо писали
                                            Ответить
                                            • >Как-то же писали люди программы в середине 90х,
                                              Сравнил хуй с пальцем. Тогда программы были проще и падали от нехуй делать без внятного сообщения об ошибке.
                                              Ответить
                                              • ой, ну не пизди мне пожалуйста.

                                                Doom, OS/2 и Lexicon конечно были проще того сраного интернето-магазинчика который пилит сейчас сраный школоло, обвешанный IDE.
                                                Ответить
                                                • Есть пруфы, шо все это писалось без IDE? :)
                                                  Ответить
                                                  • есть пруфы что IDE не умели делать статический анализ в конце 80х. У них даже парсера не было (максимум лексер для хайлайта)
                                                    Ответить
                                                    • То есть лексер был, а парсера не было? Забавненько, ну-ну, окей.
                                                      Ответить
                                                      • Сразу видно что ты питушок малограмотный.
                                                        Лексер пишется посредством обычного автомата , он даже в обычном editPlus есть. А вот парсер требует памяти, восстановления от ошибок и прочих радостей которых тогда не было в IDE.

                                                        Видно так же что ты школота пубертатная, и в 90е ты сидел не за компьютером, а в папиных яйцах.

                                                        Нагугли себе досбокс и BorlandC 3.0, напиши там хотя бы тетрис, а потом скажи мне: сильно-ли тебе подсказывали методы объекта, или тип переменной, например.
                                                        Ответить
                                                        • Бедняжка, срочно две чашки турбо си этому пациенту
                                                          Ответить
                                                        • Объясните несведущему разницу.
                                                          Ответить
                                                          • так ты не знаешь разницу между турбо и борланд???

                                                            у тебя не было детства, чувак!!
                                                            Ответить
                                                            • Я на другой комент отвечал. Правда удобные коменты?
                                                              Ответить
                                                              • Комменты удобны, как и весь сайт.

                                                                Так про что ты спрашивал? Про лексеры и парсеры?

                                                                Лексер работает с т.н. регулярной грамматикой или грамматикой третьего уровня в иерархии Хомски (да-да, когда ты пишешь регулярное выражение ты по сути создаешь лексер).

                                                                Для релизации лексера достаточно конечного автомата (вспоминаем что регексы это есть конечные автоматы -- НКА или ДКА), то есть хуйни которая просто переходит из одного состояния в другое, память ей не нужна.

                                                                Лексер разбивает текст на лексемы (каждая лексема соответствует токену). Например у тебя есть текст на пистоне: "if petuh: print kukarekoo ". Автомат крутится до тех пор, пока не встретит первый пробел и понимает что он вычленил токен "if". Потом он крутится пока не вычленит питуха, и тогда он поймет что лексема petuh это токен VARIABLE. И так он разбирает весь документ представляя его в ввиде пачки токенов.

                                                                Он не понимает что тело функции находится внутри функции, а внутри этого тела есть еще цикл итд. Он не имеет стека чтобы понимать что он внутри функции, и потому токены у него выложены не в дерево, а тупо рядком.

                                                                Он работает быстро, пишется легко, может подсветить ключевые слова (if например) но явно не может построить дерево программы.

                                                                ПРДЛЖЕНИЕ СЛЕДУЕТ
                                                                Ответить
                                                                • ПРДЛжегние

                                                                  А вот парсер работает с контекстно-свободными грамматиками (второй уровень Хомски) и ему уже нужна целая машина Тюринга с памтью чтобы работать. Его уже ригуляркой не напишешь (нужен BNF или рукопись или flex, yacc, вот это всё) и он уже строит дерево программы потому что когда он входит в функцию он кладет себе в стек об этом заметку.

                                                                  Парсер уже значительно умнее: например с его помощью можно понимать область видимости пеерменной, делать красивую отбичвочку в программах, писать компиляторы в конце концов.

                                                                  Обычно все работает так:

                                                                  Текст -> Лексер -> Парсер -> IDE/компилятор/итд

                                                                  Так вот лексеры есть даже в Editplus, их даже ты можешь на регулярках написать, а парсеры есть только у компиляторов и серьезных IDE.

                                                                  И к сожалению в моем борландсишном децтве с синим экраном парсера у IDE не было, и мне некуда было нажать чтобы посмотреть список всех доступных в этой области переменных...
                                                                  Ответить
                                                                  • Stertor в http://govnokod.ru/18291#comment289658 написал:
                                                                    >> да-да, когда ты пишешь регулярное выражение ты по сути создаешь лексер

                                                                    щито? Ты обкурился?



                                                                    >> (второй уровень Хомски)
                                                                    Щито? Я так понимаю ты имел ввиду 2 тип в классификации формальных грамматик по Хомскому?
                                                                    Ответить
                                                                    • Т.е. лексер разбивает исходник на элементы, а парсер строит дерево (и для этого ему нужна память)?
                                                                      Ответить
                                                                      • Лексер - проверяет, что слова валидны
                                                                        Парсер - проверяет, что они стоят в нормальном порядке (Зачастую параллельно строит промежуточное представление, например семантическое дерево)
                                                                        Семантический анализ - проверяет, что вся эта хуйня что то да значит, оптимизирует (инлайны, распространение констант, раскрутка циклов, константные вычисление и все такое)
                                                                        А потом - зависит от цели. Обычно трансляция в нативный код
                                                                        Ответить
                                                                    • > Щито? Я так понимаю ты имел ввиду 2 тип в классификации формальных грамматик по Хомскому?
                                                                      Кстати, почему многие пишут, что есть четыре класса грамматик и ссылаются на работу Хомского "Three models for the description of language"? Вот на неё: http://www.chomsky.info/articles/195609--.pdf
                                                                      Как из трёх стало четыре, откуда взялись их названия?
                                                                      Ответить
                                                                      • ЕМНИП
                                                                        0 - неограниченные
                                                                        1 - контекстно-зависимые
                                                                        2 - контекстно-свободные
                                                                        3 - регулярные
                                                                        Ответить
                                                                        • Это да. Но оно как-то вытекло из той статьи про три.
                                                                          Ситуация такая: ту статью, да и тему в общем, почти никто не способен понять. Кто-то ссылается на статью, поскольку всё из неё вылилось, кто-то - потому, что не понимает. Хотя, может быть, про 4 типа написали много позже и сослались на статью про 3 типа.
                                                                          Я эту статью скорее всего не пойму, поэтому и не могу разобраться в том, что происходит.
                                                                          Ответить
                                                                          • Я щас не расположен читать статьи, если напомнишь позже - почитаю, разберусь.
                                                                            Я специально не изучал это, у нас год были лекции на тему
                                                                            Ответить
                                                                            • Хорошо, напомню. Это полезнее, чем вся та философия о мире, которую можно гнуть как алюминиевую проволоку.
                                                                              Ответить
                                                                              • Я щас читаю интересную статью про смысл вопроса "в чем смысл жизни")
                                                                                Ответить
                                                                        • 3 модели
                                                                          0,1,2,3

                                                                          нуачо
                                                                          Ответить
                                                                  • >> А вот парсер работает с контекстно-свободными грамматиками

                                                                    Парсер может работать с любой из грамматик в зависимости от извращенности ваших желаний

                                                                    >> и ему уже нужна целая машина Тюринга с памтью чтобы работать.

                                                                    Машина Тьюринга - абстракция исполнителя. Если ты о том, что нужен исполнитель - так он любой программе нужен. и лексеру в том числе.

                                                                    >> Его уже ригуляркой не напишешь
                                                                    А ты лексер хотел регуляркой писать? Удачи

                                                                    >> нужен BNF или рукопись или flex, yacc, вот это всё
                                                                    Лихо ты компиляторы компиляторов в один ряд засунул с БНФ и какой-то загадочной рукописью

                                                                    Компиляторы компиляторов (с которыми я работал) создают и лексер и парсер и еще много приятных фич

                                                                    >> и он уже строит дерево программы потому что когда он входит в функцию он кладет себе в стек об этом заметку.

                                                                    Щито? Что по твоему "входить в функцию"? В моих терминах - это погружаться внутрь функции из кода. Ничего такого лексер не делает.

                                                                    >> Парсер уже значительно умнее
                                                                    тебя?

                                                                    >> например с его помощью можно понимать область видимости пеерменной,

                                                                    Нельзя, это делается на этапе семантического анализа. Парсер говорит правильно ли у тебя лексемы стоят, а не что они означают

                                                                    >> делать красивую отбичвочку в программах
                                                                    Хз, что ты имеешь в виду

                                                                    >> писать компиляторы в конце концов
                                                                    Умиляюсь над твоей способностью объединять совершенно разные вещи

                                                                    >> Текст -> Лексер -> Парсер -> IDE/компилятор/итд

                                                                    Артефакт -> Обработчик -> Обработчик -> Средство разработки/ Компилятор (который содержит 2 обработчика)/ итд (видимо прочие псевдонаучные вещи)

                                                                    Вот что означает эта диаграмма?
                                                                    Ответить
                                                                    • >Машина Тьюринга - абстракция исполнителя. Если ты о том, что нужен исполнитель - так он любой программе нужен. и лексеру в том числе.
                                                                      То есть, машина тьюринга == конечный автомат?
                                                                      Ответить
                                                                      • Машина тьюринга - это абстрактный исполнитель, который ходит по ленте и делает, что там написанно
                                                                        Конечный автомат - математическая модель того, как преобразовать один набор символов в другой. Представляют его в виде пятерки значений (алфавит, допустимые состояния, начальный символ, допустимые итоговые состояния, правила перехода)

                                                                        Так что - не равны
                                                                        Ответить
                                                                    • > А ты лексер хотел регуляркой писать? Удачи
                                                                      А что, токены поместятся в регулярку. Скажем, лексер основать на
                                                                      /([a-z0-9]+[0-9]*)|(\d+\.\d+)|(\d+)|(\()|(\))/

                                                                      А парсер - на
                                                                      expression ::= LBRAC, value+, RBRAC;
                                                                      value ::= ID | REAL | INT | expression;

                                                                      >> например с его помощью можно понимать область видимости пеерменной,
                                                                      > Нельзя, это делается на этапе семантического анализа. Парсер говорит правильно ли у тебя лексемы стоят, а не что они означают
                                                                      Область видимости - место в иерархии. Распарсив код КС-питушнёй, мы можем получить место идентификатора в иерархии и можем понимать область видимости.
                                                                      Говоря сухим, но почему-то уважаемым тут языком, парсер - необходимое условие.

                                                                      >> делать красивую отбичвочку в программах
                                                                      > Хз, что ты имеешь в виду
                                                                      Он говорит о красивом форматировании. Парсинг ведётся с точностью до пробельных символов, стили оформления кода действуют с точностью до пробелов.
                                                                      Парсинг -> AST -> отформатированный текст
                                                                      Вот наглядный пример:
                                                                      JSON.stringify(JSON.parse('{"a":12,"b":10}'), null, 2)


                                                                      > Вот что означает эта диаграмма?
                                                                      Но диаграмма гостя была и так понятна.

                                                                      Зачем троллить, если можно прочитать и понять? Секта wvxvw?
                                                                      Ответить
                                                                      • Гоу, я создал http://gvforum.ru/viewtopic.php?id=1224
                                                                        Ответить
                                                                      • >> А что, токены поместятся в регулярку. Скажем, лексер основать на

                                                                        А теперь составь регулярку для выделения лексем языка JavaScript

                                                                        >> и можем понимать область видимости.

                                                                        Мы - можем. Но не компьютер. На этапе парсера он не знает че кого.

                                                                        >> Говоря сухим, но почему-то уважаемым тут языком, парсер - необходимое условие.

                                                                        А еще наличие текста программы, среды исполнения и электричества. Так сюда что угодно можно приписать. Скоп переменной - понятие семантическое, хоть тресни

                                                                        >> Но диаграмма гостя была и так понятна.
                                                                        Понятна, исходя из предположения, что автор долбоеб и понятия не имеет о чем пишет. Мне же интересно было услышать объяснение каждой связи
                                                                        Ответить
                                                                        • > А теперь составь регулярку для выделения лексем языка JavaScript
                                                                          И что, не выйдет? Они ВНЕЗАПНО не влезают в регулярную грамматику?
                                                                          Выйдет, конечно. Только чуть подлиннее, поэтому я не буду её писать.

                                                                          > На этапе парсера он не знает че кого.
                                                                          > А еще наличие текста программы, среды исполнения и электричества. Так сюда что угодно можно приписать. Скоп переменной - понятие семантическое, хоть тресни
                                                                          > автор долбоеб и понятия не имеет о чем пишет
                                                                          Понятно, wvxvw укусил. Продолжайте троллить вместе, но гость прав.
                                                                          Ответить
                                                                          • >> Только чуть подлиннее, поэтому я не буду её писать.

                                                                            Это как хтмл парсить регулярками

                                                                            >> Продолжайте троллить вместе, но гость прав.
                                                                            Я не троллю. В чем гость прав? Сформулируй тезис
                                                                            Ответить
                                                                            • >Это как хтмл парсить регулярками
                                                                              Нет, заебал. Для парсинга html нужна память, для выделения лексем достаточно конечного автомата.Го на форум.
                                                                              Ответить
                                                                            • > Это как хтмл парсить регулярками
                                                                              Нет. Мы же говорим о разбивке на лексемы, да?
                                                                              А уж лексемы специально сделали простыми. Лексемы вполне можно распарсить регулярками. Их специально сделали простыми, чтобы дать на вход нормальному парсеру КС-грамматики что-то более разумное, чем поток символов.

                                                                              > В чем гость прав? Сформулируй тезис
                                                                              Во многом... Гость говорит о том, как оно в нашей жизни. Если не разбирать его текст на предложения и осознавать как единое целое, получается достаточно правдоподобный текст.
                                                                              Ответить
                                                                              • с ошибками и явным непониманием
                                                                                Ответить
                                                                                • Перечитал ещё раз.
                                                                                  Человек просто не углублялся в теорию (спасибо ему за это). С практической точки зрения - идеально.
                                                                                  Ответить
                                                                        • гоу на форум
                                                                          Ответить
                                                • Лексикон по всякому проще офиса.

                                                  >оторый пилит сейчас сраный школоло
                                                  Вся сложность зарыта в фреймверке/библиотеках. Так что может быть что да.
                                                  Ответить
                                                  • офис тоже пилили без помощи со стороны IDE, иначе зачем бы они выдумали венгерскую нотацию?
                                                    Ответить
                                        • правильно говорить не "от IDE" а от "статического анализа", лалка
                                          Ответить
      • > А в чем смысл optional?
        Как я понял, это для LINQ-подобной питушни сделали:
        return option. // откуда-то из интернетов
          map(Collections::singletonList).
          orElse(Collections.emptyList());

        Теперь можно писать однострочники вместо тернарных операторов и if/else.
        Ответить
        • Но причем тут optional?
          Ответить
          • Я пока только этот комментарий видел:
            На самом деле Optional в Java 8 был введён исключительно для поддержки коллекций.
            http://habrahabr.ru/post/225641/#comment_7670597
            Фиг его знает, это надо изучать.
            Ответить
            • А что он дает коллекциям? Все равно нужны явные проверки на isPresent, с таким же успехом там мог бы стоять null
              Ответить
              • > с таким же успехом там мог бы стоять null
                и правда

                map, filter и orElse и подобное делают эти проверки внутри. Optional делает из типа что-то похожее на коллекцию.
                Ответить
                • Потому что Optional - это список, в котором максимум один элемент.
                  Читайте книжки по хачкелю, там всё это расжёвано.
                  Ответить
                  • Удобство монад? Охотно верю, эта сторона Optional мне нравится хотя бы своей краткостью.
                    Но вот только в хаскеле Maybe действительно требуется, а здесь null и так есть.
                    Ответить
        • Ну вот бд у тебя есть, вот в бд нулабл поле - длина хуя вот ты его из бд читаешь. если длина хуя число - то читаем в инт. а если нул? Тогда создаем флаг - мол нет смысла читать из инта - там нулл лежит

          Вот за этим и нужен ваш опционал хренов - это обвертка которая в себе флаг держит и вельютайп (типа инта). флаг говорит - а стоит ли вообще читать из инта.
          Ответить
          • Но у меня есть ещё и Integer, который делает почти то же самое. Держит значение, может быть null.
            Ответить
            • Вот в таких случаях опционал нахуй не нужен ИМХО
              Ответить
              • Вот тебе более вменяемый кейс:

                Есть блокирующая очередь, и ты хочешь реализовать операцию tryPop(), которая вернёт тебе объект, если очередь не пустая, но не будет дожидаться, пока в очереди что-нибудь появится.

                Ты можешь возвращать из tryPop() null и предложить коду самому разбираться, послали ли ему null или просто очередь пуста. Или возвращать Optional<Integer>, который не empty только если в очереди что-то было. Тогда никаких сомнений уже быть не может.
                Ответить
                • А разве там не будет флага типа isAvailable (IsEmpty)?
                  Ответить
                  • Любите ли вы рейс-кондишены так, как люблю их я?
                    Ответить
                    • Тоже верно
                      Ответить
                    • А флажолеты на гитаре, обломком пивной бутылки, - слабо?
                      Ответить
                      • предпочитаю флейту водосточных труб
                        Ответить
                      • >> А флажолеты на гитаре, обломком пивной бутылки, - слабо?

                        1) ты точно знаешь что такое флажолет?
                        2) ты хотел сказать осколок?
                        Ответить
                        • http://u.to/OeGVCw

                          На 2.37 звучит.

                          >>ты хотел сказать осколок?
                          http://u.to/9_GVCw
                          Ответить
                          • а флажолеты вобще легко сделать любым твердым и ровным предметом. ты пальцами попробуй, мальчик. или языком. вкачаешь язычок, тогда приходи.
                            Ответить
                • Так это жавапроблемки, когда нужно ввести джва типа null - один как маркер но чтобы можно было в коллекции класть Null. Кстати, как это в жавке раньше решали? Почему в питоне нет ключа и по ключу лежит null - разные случаи, а жаве похуй?

                  И кстати ты на свой вопрос сам и ответил http://govnokod.ru/18291#comment289296
                  Ответить
                  • >> в питоне нет ключа и по ключу лежит null - разные случаи
                    в питоне даже понятия-то такого нет -- "null".
                    Там есть None.

                    Сразу видно что ты и пистона-то в глазы не видал
                    Ответить
                  • > И кстати ты на свой вопрос сам и ответил
                    Ты умеешь отличать вопросы от утверждений? Где я задавал вопросы?
                    Ответить
                    • >Ты можешь возвращать... Или возвращать...
                      Читается вопрос "что делать?".
                      Ответить
                      • Не знаю, что ты там начитал. Я обеими руками за Optional<T>. В плюсовой очереди я именно его и использовал. В плюсах гораздо больше мотивов юзать optional, чем в жабе, но и в жабе явный контракт выглядит лучше.
                        Ответить
                        • Ну за так за. Внятного объяснения от тебя мы все равно не услышим.
                          Ответить
                          • > Внятного объяснения
                            Лол. Ну, попробуй почитать рационал гуглеров.
                            https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
                            Хотя, врядли тебе это поможет - все их аргументы уже приводились в треде.
                            Ответить
                            • Какая-то очень тонкая разница. Наверно надо упарываться жавой 12 часов в сутки чтобы это понять.
                              Ответить
                              • Нет, надо иметь опыт работы с проектами, в которых занято более 1 человека.
                                Ответить
                                • Скорее нужно иметь опыт работы с проектами, которые занимают более одной недели
                                  Ответить
                                  • И то и другое у меня было во время учебы. Облом?
                                    Ответить
                                    • > Облом?
                                      Ну ты и лалка. Мне лично абсолютно наплевать, поймёшь ты в итоге, для чего нужен Optional<T>, или нет. Я знаю, что Optional в большинстве случаев наглядней и безопасней, чем null. В кодовых базах, которые живут годами, и над которыми работают десятки-сотни инженеров, каждая ошибка стоит дорого, а любой способ уменьшить кол-во ошибок - безусловное благо.

                                      Тебе в твоём пистончике с уютненькой ide в скрипте, который ты написал в голове по пути из туалета, optional всё равно без особной надобности - без нормального компилятора и статической типизации от optional мало толку.
                                      Ответить
                                      • >Я знаю, что Optional в большинстве случаев наглядней и безопасней, чем null.
                                        Ну и знай дальше тихо, чего ты тут об этом бубнишь, если внятно объяснить не можешь? Или ты кого-то опытом в интернете на полуанонимном сайте задавить решил? :)

                                        >Тебе в твоём пистончике
                                        Мы же жаву обсуждаем, причем тут питон?
                                        Ответить
                                    • >Во время учебы
                                      Хуля ты пиздишь то а?
                                      Ответить
                                    • >>И то и другое у меня было во время учебы. Облом?

                                      Ну и каким-же это образом во время учёбы в кулинарном техникуме у тебя были проекты, связанные с программированием?
                                      Ответить
                                      • Астрологи объявили день гостя. Немотивированная агрессия выросла на 1000%.
                                        Ответить
                                        • После пребывания на этом сайте у меня к гостям исключительно плохое отношение. Я даже не хожу в гости чтоб не быть гостем
                                          Ответить
                                          • Это потому что они постоянно тыкают тебя в твою глупость и профнепригодность?
                                            Ответить
                                            • В этом месте я должен заплакать в подушечку
                                              Ответить
          • Не аргумент - можно возвращать Integer (точно не Long, if you know what I mean) который null, если инта нет, как сейчас и делается в жабе.
            Ответить
    • Optional<T> в жабе с её нуллами, это как Optional<Optional<T> >
      Ответить
      • * g o a t s e x * g o a t s e x * g o a t s e x *
        g                                               g
        o /     \             \            /    \       o
        a|       |             \          |      |      a
        t|       `.             |         |       :     t
        s`        |             |        \|       |     s
        e \       | /       /  \\\   --__ \\       :    e
        x  \      \/   _--~~          ~--__| \     |    x
        *   \      \_-~                    ~-_\    |    *
        g    \_     \        _.--------.______\|   |    g
        o      \     \______// _ ___ _ (_(__>  \   |    o
        a       \   .  C ___)  ______ (_(____>  |  /    a
        t       /\ |   C ____)/      \ (_____>  |_/     t
        s      / /\|   C_____)       |  (___>   /  \    s
        e     |   (   _C_____)\______/  // _/ /     \   e
        x     |    \  |__   \\_________// (__/       |  x
        *    | \    \____)   `----   --'             |  *
        g    |  \_          ___\       /_          _/ | g
        o   |              /    |     |  \            | o
        a   |             |    /       \  \           | a
        t   |          / /    |         |  \           |t
        s   |         / /      \__/\___/    |          |s
        e  |         / /        |    |       |         |e
        x  |          |         |    |       |         |x
        * g o a t s e x * g o a t s e x * g o a t s e x *
        Ответить
      • сразу видно что ничего ты в своей жизни не видал, кроме goatsex
        Ответить
      • Optional2<T>
        Ответить

    Добавить комментарий