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

    +73

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    private boolean isAuthorized( ExecutionResult result )
    {
        Iterator<Long> accessCountIterator = result.columnAs( "accessCount" );
        while ( accessCountIterator.hasNext() )
        {
            if (accessCountIterator.next() > 0L)
            {
                return true;
            }
        }
        return false;
    }

    Человек написал книжку по програмированию :(
    isbn:1449356265/9781449356262

    Запостил: wvxvw, 24 Марта 2014

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

    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоКогда он ее написал? До 2004, когда foreach еще не было?
      Ответить
    • Кэп подсказывает, что жабий foreach не умеет работать с Iterator напрямую. Ему нужен Iterable. В гуаве вроде есть реализация Iterable, возвращающая всегда один и тот же Iterator (можно тривиально написать самому).

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

      Если речь о самом алгоритме проверки авторизации, то это, видимо, проявление уникальных преимуществ графовых баз данных.
      Ответить
      • > В гуаве вроде есть реализация Iterable, возвращающая всегда один и тот же Iterator

        Нет там такой. По идеологическим соображениям. Можно использовать ImmutableList.copyOf(), но это просто свинство по отношению к GC.

        Скорее надо отрывать руки авторам API, возвращающих Iterator напрямую вместо Iterable.
        Ответить
        • > Нет там такой.
          Да, точно, их вроде просили, но они не сделали по идеологическим соображениям
          https://code.google.com/p/guava-libraries/issues/detail?id=796
          > отрывать руки авторам API
          Тут на самом деле сложный вопрос. Если итератор тяжёлый и лениво подгружает записи из базы, то использование Iterator вместо Iterable создаст дополнительное препятствие пользователю, желающему обойти поток дважды (ResultSet же примерно так и работает).
          С другой стороны, Iterator излишне усложняет код в типичных юзкейсах. Я бы сделал Iterable, но и дизайн с Iterator понять могу.
          Ответить
          • показать все, что скрыто>но и дизайн с Iterator понять могу.
            Жава головного мозга?
            Ответить
            • Поясните мысль.
              Если есть только итератор, любому индусу будет понятно, что дважды обойти коллекцию по этому итератору нельзя, хоть убейся.
              Если есть iterable, то многократный обход коллекции не возбраняется.
              Ответить
              • показать все, что скрыто>Lure Of Chaos
                >жаба ведет себя как девственница - "это хорошо, но это неправильно - потому откажу себе в удовольствии!"

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

                >A method to view an iterator as an iterable

                >The biggest concern is that Iterable is generally assumed to be able to produce multiple independent iterators. The doc doesn't say this, but the Collection doc doesn't say this, either, and yet we assume it of its iterators. We have had breakages in Google when this assumption was violated.

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

                  > Почему в питоне такой хуйни нет? Как же он обходится с возвратом результата из базы?
                  А ты спеку-то открывал?
                  http://legacy.python.org/dev/peps/pep-0249/
                  Курсор-то не итератор, прикинь. Фетч надо явно дёргать.
                  Ответить
                  • показать все, что скрытоМожно, но какой ценой? Блядь, ну неужели посимпатичней никак нельзя? Поэтому и лямбды у вас в 2014 году появились.

                    А что с курсором не так? Он форыч поддерживает.
                    Ответить
                    • > А что с курсором не так? Он форыч поддерживает.

                      Да, ты прав. Посмотрел типичные драйвера, они в execute возвращают итератор.

                      Однако спека говорит:
                      .execute(operation [, parameters])
                      
                      ... Return values are not defined.


                      > неужели посимпатичней никак нельзя?

                      Ну если очень хочется, никто таки не запрещает написать этот once самому
                      for (final Long veryLong : once(iter)) {
                         // ...
                      }
                      Ответить
                      • показать все, что скрытоiterable, а не iterator в терминах жавы.

                        >никто таки не запрещает написать этот once самому
                        Риально удобно, риально падсибя? Почему все более-менее удобные обертки на яве - самопальные костыли?
                        Ответить
                        • > iterable, а не iterator в терминах жавы
                          пожалуй да

                          > Почему все более-менее удобные обертки на яве - самопальные костыли?

                          Потому что разработчики стандартной библиотеки на 95% наверняка необразованные индусы. Что поделать... Видимо, все умные люди пилят низкоуровневый хардкор.
                          Ответить
                          • показать все, что скрытоЕсли ты про жаву, то там, скорее, умные люди, но в силу каких-то запрограммированных особенностей не умеющие радоваться жизни, и чтобы это поменять, им надо, как терминатору, вытащить мозг из черепной коробки и вручную переключить там тумблер.
                            Ответить
                          • показать все, что скрытоКроме сарказма ответить нечем? Засчитываю слив.
                            Ответить
                            • все логично. попробую объяснить:
                              Iterable - это такой результсет, указывает, что по нему можно итерировать, но сам итератор еще не готов
                              Iterator - собственно однонаправленный курсор, уже установленный в некоторой позиции.

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

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

        Сорри, нужно было объяснить, что result сам по себе типа Iterable<Map<String,Object>> и итератор тут вообще не нужен.

        А еще печально, что на дворе 2014, а в Яве нету стандартных any / find-if и т.д. А студентов продолжают обучать на этом говне под видом гениально спроектированых коллекций / контейнеров.
        Ответить
        • Больше уточнений: это не совсем авторизация, это проверка того, может ли администратор определенной группы получить доступ к учетке какого-то пользователя. Сказать по правде, я вообще не понимаю нахрена это все было сделано, т.как из примера выше следует, что запрос возвращает один результат, в котором содержится количество пользователей, к которым у выбраного администратора есть доступ. В Ява коде какая-то ваханалия сплошная вообще.
          Ответить
        • > на дворе 2014, а в Яве нету стандартных any / find-if и т.д

          Вот как раз в 2014 появились
          Ответить
          • Кстати, все равно уебищно сделали, так же, как и в ж.скрипте, т.е. нужно все равно, либо самому писать, либо ждать Яву 16, пока до них допрет, что фильтровать одну коллекцию - это частный случай фильтрования Н коллекций, и т.д.
            Ответить
            • http://benchmarksgame.alioth.debian.org/u32/lisp.php
              Вот когда самый шустрый лишп перестанет сливать жабке в производительности, инфраструктуре, поддержке сред разработки и даже кол-ве кода (лол), вот тогда и поговорим на эту тему.
              Ответить
              • Лол, как только обнаруживается говно в дизайне, так сразу же находятся другие аргументы, чтобы как-то отмазаться.
                Над компиляторами разных лиспов работают полторы калеки в свободное от работы время, и тем не менее из динамических языков они самые быстрый код генерируют. Это в отличие от многотысячной армии на зарплате, которая пилит Ява виртуальную машину и компиляторы.

                Кроме того, SBCL отнюдь не самый шустрый, зависит от архитектуры процессора, конкретной задачи и т.д. Арлекин писали самые лучшие лисповые компиляторы всегда, ну Аллегро тоже вроде хорошие. Rainer Joswig когда-то публиковал грид тест большинства известных реализаций. CCL гораздо быстрее обычно на АРМах, например. Но кроме того, есть куча вещей, которые эти тесты не учитывают, таких как что произойдет с програмой при наличии отсутствии определенных фич процессора, типа векторизации, СИМД, графических процессоров и низкоуровнего ПО которое с этим работает.
                Более того, такие тесты учитывает только текущее состояние вещей. Например, в Яве только в последней версии попытались сделать распараллеленый сортинг. Все остальные стандартные алгоритмы - буй. Предположим, завтра Василий опубликует собственную явамашину в которой реализует все стандартные алгоритмы заточеными под Ксю - и специально напишет тест для хорошо параллелящихся алгоритмов, ну и получит соответствующую статистику.
                Ответить
                • Java - говно, кто бы спорил.
                  Только вот CL говно не меньшее.

                  > в Яве только в последней версии попытались сделать распараллеленый сортинг

                  Параллельную сортировку можно было написать ещё на жабе 1.0. Продвинутые изкоробочные инструменты для fork-join алгоритмов появились ещё в 7 версии.

                  Как там, кстати, с тредами в анси стандарте девяносто лохматого года? Уютненько?
                  Ответить
                  • Самое интересное, что я ни разу не предлагал заменить Яву на Лисп в этом треде, но я действительно верю в то, что CL более выразительный язык (т.е. может выразить больше концепций, чем Ява).
                    Но стоит упомянуть о говне в Яве, как начинаются предьявы к Лиспу и всякие обвинения, типа медлено работает слабо распространен и прочая херня не относящаяся к делу.
                    Да, в CL нету стандарного параллелизма, и это очень плохо. А в Яве параллелизм уебищный и не пригодна к повседневному использованию - и что лучше еще не известно. Однозначно понятно что и то и другое - плохо.
                    Хорошо было сделано в Оккаме, еще до появления говна типа Явы и С++, и все, что из этого следует, так это то, что Ява была написана бездараями, которые даже современные им технологии не осилили.
                    Ответить
                    • > Ява была написана бездараями, которые даже современные им технологии не осилили.
                      Да вам как не напиши - всё равно помяните нехорошим словом.
                      Ответить
                      • Так а в програмировании с конца семидисятых ничего хорошего, или даже просто интересного и не случалось. Естесственно есть чему расстраиваться. Подавляющее большинство научных трудов в области програмирования с того времени вместо разработки новых идей занимаются тем, что латают дыры в плохой но уже существующей теории. Я не удивлюсь, если потомки через лет сто, когда это станет всем очевидно будут называть наше время "средними веками програмирования", потому что сплошной застой, реакционерство и оккультизм. Естесственно, как и в средние века, современники воспринимают ситуацию как бурное развитие, радуются каким-то вымышленым / бесполезным достижениям и т.д.
                        Ответить
                        • А вы хоть как-то пытаетесь исправить описанную ситуацию хотя бы своими стараниями?
                          Ответить
                          • Да :)
                            Года через четыре будет язык для работы с данными представленными графами, это при условии, что мое предложение рассмотрят на кафедре, найдется проф. которому оно понравится, и я таки смогу его написать, ну и заоодно может степень получить.
                            Ответить
                            • я надеюсь, речь идёт о декларативном языке запросов
                              Ответить
                              • Если смотреть на это с позиций как в учебниках определяют: язык описания и язык запросов - меня часть запросов не особенно интересует. Интересующие моменты - иерархии / гетерархии структур данных и правила их модификации построенные на двойном пушауте (хз, наверное это как-то по-другому по-русски называется).
                                Предполагается найти хорошую систему записи правил двойного пушаута, по типу как в регулярных выражениях / пег. (это в том, что касается "запросов").
                                Ответить
                        • не стоит так расстраиваться, общество инертно, и нужна критическая масса.
                          вот я, например, признаю, что я настолько идиот, что не осилил чистое ФП.

                          и да, объясните, пожалуйста, чем лисп так хорош?

                          офф: честно, лучше языка, чем JS (с некоторыми нюансами, я бы поправил) я не встречал. именно благодаря простоте и гениальной JSON нотации.
                          Ответить
                          • По поводу Лиспа: с точки зрения типографии, замечательно то, что язык опирается на минимум правил для огромного спектра задач. Хилберт и Рассел в начале прошлого века мечтали о том, чтобы описать всю математику основываясь на самом минимуме аксиом - в итоге не получилось, но человеку свойственно стремиться к универсализации, вплоть до того, что когда мы обнаруживаем более общий способ выражения, закономерность, - в мозгу случается секреция допамина :)
                            С другой стороны, когда мы уже знаем о существовании закономерности, и сталкиваемся с противоречием, дроблением, то переживаем прямо противоположные чувства.

                            JSON описывает очень мало структур данных, и еще меньше информации о них. Практически, все, что он дает это числа, обычный и экзотический (с символами) массивы и множество с операцией к другому множеству.
                            Даже об этих структурах можно было бы узнать больше непосредственно из записи. Например, какие-нибудь сведения о содержании массива, ограничивающие возможности интерпретации.
                            Можно было бы пожелать рекурсивные структуры, бесконечные структуры, структуры где, например, гарантировано, что граф ими представленый является планарным графом, или, с точки зрения инфорации о содержании, то можно было бы исследовать то, на сколько полно представлены допустимые элементы в коллекции, на сколько регулярно.
                            С практической точки зрения у JSONа есть несколько недостатков:
                            - нет комментариев.
                            - формат не поточный (чтобы распарсить, нужно прочитать все содержание).
                            - избыточная псевдографика в виде : и , (можно было ограничится пробелами).
                            - длинные строки без обрыва строки.
                            Ответить
                            • показать все, что скрыто>формат не поточный (чтобы распарсить, нужно прочитать все содержание).
                              Разве?
                              >- избыточная псевдографика в виде : и , (можно было ограничится пробелами).
                              И забыть о форматировании.
                              Ответить
                              • > > формат не поточный
                                я, кстати, тоже не вижу никаких проблем. Пулл парсеры готовые есть, читай потоком: вычитал два поля - выкини остальные.

                                Тут скорее проблема в том, что требуемые ресурсы заранее неизвестны - если бы длина и размер строк были известны заранее, парсинг шёл бы проще и быстрее, такую штуку засунули в BSON.

                                С другой стороны, писать BSON руками - мало приятного, а с JSON-ом всё ок.
                                Ответить
                                • Не поточный: создает лишние проблемы - то что можно извратиться и решить эти проблемы на 80-90% не отменяет их наличия. Зачем их вообще решать, если можно было не создавать? В том же Прологе, КИФе, Латексе, Инфо Ялмле и т.п. этих проблем просто не существует.
                                  Как бы не извращались в написании пулл-парсеров, они все равно будут говном, т.как нужно прочитать и распрарсить все без исключения данные для того, чтобы добраться до нужных данных.
                                  > выкиньте остальные
                                  камень же остынет! Потом разогревать снова!!!

                                  BSON - только чуть-чуть лучше, но, опять же написан писателями, а не читателями, которые не удосужились даже прочитать, что остальные сделали. Но удача сопутствует смелым. А смелости, как правило, больше у людей без опыта :)
                                  С JSON все ОК пока нужно решать задачи уровня крестиков-ноликов, как только задачи становятся сложнее, он вообще не пригоден. В качестве универсального формата данных - даже рассматривать бессмысленно.
                                  Ответить
                                  • > В качестве универсального формата

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

                                        Возможности представить структуру недостаточно. Мне сложно придумать структуру, которую невозможно так или иначе представить в json или xml.

                                        Важны качества самого представления - насколько оно компактное, насколько его легко понимать без специальных инструментов, насколько просто написать парсер и вспомогательные инструменты, десятки противоречивых критериев. В зависимости от конкретной технической потребности оптимальными будут совершенно разные решения.
                                        Ответить
                                        • Прям-таки: ну, давайте пройдемся по графам, все К# не представимы, вообще ни один С# не представим (мы уже не можем предствить большинство структур), кроме того, нет возможности помочь понять, что коллекция как-то упроядочена, branching factor, как полно представлен домейн из которого берутся значения и просто тут не хватит места перечислить все возможные свойства структур, которые можно было бы захотеть узнать о коллекции, но их нет возможности представить.
                                          Даже из теплолампового архаичного программирования: нельзя представить связные списки, множества.
                                          Из чего-то более нового, но не такого сложного: н-мерные латтисы. А как на счет геометрических фигур, а в 3+мерном пространстве?

                                          Ситуация с современными форматами данных похожа не ситуацию, когда все люди - деревья выстроенные вдоль экватора, и таким образом не различающие лево / право и север / юг. Просто большинство довольствуется тем, что есть, даже не задумываясь о том, что то, что есть абсолютно не соответствует тому, что может быть.
                                          Ответить
                                          • > нельзя представить связные списки
                                            <nodes>
                                              <node id="1" next ="2">x</node>
                                              <node id="3">y</node>
                                              <node id="2" next="3">z</node>
                                            </nodes>

                                            > множества
                                            <set>
                                              <elem>x</elem>
                                              <elem>y</elem>
                                              <elem>z</elem>
                                            </set>

                                            > как на счет геометрических фигур
                                            <geom>
                                              <sphere center="0.0" radius="3"/>
                                            </geom>


                                            Семантика данных не прикремлена к самим данным, но это и не нужно. Если вам этого хочется, то напишите убер-схему и передавайте её вместе с данными.

                                            > Просто большинство довольствуется тем, что есть
                                            Большинство не выдумывает себе проблем до их появления и не ищут несуществующий Святой Грааль Форматов Данных И Всего На Свете (тм), который в результате 42.
                                            Ответить
                                            • Не представляет связной список, у списка есть направление (в какую сторону он связан).

                                              Не представляет множество - как узнать нужно ли учитывать повторные элементы или нет?

                                              А каким стандартом зарезервировано тег sphere, и где посмотреть все остальные зарезервированые, а как быть с S# (3+мерными сферами? тагов тоже бесконечное количество зарегистрировали? Как прочитать такой стандарт дальше буквы S?)
                                              Ответить
                                              • > у списка есть направление
                                                какое направление, акститесь, все односвязные списки одинаковой длины изоморфны. Бывают двусвязные, но не суть

                                                > как узнать нужно ли учитывать повторные элементы или нет?

                                                Очевидно, при чтении создавать множество и складывать туда элементы. А вот как узнать, что байты стрима не побились?

                                                > А каким стандартом зарезервировано тег sphere, и где посмотреть все остальные

                                                в урле xml-схемы в начале документа

                                                > как быть с S# (3+мерными сферами?
                                                добавить атрибут размерности, вложить координаты, в которых сфера существует.

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

                                                  > какое направление, акститесь,
                                                  Список - частный случай направленного графа (лоза), но направление у него никуда не пропало. Из вышеприведенной записи не понятно что с этой херней делать, опять же, если компьютер не телепат.

                                                  > добавить атрибут размерности, вложить координаты...
                                                  Где, в каком документе это описано? Кто об этом узнает не будучи телепатом?

                                                  И да, когда-то, много лет назад я работал в конторе которая вещала видео из бразильского казино в Европу :) Флешевый формат тогда создателям организации показался ненадежным, и они переписали обертку ФЛВ, мегаудобно подсибя. Я потом это реализовывал в клиенте этого... игрового сайта. И скажу вам откровенно, написав реализацию ФЛВ и Ф4В - там нет абсолютно ничего сложно, более того, эти форматы еще проще даже JSONа.
                                                  Придумать что-то такое - не то что выдающихся инжинерных способностей не нужно, вообще никаких способностей не нужно.
                                                  Ответить
                                                  • > эти форматы еще проще даже JSONа
                                                    так они и должны быть проще жсона, я на это и намекал - нахрена семантика и валидация там, где важна скорость, простота и компактность?
                                                    Ответить
                                                    • Ну так из этого же не следует, что все данные просто устроены, а все форматы простые?
                                                      Например, есть жизненная необходимость научиться нормально представлять изменения в СКВ, коммерческую информацию предприятия, музыкальные предпочтения брачующихся и желающихся забрачиться, влияние взаимного расположения аминокислот на эффективность лекарственных препаратов и т.д. И простота форматов типа JSON / XML тут выходит боком, потому что приводит к самопальным несовместимым, противоречивым, требующим специфического знания реализациям.
                                                      Одна из причин, по которым провалилась идея Веб3.0 - то что они выбрали в качестве универсальног формата ХМЛ, который просто не в состоянии справится с возложеной на него миссией.
                                                      Ответить
                                            • Остальное от... хз, как по-русски, unimaginative attitude. Кстати, что интересно, если уж говорить о "национальном характере", то очень типично для граждан бывшего совка: "если у меня этого нет, то это никому не нужно". Не то, чтобы этого больше нигде не было, но можно встретить человека в электричке в Хонг Конге говорящего по-китайски, и услышав такое отношение безошибочно определить в нем бывшего гражданина 1/5 части, не так давно покинувшего эту самую часть.
                                              Это то, что делает "бывших", куда бы они не иммигрировали, крайне правыми реакционерами-фундаменталистами.
                                              Ответить
                                              • > если у меня этого нет, то это никому не нужно
                                                > очень типично для граждан бывшего совка
                                                >> А мне эти транзакции вообще не нужны. (c) http://govnokod.ru/15505#comment221945

                                                .
                                                Ответить
                                                • Правильно, заметте, что я говорю: мне не нужны, без претензий на весобщность, на запреты кому бы то ни было - в отличие от попыток навязать всем читающим одну точку зрения основаную только на безпримерной узости кругозора.
                                                  Ответить
                                  • показать все, что скрыто> В качестве универсального формата данных - даже рассматривать бессмысленно.
                                    Не, ну понятно, что для гигабайтов данных лучше юзать базу данных. На размерах до пары мегабайтов (пока все помещается в память) он работает - а это распространенный юз кейс.
                                    Ответить
                                    • Речь не о гигабайтах, размер - только одна из характеристик данных, применимая только к фракции данных, и вообще, если говорить о формате представления - не очень интересеная характеристика (большинство представлений стараются ее убрать из непосредственного описания структуры).
                                      Ответить
                                      • показать все, что скрытоОт размера зависит подход. До нескольких мегабайтов нет проблем полностью считывать в память и полностью перезаписывать при изменении.
                                        Ответить
                                        • Это мягкое с теплым. У JSON нет ограничений на размер, равно как и у других перечисленых здесь форматов. Размер может быть только интересен если бы какой-то из форматов мог избежать дублирования данных. Как просто размер - нет, не интересен.
                                          Ответить
                                          • показать все, что скрытоБлин, размер данных определяет подход - можно ли читать целиком в память, нужен ли индекс.
                                            Ответить
                                            • Нет, не определят он ничего такого. Размер - это просто одна из тысяч характеристик данных, далеко не самая полезная. Что определяет возможность читать потоком - синтаксис языка, которым данные записаны, и только это.
                                              Книжку написаную естесственным языком можно читать потоком не зависимо от того одна в ней страница, или стотысяч. ХМЛ нельзя читать потоком не важно, один таг из четырех символов или стотерабайтный файл.
                                              Ответить
              • самая большая разница где-то в два раза.

                учитывая что SBCL это даже не JIT, это что-то о моще Lisp'а все таки говорит.

                ЗЫ колонка расхода памяти как всегда "радует".
                Ответить
                • > учитывая что SBCL это даже не JIT
                  разумеется, SBCL это даже НАТИВ (не всё так просто, но, во всяком случае, не исполнение байткода)
                  Ответить
                  • Я видел что SBCL генерит и это в принципе байткод. Что само по себе и не так плохо.

                    Подобная же фигня и с Erlang'ом. Он как бы официально интертрепатор, но многие случаи настолько соптимизированы, что интертрепативности и не видно.
                    Ответить
        • Оооооо! Я понял задумку автора! а дело-то вот в чем: родной iterator() у Map вернет итератор не того типа, а вот asColumn вернет точно тот же самый итератор но из функции помеченой как <T> Iterator<T> asColumn(). Вот автор и решил продемонстрировать гибкость и удобство Явовской системы типов. Очевидно годы ынтерпрайз программирования по кодстайлам лучших домов Лондона и Филадельфии сказались...
          Ответить
          • Хотелось бы увидеть ваше решение проблемы. Если в мапе могут лежать разные объекты, как избежать постоянных даункастов от объекта при работе с мапой?
            Типизированная вьюшка колонки - вполне приемлимое решение. Только раз уж сам результат - Iterable, можно и вьюшку было сделать Iterable.
            Ответить
            • А я не говорю, что у меня есть лучшее решение, я говорю, что Ява говно, в чaсности ее система типов изза которой нет возможности нормально сравнить объекты разных типов.
              Ответить
              • > нет возможности нормально сравнить объекты разных типов.
                "lalka".equals(111)
                Ответить
                • И что это даст? Long все равно не равен int даже если они равны.
                  Ответить
                • Ты не понимаешь, у нормального языка должно быть минимум четыре предиката равенства.
                  Ответить
              • И правильно. Хочешь сравнить - приводи к одному типу.
                Ответить
                • >приводи к одному типу.
                  например, к boolean
                  Ответить
                • Да, только не нужно забывать, что между значениями и типами нет биекции. А попытки упростить, типа как это сделано в Яве в итоге приводят к когнитивному диссонансу. И, нет, не нужно приводить к одному типу, это выражение не корректное, т.как исходя из вышесказаного, я могу определить два типа А и Б, и сделать так, что значения а и б будут одновременно а:А и а:Б, б:А и б:Б, при том, что будучи интерпретированы как тип А оба, будут равны, а если как тип Б то будут неравны.
                  Интуитивно, нужно приводить к общему самому широкому типу, но типы Лонг и Инт не ковариантны по-настоящему и не контраварианты. Поэтому "точного правильного" ответа в этой ситуации нет, если следовать хаскелеподобному выведению типов (в Яве оно такое же, но инструменты отличаются). Нужна другая парадигма, которая лучше описывает поведение програм.
                  Ответить
                  • При проектировании новых парадигм не забывайте только о 64-разрядных регистрах и прочих неинтересных низкоуровневых железках.

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

                        Система типов в хаскеле почти никак не связана с жабьей, отличия колоссальные.

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

                        Если кто-то считает, что неявно проверять в рантайме границы конвертируемости и кидать рантаймовые ошибки в случае косяков в системном коде - это хорошая идея, то не пойти ли бы ему в жопу с такими идеями.
                        Ответить
                        • Система типов в Яве такая же как и в Хаскеле. Есть разные инструменты, но суть та же.
                          Где система типов построена на тех же основаниях, но с принципиальными различиями: например в Эйфеле. Там методы могут быть коварианты в типах аргументов.
                          Где система в корне другая:
                          - нетипизированые языки, Форт, ПЛ и т.п.
                          - языки, где под "типом" подразумевается что-то совсем другое: J, Пролог, Эрланг, Лисп.
                          Ответить
                          • > Система типов в Яве такая же как и в Хаскеле.
                            Статическая, да. А у лиспа, по такой логике, типизация такая же, как у питона, синтаксис такой же, как у XML, а мощность такая же, как у брейнфака.
                            Ответить
                            • Нет, типизация другая, тип можно определить используя функцию-предикат, аналогичной возможности в Питоне нет. Синтаксис у ХМЛ не такой же, т.как не может выразить как минимум рекурсивные структуры.
                              Мощность такая же, как и у брейнфака, тут не поспоришь.
                              Ответить
                              • > Синтаксис у ХМЛ не такой же, т.как не может выразить как минимум рекурсивные структуры

                                А можно поподробнее?
                                http://stackoverflow.com/questions/148988/recursion-in-xsd-schemas
                                Ответить
                                • Это рекурсия в схеме, а не в данных. Разница такая же, как возможность рекурсии в функциях в Яве, но отсуствие такой возможности в типах.
                                  Ответить
                                  • Ну тогда исходное утверждение также не верно. sexpr никогда нельзя зациклить, зациклить можно только конс-ячейки в рантайме, а это уже не синтаксис.

                                    в хмле тоже можно в каком-нибудь сериализаторе объекты семантически зациклить, xml-то от этого бесконечно большим не станет.
                                    Ответить
                                    • #1=(foo #1#)
                                      Ответить
                                      • Нет лиспа, кроме коммон, и wvxvw пророк его?
                                        Ответить
                                      • показать все, что скрытоReader macros != sexpr, не?
                                        Ответить
                                        • Reader macro - это правило языка. Sexp - это синтаксичесая единица. Естесственно это разные вещи. А еще есть например, числа и комментарии, например. О чем собственно вопрос?
                                          Ответить
                                          • показать все, что скрытоНу, ты что-то говорил про бесконечные sexpr'ы. Здесь я бесконечного sexpr'а не увидел. Во что он там развернется во время компиляции - немного другой вопрос
                                            Ответить
                                            • Можно цитату про бесконечные sexp'ы? Я говорил про рекурсивные данные. Разница заключается в том, что рекурсивный != бесконечный. Данные != sexp.
                                              Ответить
                              • > Нет, типизация другая
                                Ну если брать только свойства, общие для хачкеля и жабы, а остальное игнорировать (а ведь при нормальных условиях в первом можно тоже много чего наопределять, чего нельзя во второй), то и лисповая становится питоновской!
                                Ответить
                                • Нет, это говорит о том, что разница между тем, как реализованы типы в Яве и Хаскеле - на уровне синтаксиса и некоторых инструментов, но при желании, можно найти ваш такой любимый изоморофизм. А между другими системами такого изоморфизма не найти.
                                  В Питоне типизация такая же как в Яве / Хаскеле, с поблажками (когда система не в состоянии выразить тип, она его заменяет специальным типом "любой"). В Лиспе есть аналогичный механизм, но аналогичный механизм есть и в Яве и в Хаскеле. В Лиспе система качественно другая. В ней можно выразить типы которые нельзя выразить в Яве / Хаскеле / Питоне, и возможно, нельзя выразить что-то из Явы / Хаскеля / Питона.
                                  Ответить
                                  • > можно найти ваш такой любимый изоморофизм
                                    Ну так покажите. Это вы заявили, что он там есть, а бремя доказательства лежит на утверждающем. В противном случае придётся с сожалением констатировать, что ваши разглагольствования про типы – бред.
                                    Ответить
                                    • http://programmers.stackexchange.com/questions/167975
                                      Тут описана принципиальная разница между реализациями. Если у вас есть вопросы по реализации эквивалентного механизма в одном из языков - попробуйте сами его придумать, а лучше сначала в Гугл, там уже, как правило, есть.
                                      Ответить
                                      • Это такой тонкий ход – кинуть ссылку, подтверждающую слова оппонента? В общем, я всё ещё жду доказательств изоморфизма.
                                        Ответить
                  • показать все, что скрытоТаки не понял, в чем проблема конвертировать к более мощному типу и сравнить?
                    Ответить
                    • Очень просто, между типами А и Б из предыдущего примера может не существовать отношения "более мощный".
                      Ответить
                      • показать все, что скрыто>но типы Лонг и Инт не ковариантны по-настоящему и не контраварианты
                        А это что?

                        >А попытки упростить, типа как это сделано в Яве в итоге приводят к когнитивному диссонансу.
                        А в чем упрощение? Жава и другие языки проверяют на идентичность обьектов, если больше ничего не знают.
                        Ответить
                        • > А это что?
                          Ковариантность имеет смысл только для полиморфных типов. Long и Int к ним не относятся, так что они действительно ни те, ни другие, но я не понимаю, при чём тут вообще -вариантность.
                          Ответить
                          • показать все, что скрытоВот я тоже этого не понял. Один без проблем приводится к другому.
                            Ответить
                            • показать все, что скрытоА вот хуй там. Жабьи Integer и Long не кастуются друг в друга обычным кастом (в отличие от int и long). И сравнение Integer.valueOf(42) и Long.valueOf(42) тоже скомпилится. И даже Integer.valueOf(42).equals(Long.valueOf( 42)) вернет false.
                              Ответить
                              • > А вот хуй там.
                                всего несколько простых правил объясняют все:
                                1. расширение (примитивных) типов делается автоматически неявно
                                2. сужение типов требует явного каста, здесь легко отстрелить себе обе ноги с хуем заодно
                                3. арифметические операции неявно расширяют типы до "дефолтных" int и double, поэтому перемножить байты и присвоить байтовой переменной без явного каста не выйдет
                                4. объекты, в частности, обертки Int и Long, по equals сравниваются сначала по типу,
                                поэтому
                                > И даже Integer.valueOf(42).equals(Long.valueOf( 42)) вернет false.
                                5. и самое отвратительное: автоупаковка и распаковка типов, там вообще много интересных нюансов, которые любят спрашивать на экзах и собеседованиях
                                Ответить
                                • показать все, что скрыто> автоупаковка и распаковка типов
                                  Вот если бы не она - все остальное было бы хоть и неудобным, но по крайней мере мало-мальски логичным.

                                  А в плюсике вообще таятся стрингбилдер и неявный toString() ;)
                                  Ответить
                                  • Стрингбуилдер в плюсике?
                                    Ответить
                                  • кстати, на каждый плюсик свой стрингбилдер. вообще, подглядывать байткод временами бывет жутко интересно.
                                    например, как реализован свитч по строкам :)
                                    Ответить
                                    • показать все, что скрыто> как реализован свитч по строкам
                                      О да, это эпично...
                                      Ответить
                                    • показать все, что скрытоКак захардкоженый хешмеп? И что тут эпичного?
                                      Ответить
                                      • показать все, что скрыто> Как захардкоженый хешмеп?
                                        Как отдельный анонимный класс с захардкоженным хешмапом, емнип.
                                        Ответить
                                      • показать все, что скрытоКстати, а как оно уживается с рандомизированной хеш-функцией, которая на разных машинах должна давать разные результаты?
                                        Ответить
                                        • показать все, что скрыто> Кстати, а как оно уживается с рандомизированной хеш-функцией, которая на разных машинах должна давать разные результаты?

                                          Какая в жопу разница, какая там используется хеш-функция? Это же никак не влияет на работу хешмапа, кроме производительности.

                                          P.S. Или ты подумал, что захардкожено = сохранено прям low-level представление этой мапы? Не, там че-то совсем банальное типа Map<String, Integer> заполняемого put'ами в статическом конструкторе.
                                          Ответить
                                          • показать все, что скрыто> P.S. Или ты подумал, что захардкожено = сохранено прям low-level представление этой мапы? Не, там че-то совсем банальное типа Map<String, Integer> заполняемого put'ами в статическом конструкторе.

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

                                            Сейчас скомпилил свич по строкам - действительно получился switch (str.hashCode()) и добивание коллизий ифами. hashCode() для String'а, емнип, в стандарте жабы прописан, и не может быть рандомизированным... http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29
                                            Ответить
                                            • http://java-performance.info/string-switch-performance/#more-775
                                              Свитч по строкам не нужен. Для больших размеров есть мапа.
                                              Benchmark                           Mode   Samples         Mean   Mean error    Units
                                              t.CallTest.testEqualsIgnoreCase    thrpt        10     4338.513      153.786    ops/s
                                              t.CallTest.testEqualsLowerCase     thrpt        10     7602.722      746.926    ops/s
                                              t.CallTest.testJava7Map            thrpt        10  2147853.317    45741.062    ops/s
                                              t.CallTest.testJava8Map            thrpt        10  2339853.845    10194.687    ops/s
                                              t.CallTest.testSwitchCall          thrpt        10   896876.772     5740.585    ops/s
                                              Для маленьких - if.
                                              Benchmark                           Mode   Samples         Mean   Mean error    Units
                                              t.CallTest.testEqualsIgnoreCase    thrpt        10  3722062.950    96314.315    ops/s
                                              t.CallTest.testEqualsLowerCase     thrpt        10  1399947.402    11651.113    ops/s
                                              t.CallTest.testJava7Map            thrpt        10  2640137.150    17767.132    ops/s
                                              t.CallTest.testJava8Map            thrpt        10  2673449.940    13438.176    ops/s
                                              t.CallTest.testSwitchCall          thrpt        10  2653356.312    22085.341    ops/s
                                              Ответить
                                          • показать все, что скрыто>Какая в жопу разница,
                                            Хешмеп-то захардкоженый.
                                            http://www.benf.org/other/cfr/java7switchonstring.html

                                            >hashCode() для String'а, емнип, в стандарте жабы прописан, и не может быть рандомизированным...
                                            Как тогда атаку на хеш-коллизии лечили?
                                            Ответить
                                            • показать все, что скрыто> Как тогда атаку на хеш-коллизии лечили?
                                              А ее лечили?
                                              Ответить
                                            • показать все, что скрытоВот на русском http://programador.ru/java-7-continu/
                                              Ответить
                                            • показать все, что скрыто> Как тогда атаку на хеш-коллизии лечили?
                                              Ну могу предположить (не гуглил), что ее можно вылечить на уровне самого хешмапа, не трогая hashCode в 100500 классах. Для этого, походу, достаточно ксорить результат hashCode со случайным числом, сгенеренным при создании мапа.

                                              На switch по строкам этот фикс не повлияет, т.к. там один хрен отдельная реализация. И ключи фиксированные и доверенные (т.к. вбиты в исходнике).
                                              Ответить
                                              • показать все, что скрыто>Для этого, походу, достаточно ксорить результат hashCode со случайным числом, сгенеренным при создании мапа.
                                                Это не убирает проблему подбора строк с равными хешкодами.
                                                Ответить
                              • показать все, что скрытоО чем вы тут спорите.
                                Ответить
                  • > между значениями и типами нет биекции
                    Если значения и типы только те, которые можно хранить на компьютере, то есть ;-) Но это ничего не даёт.
                    P.S. Но на самом деле я подозреваю, что термин «биекция» всего лишь был употреблён не в тему – примерно как «ковариантность» рядом.
                    Ответить
                    • Значения и типы - абстрактные понятия.
                      Оооо, раскажите пож. как не в тему? А то с таким апломбом херню всякую пишут, ну ка, знающий человек, просветите.
                      Откуда возмется биекция, когда у одного значения есть 1 и больше типов?
                      Как обычно херня в защиту любимого языка, ничего нового.
                      Ответить
                      • > Значения и типы - абстрактные понятия.
                        Да, но я-то говорил про конкретные комповые, такие как вышеприведённые Int и Long, а в абстрактной теории типов свои тонкости, конечно.
                        > Откуда возмется биекция
                        Ну, тут всё просто – программ на компьютере счётное множество → представимых на компьютере значений и типов счётное множество → все счётные множества биективны по определению.
                        > когда у одного значения есть 1 и больше типов?
                        Для каждого натурального числа есть ваще дофига дробей, где она числитель, однако ж множества натуральных и рациональных чисел биективны ;-)
                        > А то с таким апломбом херню всякую пишут
                        Вот да, только в зеркало глянуть не забудьте.
                        Ответить
                        • > в защиту любимого языка
                          Скорее – в защиту любимой науки, потому что нехрен выдумывать свои и подменять чужие понятия, это контрпродуктивно.
                          Ну и почему -вариантность не в тему, я уже в другом посте сказал. Так и в ситуации «для каждого значения может быть более одного типа, которому он принадлежит» (хоть это и совсем другая песня, и опять-таки зависит от аксиоматики, и к ЯП это имеет крааайне посредственное отношение) можно было так и сказать, а не приплетать математически некорректное (см. выше) здесь понятие, чтобы выглядело умнее.
                          Ответить
                        • показать все, что скрыто> программ на компьютере счётное множество
                          > представимых на компьютере значений
                          Да ну? Какие же они счетные? Они же конечные.
                          Ответить
                          • И какова же его мощность? ;-) Поскольку все компьютеры разные, для описания свойств произвольных программ удобнее брать счётность, как нам завещал ещё дедушка Тьюринг. Ну блин, ну вот не получается у меня сказать, что множество, скажем, односвязных списков конечное.
                            Ответить
                            • показать все, что скрыто> И какова же его мощность? ;-)
                              Ну у каждого компа своя. А на самом деле комп даже не является машиной тьюринга, т.к. у него лента не бесконечна ;(

                              P.S. Ну ок, если считать компом машину тьюринга - то счетное.
                              Ответить
                              • > Ну ок, если считать компом машину тьюринга - то счетное.
                                любой комп способен не более, чем машина тюринга, сколько бы там лент или регистров не было (внешние устройства не учитываем)

                                все дискретные пространства счетны
                                Ответить
                        • А откуда такая уверенность в том, что отношение одного множества к самому же будет биекцией? Нет к этому никаких ограничений. Например, возьмем Z2: {0, 1} и мы можем с его помощью создать отношение, которое посылает 0 к 0, 0 к 1 и 1 к 1 - и получим не биекцию.
                          Ответить
                          • именно, что биекция и есть тип отношения, неважно к каким множествам оно применимо
                            Ответить
                            • Я это учил по-английски. В моем теплом и уютном мире биекция это отношение которое сопоставляет каждому эелементу в домейне единственный элемент в кодомейне. Т.е. отношение в Z2 {(0, 1), (0, 0), (1, 1)} биекцией не является. Если это по-русски как-то по-другому называется, тогда я имел в виду то другое слово.
                              Ответить
                              • ну это аналогично sql:
                                если соотношение 1:1 - то это биекция
                                N:1 - сюръекция
                                1:N - инъекция, как раз
                                > отношение в Z2 {(0, 1), (0, 0), (1, 1)}
                                Ответить
                • > И правильно. Хочешь сравнить - приводи к одному типу.
                  точнее, расширяй. либо пиши свои правила равенства, но ассоциативность необходимо сохранять
                  Ответить
        • показать все, что скрытоДык скажи спасибо, что не на делфи. И да, для обучения он проще сишарпа, имхо.
          Ответить
      • показать все, что скрытоvanished
        Ответить
      • показать все, что скрытоА нахрена писать что-то возвращающее итератор, а не итерабле? Только если писалось до 2004.
        Ответить
    • а по мне, говно в том, что коллекцию вообще пробегаем только для того, чтобы выяснить, нет ли в ней хоть одного "правильного" элемента.
      Ответить
      • показать все, что скрытоКстати да, вот такой вопрос тогда возникает - описываемая в книжке СУБД не умеет в банальную фильтрацию результатов?
        Ответить
        • Умеет, умеет, я уже где-то выше описал, что по результатам запроса результат всегда будет в количестве одна штука, не больше ни меньше.
          Ответить
    • показать все, что скрытоНи для кого не секрет, что сейчас прирост мускул — процесс, занимающий массу времени и труда. Дело не только в физических нагрузках, но и в том как питаетесь. Это самый важный момент, закладывающий фундамент отличного телосложения. Даже профессиональные спортсмены для улучшения обмена веществ или просто для набора мышечной массы прибегают к применению пищевых добавок. Практически они безвредны и показаны к употреблению врачами. Об одном из примеров таких добавок мы и поговорим. <a href=http://пептиды.in.ua/products/igf-1-long-r3---igtropin>Купить препарат IGF LR3 в Киеве. Доставка по Украине.</a>

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

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