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

    +65

    1. 1
    BigInteger.ONE

    Запостил: LispGovno, 17 Марта 2014

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

    • Чем не угодил 1?
      Ответить
    • поясните мысль

      Объекты BigInteger иммутабельные. Зачем оллолоцировать на куче множество копий нулей и единиц, если можно закешировать их в статических полях?
      Ответить
      • Я так понимаю, что говно не в том, где находятся копии, а в АПИ Ява-системы, в которой нельзя по-человечески ни большие числа записать, ни сложить их с чем-нибудь по-меньше. Нахер нужен BitInteger.ONE если то же самое значение можно представить и в Byte и в int и в Double? А все происходит от плохой / непродуманой системы типов, от которой это костыль.
        Ответить
        • > в АПИ Ява-системы
          что это такое?

          Я думаю, всем понятно, что складывать напрямую машинное слово и длинное число нельзя. Надо сначала привести машинное слово к длинному числу. Да, жаба не предоставляет возможности вводить кастомные преобразования типов и перегружать операторы, отчего 2+2 начинает выглядеть как:
          valueOf(2).add(valueOf(2))


          > все происходит от плохой / непродуманой системы типов
          В хаскеле хорошая, тщательно продуманная система типов. Но складывать Int с Integer она не позволяет. Потому что от неявных преобразований почти всегда больше проблем чем пользы. Но там константы не имеют конкретного типа, поэтому 2 + 2 можно писать как есть.
          Ответить
          • Дизайн АПИ системы:
            Для того, чтобы это понять, нужно сначала четко сформулировать понятие языка програмирования. Я не буду вдаваться в подробности, ограничусь только заявлением, что ЯП сам по себе не может ни в математику, ни в обработку строк, ни в определение объектов, методов, разделение окружений выполнения. Все вышеперечисленое - АПИ системы языка.
            Системы могут отличаться как количественно, так и качественно, например, система в которой есть математика по модулю но нет обычной математики просто представляет меньше АПИ, но качественно не отличается в этом аспекте. С другой стороны, система может предоставлять сборщик мусора, отладчик, различные средсва ввода-вывода, иногда даже графические примитивы, встроенные библиотеки алгоритмов, высокоуровневые конструкции языка и т.д.
            Компилятор и граматика языка - такие же элементы системы, ее АПИ.
            Мой предыдущий пост о том, что АПИ Ява системы ущербный и непродуманый, т.как заставляет:
            1. много писать (лишнего).
            2. изза непродуманости системы приводит к созданию курьезных / лишних объектов (нет и в принцыпе не может быть необходимости в BigInteger.ONE - если это же значение можно представить как уже закешированые, или не нуждающиеся в кешировании численые типы.)

            В Хаскеле хорошая система типов? Лол :) В Хаскеле одни извращения. В этом языке сделано все возможное для того чтобы максимально затруднить работу с типами только ради того, чтобы компилятору с ними было легче работать.
            Ответить
            • Я правильно понял, что система - это что-то, что предоставляет программисту набор возможностей? И, например, для Ook! и Brainfuck система та же самая?
              И да, какое (хотя бы интуитивно, если определения языка нет) место в этой системе понятий занимает язык? Это сущность, охватывающая грамматику языка, систему и API (например, в книгах по Haskell рассказывают не только про буквы, но и про соответствующую математику), или же это как раз все beginы-endы, стоящие в стороне от системы (как в .NET, где можно писать на разных языках одно и то же), или что-то другое, или по-разному бывает?
              Ответить
              • При том, что програма + интерпретатор = работающая машина Тюринга, язык, это правила интерпретации последовательностей созданых из алфавита програмы.
                Но этим описание не оканчивается, примерно так же, как на функтор между категориями можно смотреть и как на диаграму между теми же категориями, при этом, все действующие лица остаются те же, но рассматриваемый аспект - другой. Так, например, можно выделить правила граматики в отдельную групу, и рассматривать их как АПИ к языку. Это особенно актуально, если в языке есть возможность манипулировать этими правилами.
                Другие примеры: предоставление доступа к памяти в которой располагается програма (или ее данные) - то же АПИ языка (указатели в разных языках - функции этого АПИ).
                Исключения - так же можно рассматривать как АПИ системы языка, в очень похожем контексте, т.как они предоставляют АПИ функции по работе с control flow (хз. как по-русски).
                Ответить
            • > В Хаскеле хорошая система типов? Лол :) В Хаскеле одни извращения.
              Конкретные претензии в студию.
              Ответить
              • В Хаскеле нет возможности даже нормально определить функцию с произвольным числом аргументов. Нет опциональных параметров. Нет возможности вернуть больше одного значения. Нет возможности назначить значения по умолчанию аргументам, нет возможности указать аргументы в произвольном порядке.
                Все эти возможности приходится эмулировать через уебищные многоэтажные описания типов, которые не только составить сложно, но и читать потом - каждый раз глаза ломать.
                Компилятору, с другой стороны - читать эти описания не сложно, он парень привычный, и вообще, он - робот. А хачкелисты умиляются глядя на груды наворочаных описаний которые они приделывают к простым понятиям, потому что эти груды делают их важными и умными в глазах неискушенного зрителя.
                Ответить
                • > В Хаскеле нет возможности даже нормально определить функцию с произвольным числом аргументов.
                  > Нет возможности вернуть больше одного значения.
                  Естественно, потому что любая функция унарна по определению функции. Переменное число аргументов или результатов — слаботипизированная динамическая ересь.
                  > Нет опциональных параметров.
                  > Нет возможности назначить значения по умолчанию аргументам
                  > нет возможности указать аргументы в произвольном порядке
                  Потому что они ломают вывод типов. Тут или крестик снять, или трусы надеть.

                  И главное — это всё НЕ система типов, это грамматика и синтаксический сахар. Система типов — это, например, «строгая номинативная статика без сабтайпинга с глобальным выводом типов по Хиндли-Милнеру». Учите матчасть, короче. Рекомендую начать с TaPL.
                  Ответить
                  • Да, если в попе поглубже поковыряться, то можно и не таких аргументов наскрести. Но все эти отмазки не могут компенсировать факт неприспособлености языка к решению проблем специфичных для домейна програмирования.
                    Любая програма на Хаскеле выглядит как поединок из какой-нибудь американской комедии, где боец делает десять подъемов с разгибом перед тем как ударить противника. Т.е. комичность вызваная несоразмерностью затраченного усилия и эффекта. В Хаскеле все програмы выглядят так, как будто вместо того, чтобы решить поставленую задачу програмист решил доказать теорему Пифагора пользуясь только ко-конами ко-ко-морфизмов из ко-котегорий в ко-ко-котегории. А результат получился случайно.
                    Публика, конечно, увидев такое мастерство, апплодирует стоя.
                    Ответить
                    • По существу вам больше нечего сказать, я правильно понимаю?
                      Ответить
                  • Перефразируя: а нахуя использовать функции, которые унарны по определению? Ну вот нахуя, если в жизни такие функции отвественны за бесконечно маленький процент всего, что можно в жизни описать? Да, молодцы, нашли математическую систему, в которой эти правила работают, но такая система не нужна в целом, и ее (не-)работоспособность ничего не меняет.
                    Не нравится, что назвали функцией - назовите процедурой, только сделайте так, чтобы оно делало то, что нужно. Бесполезные, но правильные системы бесполезны.

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

                      Наверное потому, что через функции с одним параметром можно выразить вообще все функции. Ваш Кэп.

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

                          что посоветуете?
                          Ответить
                          • Орили издали недавно книгу про графовые базы данных (доступно для скачивания: http://p.sf.net/sfu/13534_NeoTech ) Там много пиара Нео, но пиар по крайней мере обоснованый. Куски про Сайфер - говно и очковтирательство, но зато дает практический навык убеждения ынтерпрайз лидеров, когда им нужно объяснить почему никогда и ни за что не нужно пользоваться реляционными базами данных.
                            Ответить
                            • s/Mongo/Graph/g
                              
                              https://www.youtube.com/watch?v=b2F-DItXtZs
                              Ответить
                              • Отнюдь. За Монго не стоит никакого особенного иследования / ничего такого особенного они не предлагают. Я не отрицаю того, что книга была во многом написана ради пиара одной из компаний-производителей, но тем не менее в ней есть убедительные аргументы без того, чтобы вдаваться в подробности.
                                Если нужны подробности, с детальным обоснованием нужно читать оф. публикации, например, ГрГр или ГП (я сейчас пытаюсь разобраться с ГП).
                                Единственный аргумент в пользу реляционных баз данных - это то, что они хорошо исследованы. Но исследования показали, что это бесперспективная область.
                                Ответить
                              • Ездили мы тут давеча на Хайлоад, там дубльгисовцы про использование графоСУБД рассказывали, например. Удобно, конечно, но скорость... Но у них задачи и не реалтаймовые были.
                                Ответить
                        • > ни читабельность ни скорость не могут удовлетворить даже самы скромные ожидания

                          Как весьма эффективно хранить и процессить однородные столбики чисел мне в целом понятно. Как эффективно хранить и обрабатывать большие графы с произвольными свойствами - совсем нетривиальный вопрос.
                          Ответить
                          • Кстати, о графах: http://openquery.com.au/graph/doc
                            Что скажете про этого зверя?
                            Ответить
                            • Фу, графы на реляционках нельзя делать, они же ТАРМАЗНЫЕ!

                              Ну а если по делу, то ничего про это сказать не могу. У нас свой велик с темпоральным графом объектов, хранящийся в убогой тормозной PostgreSQL, прекрасно справляющейся с нагрузкой.
                              Ответить
                              • На самом деле там не обычная таблица, а свой собственный формат. У OOGRAPH только интерфейс имитирует реляционку, чтобы можно было использовать язык SQL.
                                Ответить
                                • Смущает

                                  > stored in memory
                                  Ответить
                                  • Нашёл этот момент:

                                    The base v2 implementation acts similar to the MEMORY engine, it uses table-level locking, does not support transactions, and has no persistence.

                                    The v3 prototype implementation acts as a shim on top of an existing storage engine (such as InnoDB), thus providing capabilities such as persistence as well as allowing larger graphs.


                                    Если я правильно понял, то версия v2 предназначена чисто для вычислений, а в разрабатываемой v3 появится возможность хранить на диске.
                                    Ответить
                          • Я уже где-то описывал работу БелойБД, я с ней может и не супер-хорошо знаком, но, по крайней мере я прочитал большУю часть исходников. Ну и именно этот аспект - как бы на поверхности: в базе есть встроенных несколько типов и конвенция о том, как добавлять / сериализировать новые.
                            Смысл очень простой, очень похож на то, как посторена куча в простеньком ВМе. Хранятся указатели в таблице, указатели все одного размера, для отдельных типов - отдельные хранилища, куда эти указатели могут указывать.
                            С точки зрения скорости - не сравнимо с тем же Сиквелайтом. Т.е. разница даже не в разы, а в степени.
                            Проблема с ней в другом: полезные абстракции.
                            Я не пытался сравнивать скорости серверных ДБ разных типов, т.как мне просто нигде не нужно было. Но я знаю, что ОпенКог написали на основе Беркли графовую базу, которая должна быть и очень быстрой и навороченой. И ее в принципе можно было бы просто обернуть в какой-нибудь простенький сервер, то можно было попробовать. В любом случае такие сравнения не корректны, т.как нужно как-то относиться к затратам на передачу данных, реализацию сервера и т.д. а не самой БД.
                            Ответить
                            • > для отдельных типов - отдельные хранилища
                              > разница даже не в разы, а в степени.

                              С высоты птичьего помёта не особо верится: современная рахитектура обычно очень не любит прыгать по памяти взад-вперёт при чтении.

                              Ну и sqlite опять же с диска всё читает и транзакции поддерживает с полным ACID. А вот белочка-то ваша в шареной памяти работает, наверняка D из ACID у неё выпадает. А сравнивать работу с основной памятью и с диском ну как-то не очень спортивно. Магии не бывает. Так что пока всё в точности как в ролике про веб-скейл.
                              Ответить
                              • А мне эти транзакции вообще не нужны. Я не храню там деньги клиентов. Мне эта база нужна для работы с естесственными языками.
                                И да, нужно понимать, что сравнивать. Так вот Сиквелайт не сможет "без транзакций" и без того чтобы с диска читать добиться той же скорости (в нем можно создать ин-мемори таблицы и с ними поработать - все равно тормоз).
                                Сиквел, в принципе не пригоден для какого-либо не-тривиального поиска по базе. Он умеет только извлекать информацию, если точно знать, где она находится. На задачах типа поиска, он естесственно скатывается вникуда.
                                Ответить
                                • > А мне эти транзакции вообще не нужны
                                  > он естесственно скатывается вникуда

                                  Любому вменяемому инженеру должно быть понятно, для разных задач нужны разные модели и хранилища. К слову, к реляционным базам нередко прикручивают вполне сносные решения с биграмными индексами для нечёткого поиска. Но они сливают специализированным системам, страдающим другими недостатками.

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

                                    Я только говорю о сравнении в более-менее одинаковых условиях.

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

                                          А если к этой красивой графовой базе привернуть full ACID - она тоже начнет лагать как говно. Хотя не спорю, задачи с графами она будет решать все же быстрее, чем реляционка :)
                                          Ответить
                                          • P.S. Кстати ACID ни коим образом не привязан к реляционной алгебре, и многие нереляционные базы вполне так его реализуют (а некоторые вообще запилены на основе вылизанных и выстраданных годами бекендов от реляционок).
                                            Ответить
                                          • Так транзакции в таком смысле имеются почти везде, но не обязательно асид, и возможно с другими последствиями / другим подходом. В Нео и АлегроГрафе есть поддержка асидных транзакций, но применимость и последствия в реляционных базах данных и в графовых - совсем разные. В графовой базе данных за исключением тривиальных случаев нельзя знать наперед какие данные нужно заблокировать на время выполнения транзакции, с другой стороны нельзя в такой же степени навредить друг другу не заблокировав данны.
                                            Но смысл то не в этом, а в том, что транзакции стали вдруг аргументом в пользу реляционных баз данных, хотя напрямую с ними не связаны.
                                            Ответить
                                            • > В графовой базе данных за исключением тривиальных случаев нельзя знать наперед какие данные нужно заблокировать на время выполнения транзакции
                                              Внезапно, но реляционка тоже не знает заранее, что именно она будет блокировать во время транзакции. Там все по принципу надейся на лучшее, готовься к худшему.

                                              > нельзя в такой же степени навредить друг другу не заблокировав данные
                                              Ну подумаешь граф будет немножко неправильным из-за того, что 2 потока пытались одновременно что-то поправить в нем, кого эти мелочи волнуют... Последствия неаккуратной конкуренции везде одинаково хреновы ;(

                                              > транзакции стали вдруг аргументом в пользу реляционных баз данных, хотя напрямую с ними не связаны
                                              А вот тут спорить не буду. Они не то что напрямую не связаны, они вообще ортогональны.
                                              Ответить
                                              • > транзакции стали вдруг аргументом в пользу реляционных баз данных
                                                Транзакции стали агрументом конкретно в сравнении sqlite3 vs whitedb. Просто не надо говорить о проблемах в модели, когда речь на самом деле идёт о принципиальной разнице в качестве предоставляемого сервиса.
                                                Ответить
                                              • Нет, речь не идет о нарушении консистентости данных. Любая, даже минималистичная БД типа Белой предоставляет инструменты для того, чтобы такую консистентость гарантировать. Смысл в том, что некоторые аспекты асида не применимы к графам.

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

                                                  С моей точки зрения тут написан полный бред.

                                                  Что именно из ACID неприменимо к графам?

                                                  Атомарность?
                                                  Как спроектировать эффективный перевод денег со счёта на счёт с записью в список совершённых транзакций на графе без атомарности?

                                                  Согласованность?
                                                  Никогда не нужно гарантировать, баланс/вес ребра в графе вдруг не стал отрицательным?

                                                  Durability?
                                                  Это нормально потерять часы работы пользователей и кучу денег при внезапном отключении питания?

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

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

                                                      Как эту задачу решают в графовой субд?

                                                      Хранить сумму в нодах, посвященных счетам - привет, Денормализация, давно не виделись.
                                                      Не хранить сумму - привет, лаги при выяснении остатка на счету.

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

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

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


                                                              А можно мне код этого вореционного генератора?
                                                              Ну реально же как живой человек говорит. Долго тренировали-то?
                                                              Ответить
                                                              • показать все, что скрытоvanished
                                                                Ответить
                                                                • А Илья Муромец даёт колебания только на семью на свою. Спичка в библиотеке работает. В кинохронику ходят и зажигают в кинохронике большой лист. В библиотеке маленький лист разжигают. Огонь… э-э-э… будет вырабатываться гораздо легче, чем учебник крепкий. А крепкий учебник будет весомее, чем гастроном на улице Герцена. А на улице Герцена будет расщеплённый учебник. Тогда учебник будет проходить через улицу Герцена, через гастроном номер двадцать два, и замещаться там по формуле экономического единства. Вот в магазине двадцать два она может расщепиться, экономика! На экономистов, на диспетчеров, на продавцов, на культуру торговли… Так что, в эту сторону двинется вся экономика. Библиотека двинется в сторону ста двадцати единиц, которые будут… э-э-э… предмет укладывать на предмет. Сто двадцать единиц — предмет физика. Электрическая лампочка горит от ста двадцати кирпичей, потому что структура, так сказать, похожа у неё на кирпич. Илья Муромец работает на стадионе «Динамо». Илья Муромец работает у себя дома. Вот конкретная дипломатия! «Открытая дипломатия» — то же самое. Ну, берём телевизор, вставляем в Мурманский полуостров, накручиваем там… э-э-э… всё время чёрный хлеб… Так что же, будет Муромец, что ли, вырастать? Илья Муромец, что ли, будет вырастать из этого?
                                                                  Ответить
                                                                  • Ещё можно использовать ведро извёстки, потому что яблоки ещё не созрели. Поэтому я взял губы, засунул их в список, и соединил его с анусом. А завтра в Яунде обещали повышенный уровень компиляции и розовых бегемотиков.
                                                                    Паттерны обмазываются реляционнымм норкоманами и насилуют беременных утят. Поэтому я никогда не использую C++ и собачек. Хотя, собачек ещё можно использовать, если обернуть их три раза вокруг макроса и положить за щеку.
                                                                    А ты говоришь Илья Муромец, он никогда не использовал IDE и до 30 метров писал на PHP, но потом его вылечили. Вобщем, открываю я холодильник -- там показывали гоатсе, а ведь гоатсе -- это симол жизни, именно из-за него провели электричество в унитаз.
                                                                    Я СОЗДАЁТ ПОМЕХИ! Я СОЗДАЁТ ПОМЕХИ! О, збс, норкоманы вцикле, положи в пакетик.
                                                                    Лол, сконпелял пони из глобуса, а мистер Пропер закончился и вывел всё в консоль, ведь под лифчиком же не видно.
                                                                    Ответить
                                            • И нет никаких причин по которым реляционные базы данных должны работать быстрее. В то время, как они в большинстве нетривиальных случаев работают на много медленнее. При этом имея вообще смешные ограничения на базисные операции, типа ограничения на количество джоинов или селектов.
                                              Как бы вам понравилось программировать на языке, где нельзя сложить больше 250 чисел в цикле?
                                              В реляционных базах данных в любой более-менее нетривиальной задаче возникает необходимость построить граф, но она решается с помощью ключей в другие таблицы (вынужденных метаданных, засоряющих хранилище), или даже специальными таблицами для реализации много <-> много отношений. Но это только на уровне первоначального проектирования. Вдальнейшем же, приходится еще и денормализовать данные, чтобы как-то побороть перформанс. А это в свою очередь не только заставляет хранить лишние данные, а сильно усложняет схему хранения, синхронизацию, репликацию, и придает особое священное значение транзакциям.
                                              Графовые базы в большой степени лишены этой проблемы. Денормализация данных не требуется. В определенном типе графоых баз данных (триплеты - типа АллегроГрафа, не Нео), больше шести индексов в принципе не может быть в базе, т.е. их просто не к чему прикрутить. А вот в реляционных, опять же, приходится кусая локти выбирать индексировать ли поле или нет, пытаясь предугадать будут ли в него чаще писать или читать.
                                              Ответить
                    • > нашли математическую систему, в которой эти правила работают, но такая система не нужна в целом
                      Эта математическая система работала, ещё когда первые компьютеры не родились. Это потом уже напридумывали всяких ad-hoc-костылей «для облегчения жизни программиста».
                      Однако, чего вы опять уводите тему разговора? Речь зашла о системах типов, так вот давайте говорить о системах типов. Если, конечно, у вас есть знания и компетенция что-то сказать по теме, а не пустопорожнее бла-бла.
                      Ответить
                      • Ну и что, что она работала: попробуйте вдумчиво и без фанбойства перечитать мой пост. Проблема не в правильности а в соответствии запросов, ожиданий и возможностей.

                        И, да, все вышеописаное является следствием Карри-Ховард изоморфизма, которое было положено в основание хаскилевской системы типов, равно как и реляционная алгебра - основа реляционных баз данных.
                        Ответить
                        • > все вышеописаное является следствием Карри-Ховард изоморфизма
                          Раскройте. Что «всё», каким образом?
                          Ответить
                          • Про все последствия я писать не буду, т.как очень долго, и было бы желание, человек знакомый с предметом осуждения как-нибудь уже сам бы допер.
                            Ограничусь примером. Изоморфизм описывает соответствие между понятиями в логике и в програмировании. Одно из таких соответствий, это вывод (импликация) и тип функции. Т.как традиционно в логике вывод записывается как одна сущность, то и изоморфный ему тип функции тоже предполагает одну сущность. Изза чего, когда человек живущий по законам Карри-Ховарда видит, что функция возвращает больше одного значения, у него происходит разрыв всего.
                            Ответить
                • > Все эти возможности приходится эмулировать через уебищные многоэтажные описания типов
                  Примеры-то будут? Или только-ко-ко?
                  > Любая програма на Хаскеле выглядит как поединок из какой-нибудь американской комедии
                  А вот тут одного примера не хватит, поскольку квантор всеобщности, а не существования. Доказательства в студию, кароч.
                  Ответить
                  • Ну вот, пример где нубу рассказывают как своими руками сделать то, что в других языках за него уже сделали: http://stackoverflow.com/questions/7781096
                    Ответить
                    • В этих других языках сделали глобальный вывод типов? Сделают, поговорим.
                      Претензия из разряда «какая идиотская штука этот микроскоп, тяжёлый, в руке держать неудобно, орех на столике не закрепляется и скорлупа разлетается...»
                      Ответить
                    • пф, опять бредни упоротых на СО

                      Структура со значениями по умолчанию и удобная нотация копирования - всё что нужно белому человеку для удовлетворения редкой необходимости параметров по умолчанию
                      http://byorgey.wordpress.com/2010/04/03/haskell-anti-pattern-incremental-ad-hoc-parameter-abstraction/
                      Ответить
                      • Вот да. Но ведь проще же возопить «Фуацтой, тут нет моего до анальной боли знакомого костыля!», чем начать по-другому думать о структуре программы.
                        Что ж, ждём наездов «в хаскеле для присваивания переменных приходится громоздить уёбищные этажерки из монад, тогда как в других языках это сразу сделали нормально».
                        Ответить
                      • P.S. А может, это на самом деле положительный пример? Если в других языках, где не завезли опциональных аргументов (C, Java) приходится жить с тем, что дают, то тут, хоть и немного извратившись, можно-таки прикрутить вдруг понадобившуюся фичу.
                        Ответить
                        • Не бывает чего то исключительно хорошего или плохого. Всё лишь компромисс.
                          Ответить
          • > Но там константы не имеют конкретного типа
            Кстати в Аде тоже
            a : float := 0.1;
            b : long float := 0.1;
            c : fixed := 0.1;

            это всё ок

            (fixed - такого типа нет, но поддержка фиксированной запятой вшита в язык, такой тип можно определить)
            Ответить
            • > в Аде тоже
              и в Go тоже
              Ответить
            • А как инициализировать литералами пользовательские типы? Какой-нибудь d : complex := 0.1;
              Ответить
          • > В хаскеле хорошая, тщательно продуманная система типов. Но складывать Int с Integer она не позволяет.
            Теоретически можно не импортировать Prelude и сделать свою арифметику, с блэкджеком и неявными приведениями :) http://hackage.haskell.org/package/numeric-prelude в своё время очень впечатлил (там хоть и не слабой типизации ради, а совсем наоборот, но подход иллюстрирует хорошо).
            Ответить
            • Если пилить в Хаскеле неявное привидение. Зачем Хаскель?
              Ответить
              • Поэтому и не пилят, но какой-нибудь извращенец для себя может извратиться, если захочется :)
                Ответить
      • ага. руками.

        попытка использовать приспособленца?
        Ответить
        • Почему попытка? Насколько мне известно, библиотека жабы вся на паттернах. Наблюдатель - часть API, потоки декорируются, про фабрики вообще анекдоты слагают.
          Ответить
        • > ага. руками.
          Не понял мысль. BigInteger обычно имеет небольшой кэш (нагуглил 2 реализации, в одной было чуть более 1000 объектов, в другой - три десятка), который используется в фабричном методе BigInteger.valueOf(). BigInteger.valueOf(1) эквивалентно BigInteger.ONE, но в последнем случае нужно писать меньше букв.

          > попытка использовать приспособленца?

          Закрой книжку по паттернам и желательно больше никогда не открывай. Можешь её даже сжечь, только детям не отдавай. Паттерны не нужны. Когда на собеседованиях спрашивают разницу между Фасадом и Адаптером мне хотется взять и уебать с вертушки. Потому что это всё полная чушь и вообще не нужно.
          Единственное, ЕДИНСТВЕННОЕ, что может сделать твой код лучше - чтение чужого (хорошего) кода, изучение алгоритмов и дизайна API. Разумеется, нужно и самому писать что-нибудь полезное при этом, на хелловордах ничему не научишься. Теоретический объектно-обфусцированный дизайн и шаблоны проектирования - это игрушки для повышения ЧСВ различных бездельников.
          Идеи, которые используются во всяческих шаблонах, очень старые. И единственных способ их понять - дойти до них на практике, почувствовать необходимость в них.
          Ответить
          • >>нужно писать меньше букв

            Это специально для тех, кто пишет на жабе в блокноте?

            >>Закрой книжку по паттернам и желательно больше никогда не открывай.

            Что ж вас с крайности в крайность бросает то. Онди орут "Тру - всегда юзай", другие "некогда не юзай, сжечь,сжечь"

            >>Паттерны не нужны.

            Жаба нинужна и плюсы нинужны

            >>чтение чужого (хорошего) кода

            Поднимите руку те, кто считает, что его код плох

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

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

              > Онди орут "Тру - всегда юзай", другие "некогда не юзай, сжечь,сжечь"
              тут вроде все считают, что нужно сжечь

              > Жаба нинужна и плюсы нинужны
              согласен

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

                Ну это спорно. Опять же на вкус и цвет...

                >>тут вроде все считают, что нужно сжечь

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

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

                Это если говорить о банде четырех.

                Грасп же по сути является не наборам пттернов, а скорее рекомендаций. Я не думаю, что можно написать хороший код, в котором грасп не будет соблюдаться.

                tl,dr
                Ответить
                • > приспособленец
                  Кто такой приспособленец? Я вот, например, не знаю. Серьезно ;)
                  Ответить
                  • http://upload.wikimedia.org/wikipedia/ru/e/ee/Flyweight.gif
                    Ответить
                    • Тупо фабрика с кешем что-ли?

                      Приспособленец... Понапридумывают названий...
                      Ответить
                    • Я нихуя не понимаю на этих картинках(
                      Ответить
                      • Судя по всему, местные тоже считают УМЛ и паттерны какой-то быдлоынтерпрайзной парашей, из которой кормят индусокодерских питушков.
                        Ответить
                        • А как проектируешь ты? Сириосли.
                          Ответить
                          • Agile во все поля.
                            Ответить
                          • От мелких функций.
                            В технологию "сначала пилим главную логику, насував заглушек, потом заполняем заглушки" я не могу.
                            Ответить
                            • Да, bottom-up неплохо работает. Мне правда нравится совмещать: сначала продумать, как всё примерно должно выглядеть в итоге, а потом начинать разработку снизу вверх.
                              Ответить
                              • Вот блять, и для этой фигни тоже умное слово изобрели.
                                Ответить
                  • Или у тебя еще и UML дислексия?)
                    Ответить
                    • > Или у тебя еще и UML дислексия?
                      Естественно, я там ни одного типа стрелок не знаю, всегда догадываюсь по смыслу. И не считаю это чем-то зазорным.
                      Ответить
                  • Классический пример приспособленца это string interning ака пул строк.

                    У тебя есть 100500 объектов, но все они на самом деле один объект: просто на него много ссылок.

                    Можно еще сделать тоньше, и при первой попытке изменения оного реально [color green] создавать новый объект: получится паттерн "корова" (cow -- copy-on-write). [/color]. Ну как страницы в виртуальной памяти большинства популярных ОСов.

                    Вопрос тебе не по теме: я тут узнал что некоторые оси детектят компорты путём проб: тупо пишут по известному адресу в scratch регистр, и читают обратно.
                    Считалось -- значит есть ком порт.

                    Я удивился что никто не берет эту инфу из ACPI: разве там нет списка портов? Почему?
                    Ответить
                • > можно сказать - там приспособленец - и все поймут че там примерно есть и как оно склепано.

                  Не поймут, я гарантирую это. Вот если сказать "да тут у меня кэш объектов" - все поймут. А все эти умл диаграммы - бред сивой кобылы, из них нихрена не понятно даже если знаешь нотацию.

                  > В теории домохозяйка может освоить паттерны и писать рабочий код. Хуевый, но рабочий.
                  Домохозяйка может писать такой код и без паттернов.
                  Ответить
                  • Кстати, как оказалось после просмотра скинутой kegdan'ом диаграммки, я юзал этого приспособленца кучу раз. И не считал его чем-то особым и требующим названия...
                    Ответить
                    • А я о чем? Сколько в грудь себя пяткой не бей "Сжечь, сжечь" все равно законы логики одинаковы для всех.

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

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

                    почему то борманд все прекрасно понимает и не зная нотации

                    >>Домохозяйка может писать такой код и без паттернов

                    значит только это смутило - все остальное ок?)

                    У вас от паттернов брат умер что ли?
                    Ответить
                    • > У вас от паттернов брат умер что ли?

                      Практически. У меня куча времени уходит на попытки понять высеры студентов, начитавшихся про оопрахитектуры и создающие 10 интерфейсов и 20 классов для загрузки картинок из веба.
                      Ответить
                      • Ну это крайний случай. KISSом их по голове
                        Ответить
            • > Поднимите руку те, кто считает, что его код плох
              @bormand поднял лапу
              Ответить
              • Эффект Даннинга — Крюгера

                Вот и выходит, что учиться у тех людей, кто считает свой код хорошим - не очень хорошая идея
                Ответить
                • Привет, друг мой. Куда ты пропал, нам тебя очень не хватало. Как жизнь, как дела?
                  Ответить
                • Учиться у людей, считающих свой код говном - тоже так себе идея.
                  Ответить
                  • вот когда мухи научатся программировать, говнокод будет в почете.
                    Ответить
                    • Не научатся. У них нет денег, чтобы купить комп.
                      Ответить
                      • Если появятся деньги на комп, то не хватит на операционку.
                        Ответить
                        • ВОРУЙ
                          @
                          УБИВАЙ
                          @
                          СТАВЬ ПИРАТСКИЙ СОФТ
                          Ответить
                          • Барозо употребил пиратство, терроризм и еще что-то в одном предложении как угрозы современной Европе. Есть видео.
                            Ответить
                            • >Барозо употребил пиратство, терроризм и еще что-то в одном предложении как угрозы современной Европе
                              Путин
                              Ответить
                              • Сенсация, Путин зарегистрирован на ГК.
                                Ответить
            • >Поднимите руку те, кто считает, что его код плох
              \0
              Ответить
          • >чтение чужого (хорошего) кода
            Где найти хороший, понятный мне код? Он или непонятный, или прыщеговно какое-то.
            Ответить
            • > Где найти хороший, понятный мне код?
              стандартная библиотека на что? ладно ещё в сишке и плюсах стандартную библиотеку в глаз не вломишь (хотя изучая только интерфейс STL можно много чему научиться), но в пистоне то я уж думаю проблем с этим нет.
              Ответить
              • пистон славен качественной реализацией стандартной либы?
                Ответить
                • С моей точки зрения там нормальный код.

                  Опять же изучать код ради праздного интереса смысла мало, лучше вникать в то, с чем приходится работать и на месте извлекать уроки и решать, хороший это код или нет.
                  Ответить
                • В пистоне часть либы на сишке, часть вообще допотопная (Не наследуется object, или dict/list, там где надо. Ах ну да, путхон только недавно обзавелся интерфейсами). В части ошибки проектирования - вот какого хуя при конце потока возвращается пустая строка, а не кидается исключение? А при итерации наоборот, кидается StopIteration. Модуль socket - тонкая обертка к сишкоговну. Где конструктор, как в перле с ключевыми словами, блжад?

                  Все хочу написать путхон: фрактал плохого дизайна.
                  Ответить
              • >стандартная библиотека на что
                >понятный мне код
                Он слишком хорошо вылизан.Нормальный код так не пишут. Алсо, замечал разные отступы (пробелы с табами).
                Ответить
          • Надо все эти посты с высказываниями и афоризмами Романа о паттернах собрать в один небольшой бестиарий.
            А потом высечь в камне во всех ит-учреждениях и конторах.
            Книги же предать огню и забвению, это единственный способ остановить заразу.
            Kill it with fire. Только так можно быть уверенным наверняка.
            Ответить
            • Мне вот этот понравился: Вот если сказать "да тут у меня кэш объектов" - все поймут. А все эти умл диаграммы - бред сивой кобылы, из них нихрена не понятно даже если знаешь нотацию.
              Ответить
              • Лучший про то что паттерны инструмент позволяющий заменить 10 строк повторяющегося кода, 50 строками кода разного.
                Ответить
    • BigInteger.THE_CHOOSEN_ONE
      Ответить
    • Про паттерны: http://www.gamedev.ru/flame/forum/?id=185246
      Ответить
    • Не одним ONE едины, ещё в Java имеются: BigInteger.ZERO и BigInteger.TEN
      А в .NET есть даже и BigInteger.MinusOne
      Ответить
    • Капец. Из такого ничтожного вброса насрали на 100+ комментов.
      Ответить
      • Это wvxvw со своими простынями. Кстати, это не еще один ваш сослуживец?
        Ответить

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