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

    +87

    1. 1
    return (o1.isRecomend()? "true":"false").compareTo(o2.isRecomend() ? "true" : "false");

    Запостил: elfenit, 26 Августа 2011

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

    • Точно не синтетика?
      Ответить
    • Очень оригинально... Как по человечески воспроизвести такое поведение даже сложно сказать. Может, так:
      return Boolean.valueOf(o1.isRecomend()).compareTo(Boolean.valueOf(o2.isRecomend()));
      К сожалению, читабельность осталась на том же уровне.
      Ответить
      • Короче (но для Java5+):
        return ((Boolean)o1.isRecomend()).compareTo(o2.isRecomend());
        Ответить
        • Судя по документации, до java5 Boolean не реализовывал Comparable. Ваш вариант наглядней, просто я стараюсь избегать неявной упаковки/распаковки.
          Ответить
        • а так:
          return o1.isRecomend() ^ o2.isRecomend();
          Ответить
    • К сожалению, не синтетика. Обнаружено в коде аутсорсеров в процессе code-review. Нужно было
      return Boolean.valueOf(o1.isRecomend()).compare To(o2.isRecomend()) roman-kashitsyn, абсолютно точно)
      Ответить
      • Они никогда не ищут легких путей.
        Ответить
      • Как человек не пишущий на Java... Java сама не приведет типы при !(x ^ y)?
        Ответить
        • Так-то оператор отрицание неприменим к аргументам типа int.
          Ответить
        • к чему приведёт?
          Оператор ! - оператор отрицания и работает только с boolean.
          Оператор ^ - оператор побитового XOR и работает только с интегральными типами.
          В java нет автоматического преобразования из int в boolean.
          Ответить
          • http://stackoverflow.com/questions/726652/creating-a-logical-exclusive-or-operator-in-java

            Судя по этой дискусси вы не совсем правы по поводу того, как работает ^, но мне просто не на чем проверить, да и спрашиваю только из праздного любопытства.
            Ответить
            • Да, вы правы, с boolean этот оператор тоже работает. Но преобразования из int в boolean не происходит, а метод compareTo возвращает целое число со знаком.
              Ответить
            • Кстати, в той же дискуссии упоминается, что для boolean оператор ^ эквивалентен гораздо более наглядному != :)
              Ответить
          • !x ^ !y
            Ответить
        • Если следовать правилу - все что не нуль - истина, то в Java достаточно заменить XOR на ==.
          если x и y - нули или числа равные, то при XOR получится 0. Значит ложь.
          После выполнения оператора отрицания получилась бы истина.
          x==y
          Ответить
          • Именно потому, что вариант с == не был изначально использован, я предположил, что isRecomend (кстати, интересное название...) может вернуть null или вообще какие-то типы только отдаленно родственные boolean. Вот и подумал, а может быть ^ сам и приведет к нужному типу.
            Ответить
            • isRecomend() как раз возвращает железно либо true либо false. == не был изпользован потому, что нужно получить порядок, а не true/false. То есть нужно как бы "сравнить" две boolean величины и вернуть 1 в случае, когда первая больше, -1 - если первая меньше, 0 - если обе величины равны. true ">" false.
              Ответить
              • Подозрение, что можно было сделать проще
                Ответить
                • как?
                  Ответить
                  • if(first){//first = true
                    if(first^second) return 1; //true^false = true
                    }else//first = false
                    if(second) return -1;
                    return 0;
                    Ответить
                    • И всё же две упаковки и вызов compareTo понятнее, чем вложенный условный оператор и XOR.
                      Ответить
                      • Я вот только не понял одного. Как вы возвращаете значения -1.0.1 с помощью compareTo?
                        "true".compareTo("false") = 14
                        "false".compareTo("true") = -14
                        Или далее вы просто смотрите если вернется не нуль, то положительное или отрицательное?
                        Ответить
                        • -1,1 - для примера, тут могут быть любые числа с тем же знаком. Главное - знак.
                          Ответить
                          • Уже ради интереса - а как далее используется результат этого метода?
                            Ответить
                            • Обычно результатами этого метода пользуются коллекции (TreeSet, TreeMap, Collections.sort(), etc.) для упорядочивания своих элементов. Если элементы коллекции имеют естественное упорядочивание (т.е. реализуют Comparable), коллекции не нужно передавать на вход компаратор, всё работает "из коробки".
                              Ответить
                    • if(f){
                      if(s)
                      return 0;
                      return -1;
                      } else {
                      if(!s)
                      return 0;
                      return 1;
                      }
                      Ответить
                      • точнее наоборот
                        if(f){
                        if(s)
                        return 0;
                        return 1;
                        } else {
                        if(!s)
                        return 0;
                        return -1;
                        }
                        Ответить
              • Ба... тогда возникает вопрос, а зачем автор вообще boolean возвращает, если он ему не нужен (в isRecomend).
                В том смысле, что (наверное) можно было бы сделать так:
                return (int)ob1.isRecomend() - (int)ob2.isRecomend()
                Но если метод isRecomend изначально должен был использоваться в такой ситуации, то и не понятно почему он boolean возвращает, если в принципе нужно число.
                Ответить
                • Такое преобразование недопустимо.
                  Ответить
                • Этот код сравнивает два объекта: o1 и o2. В конце сравнения нужно сравнить два поля типа boolean. Это вовсе не значит, что у isRecomend() имеет неправильную семантику.
                  Ответить
                  • Он имеет неправильную сематнику, т.как написан с ошибкой :), либо is - аббревиатура имеющая сакральный смысл, известный только автору (input stream или internet security - мало ли).
                    В том смысле, что он и грамматически и синтаксически не понятен. Т.е. у автора не сложилось ни спряжение ни правописание. Поэтому узнать из того, что написано о чем думал автор нельзя - есть много разных вариантов.
                    Ответить
                    • is - соглашение об именовании JavaBeans для полей булевого типа. Любой java-программист сразу узнает эту идиому. Recomend, конечно, криво написан (наверное, правильней Recommended), но это уже мелочи. Я лично сразу понял, о чём идёт речь.
                      Ответить
                  • Вот еще пример: International Service Reco (итальянец, или испанец назвавший своим именем контору) mend! И в таком контексте true / false который возвращает функция могли бы значить починила ли контора (что-то) или нет.
                    Ответить
                    • Вы уже откровенно сочиняете.
                      Ответить
                      • Я это говорю к тому, что ошибку можно исправить разными способами:
                        recommends()
                        recommended()
                        isRecommended()
                        Заметьте, что recommended() и isRecommended() - это не одно и то же семантически. Первое - использует переходной глагол (подразумевая, что объект действия, это объект владеющий методом), а второе - страдательный залог, что подразумевает, что объект владеющий методом был рекомендован кем-то. Т.е. o1 recommends you should stop smoking; o1 recommended you should stop smoking a while ago; o1 is, in fact a pack of cigarets, cigarets are not recommended by the ministry of health care.
                        Ответить
                      • ЗЫ. Recomend звучит как название лекарства, ну, по-крайней мере такая мысль пришла бы в голову англоязычному человеку.
                        Ответить
                        • Правильно в данном случае было бы isRecommended(), причем именно с is из-за JavaBean, да и из-за грамматики так-же. Но на самом деле, это здесь не очень критично, потому что смысл понятен из сущности в реальном коде.
                          Ответить
                          • Это, кстати, хороший пример получился о вреде и некомпетентности обязательной статической типизации :) Т.как простым решением было бы привести тип к нужному типу и использовать онтимание, а статически заданые типы во-первых были не нужны, во-вторых оказались инвариантыми - и это-то для базовых типов! Не говоря уже о том, что пришлось написать кучу дополнительного кода.
                            Ответить
                            • Статическая типизация тут не причём. Просто boolean - примитивный тип. В языке, в котором все данные - объекты, можно было бы написать
                              o1.isRecomend().compareTo(o2.isRecomend())

                              в принципе, и в java можно было бы так написать при использовании обёртки Boolean. Примитивные типы нужны для повышения производительности.
                              С этой задачей вроде бы неплохо справляется Scala 2.8: для программиста всё выглядело бы как объекты, я компилятор бы занимался оптимизацией упаковок-распаковок.
                              Ответить
                              • Ну да, не при чем, конечно, только почему-то в языках с динамической типизацией можно использовать boolean там где нужно число и наоборот - я в замешательстве, как же так? :)

                                Да, и, опять же, вы написали ненужный код, да и вообще compareTo это следсвие невозможности динамической типизации. Перед тем, как отвечать - послушайте выступление Steve Yegge на Googl'овской конференции, должно быть где-то на YouTube.
                                Ответить
                                • А это хорошо, то что в языках с динамической типизацией это можно? Я считаю что нет. Во всяком случае, в тех приложениях, которые обычно реализуются на Java. Поэтому холиварить на эту тему можно бесконечно.
                                  Ответить
                                • А что хорошего в том, что можно использовать boolean там, где нужны int? В C, например, вместо boolean - int, и это один из основных источников глупых ошибок.
                                  Проблема не в статической типизации как таковой. Попробуйте haskell - там очень строгий контроль типов (даже Double и Int сложить просто так нельзя), и, тем не менее, код очень краток и выразителен, а типы обычно можно вообще не указывать. А развитый полиморфизм позволяет проделывать такие трюки, что дух захватывает.
                                  Я не против динамической типизации. Я слышал много доводов за и против, и считаю, что оба подхода имеют право на жизнь. Реалии таковы, что в больших проектах (а java обычно используется именно в таких) статическая типизация подходит больше. Компилятор - это друг и помощник, а не враг, снижающий продуктивность. И чем больше проект, тем больше компилятор может сделать для вас.
                                  P.S. Для написания небольших программ, выполняющих административные задачи, я, естественно, выберу python, а не java. Sometimes java is too verbose.
                                  Ответить
                                  • В данном конкретном случае - хорошо, об этом же и речь. Т.как функция возвращает boolean, но он вам не нужен, и вы мучаетесь придумываете как же так сделать, чтобы это было число, но статическая типизация вам не дает. Т.е. результат он вот, перед вами, а вы идете десятой окольной дорогой к нему (и в итоге делаете в принципе то же самое, все равно).
                                    Кроме того, выступление о котором я говорил - это примерно на час, а вы ответили раньше :)
                                    Ответить
                                    • Эм... Мы не мучаемся. На самом деле, для опытного java-разработчика ответ обычно очевиден: Boolean.compareTo() (просто вариант немного многословен из-за упаковки примитивов). Мучаются те, кто плохо знает java, в этом вся соль поста. Думаю, пора закрыть эту тему.
                                      Ответить
                                      • Опытный - это типа "бывалый" - жизнь его уже на столько изнасиловала, и он привык жить в искаженной реальности, что ему и штаны через голову одеть ни по чем? :)
                                        Ответить
                                    • >Кроме того, выступление о котором я говорил - это примерно на час
                                      я набрал в гугле "Steve Yegge", на первой странице был результат c заголовком "Steve Yegge is an idiot". Поиск по видео "Steve Yegge google" дал что-то, связанное с Javascript на сервере (наверное, опять задвиги про Node.js). Дальше желания искать не было. Жалко тратить час на очередной silver bullet, есть дела поинтереснее.
                                      Ответить
                                      • В том, что есть назначеная цель, назовите ее "идеал", и за возможность максимально приблизится к этоми идеалу жертвуется нерационально много, в то время как "идеал", на самом деле - филькина грамота, и либо не достижим в принципе, либо к нему и стремится даже не нужно. Но я вам в одном предложении не отвечу - послушайте лекцию, там человек, гораздо лучше меня владеющий материалом, на пальцах объясняет для студентов.

                                        Ха-ха-ха... это, между прочим, человек много лет проработавший в Google, профессор в как минимум одном из самых престижных университетов США (в области программирования). Таких людей надо в лицо знать, а не в Google искать :)
                                        Ответить
                                        • В таких случаях нужно давать прямой линк. Никакой профессор, где бы он не работал, не докажет мне, что динамическая типизация "лучше" статической. Подозреваю, что он приведёт пяток примеров, где статическая типизация в стиле C/java - sucks, а динамика - рулит, оставляя у слушателей чувство просветления. И умолчать о другом пятке примеров, где динамика в жопе. Давайте линк, посмотрю.
                                          Ответить
                                          • http://www.youtube.com/watch?v=tz-Bb-D6teE

                                            Это, кстати, наряду с предыдущим утверждением: "я не читал / не слышал, но это говно" тоже замечательно отражает позицию типичного Java программиста :) "Мне все равно, какие аргументы существуют, я останусь при своем идиотском мнении, потому что я к нему привык / меня так научили". Не задумываясь о том почему и на какие деньги научили...
                                            Ответить
                                            • Если уж такая херня понеслась, то уважаемый wvxvw: назовите нормальный язык программирования! :)
                                              Ответить
                                            • > я не читал / не слышал, но это говно
                                              я такого не говорил. Я просто сказал, что переубедить меня не получиться, потому что я сам уже всё попробовал на практике. Динамическая типизация НЕ ЛУЧШЕ статической, у каждого подхода есть свои плюсы и минусы, и каждый более выгоден в определённых условиях.

                                              > меня так научили
                                              Меня "учили" в основном высшей математике и инженерии. Программирование в основном основано на самообразовании, разве нет?

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

                                              P.S. за ссылку спасибо, посмотрю.
                                              Ответить
                                            • wvxvw:
                                              Ну не принимает он вашего мнения, чего уж из-за этого так беситься? ЧСВ?
                                              Ответить
                                              • "В интернете кто-то неправ!" (с)
                                                Ответить
                                                • Я говорил про людей принимающиx суждения за факты - они идиоты. Лучший язык? Lojban :P
                                                  Ответить
                                                  • То что для кого-то факт для другого не более чем предположение.

                                                    Срошу иначе: лучше динамическая типизация или статическая?
                                                    Ответить
                                                  • >Я говорил про людей принимающиx суждения за факты
                                                    Факты заключаются в том, что операционные системы и всякий крупный софт типа офисных пакетов пишется и будет писаться на статически типизированных языках.
                                                    В то время как никто не будет писать скрипты для html-страничек на ANSI C.
                                                    Ответить
                                                    • Проблема известная... и хорошего ответа пока что человечество не изобрело, или он мне не известен. Представьте ситуацию, есть объект типа Child, со свойством age. Когда свойство age станет больше, например, 18, то объект станет типа Adult. Java и похожие языки такого в принципе сделать не могут, т.как нельзя поменять объекту тип. Динамические языки не смогут определить тип вовсе. Т.о. в Java код с таким объектом будет работать только пока значение age не противоречит типу объекта, а в JavaScript такой код будет работать и тогда, когда объект вообще не должен был использоваться. Есть разные вариации на тему, в Python, CL, Erlang, но по-прежнему однозначно лучшего - нету. Не придумали пока еще :)

                                                      Что касается Java - то это была стратегия Sun, которые очень уж хотели соревноваться с Microsoft, и вкладывали безумные деньги в продвижение языка, не взирая на технические показатели. Вот и получилось, что менеджеры по продажам сработали лучше программистов (Sun за этот счет собирались продавать свои сервера). Нет ничего приниципиально хорошего, или такого, что бы сделало Java самым подходящим для "серьезных" програм, это все как-бы пропаганда / маркетинг в лучшем случае... Мне несколько лет довелось побыть в customer advisory board дгугого крупного производителя ПО, можете мне поверить, технические соображения никогда не выдвигаются на первый план, да и вообще не влияют на принятие решений...
                                                      Ответить
                                                      • Ну, пожалуй вообще не должно быть иерархий типа Adult, Child.

                                                        Вы сами только что сказали: ответ не известен.

                                                        Поэтому ваши фразы "...о вреде и некомпетентности обязательной статической типизации..." и "...только почему-то в языках с динамической типизацией можно использовать..." ничем не могут быть подкреплены.
                                                        Т. е. вы не можете сказать, что статическая типизация - однозначно зло, а приведение boolean к int - однозначно добро. Но при этом, сами фразы построены так, будто бы это истина в первой инстанции.

                                                        Нет идеальных языков. В Java для приведения boolean к int надо сделать кое-какие телодвижения. И не более того. В других языках хватает своих косяков. За все надо чем-то платить. Так устроена жизнь.

                                                        Человек, считающий, что есть один универсальный язык программирования не может восприниматься всерьез.
                                                        Ответить
                                                        • Более того, сложно воспринимать человека, утверждающего, что самые успешные и востребованные языки в мире - убогое говно.
                                                          Ответить
                                                      • Я вообще не вижу смысла создавать классы типа Embryo, Child, Adult... Ибо каждый объект имеет состояние, а Child, Adult - лишь состояние объекта и то лишь в удобной для нас словесной форме - не более того.
                                                        Ответить
                                                        • SmackMyBitchUp, tir:
                                                          Опять же, вы спорите с классическими примерами... тут не обсуждаются другие варианты решения... вам демонстритуется проблема, когда свойство объекта изменяясь должно повлечь за собой изменение типа. Более глобально это выражается в том, что система типов в ОО языке - иерархическая, как правило построенная по принципу "ярлыков", т.е. о принадлежности объекта к типу судят по ярлыку, а не по содержанию. Это неизбежно прийдет в конфликт с действительностью, где о типе судят по содержанию / типов может быть столько, сколько аспектов.

                                                          roman-kashitsyn Что до моих утверждений - вы аппелируете к ничего не значащему факту, количество одновременно заблуждающихся людей не делает заблуждение более истинным (более того, если это не заблуждение, то и не делает его более ложным) оно просто не релевантно. Курение на протяжении почти ста лет считалось полезным для здоровя, много столетий люди верили, что у Моисея росли рога на голове, не смотря на то, что это была просто описка переводчика. И история массового идиотизма этими двумя фактами не ограничивается. Увы, человечество чаще допускает ошибки, чем принимает правельные решения.
                                                          Более того, я прямо сейчас наблюдаю то, как невероятными усилиями и вливаниями средсвт, абсолютно не взирая на технические предпосылки, одна мега-корпорация продвигает ущербную технологию просто из исключительно меркантильных соображений, в то время как потрясающее количество уважаемых людей поддерживают и не поморщившись подвердят любую глупость сказанную маркетологами этой самой корпорации.

                                                          tir: что-до единственного языка :) Я предполагал, что вы поленитесь посмотреть что это за язык, это вобщем-то не язык программирования, но шутка была даже не в этом :) Если вы подумали, что я каким-то образом считаю, что JavaScript лучше Java - то вы ошиблись. Ровно точно так же, как если бы вы предположили, что если в классе мальчиков не меньше девочек, то их обязательно больше.
                                                          Ответить
                                                          • Да, все вокруг глубоко заблуждаются.

                                                            Джошуа Блох, идеолог java, "много лет работающий в google". Никлаус Вирт, автор Pascal, Modula и Oberon'а, ставшего прародителем Java. Бьёрн Страуструп, автор С++. Торвальдс, автор сладкого Linux. Кёрниган и Ричи, родители UNIX и ANSI C. Дональд Кнут, всю жизнь работающий с императивными процедурными языками, подаривший нам Art of Programming и TeX. Они все ошибались.

                                                            Ваши "проблемы" опять высосаны из пальца и ничего не доказывают. В контексте реальной задачи нашлось бы множество решений этой проблемы в рамках парадигмы OOP (скорее всего даже наследование было бы ненужным), более безопасных (быть может, более гибких), чем простая реализация на динамическом языке, но требующих чуть больше кода.
                                                            Ответить
                                                            • Я еще как-то мог найти связь между Java и теми, кого вспомнили до Страуструпа, не включая его - а дальше, список имен замечательных людей, которые не имеют к Java отношения... И тем не менее, какими бы замечательными они ни были, от их количества ничего не изменится. Если вам нравится не думать, а принимать на веру - я уже говорил, что я думаю о людях принимающих суждения за факты :)
                                                              Ответить
                                                              • Они имеют отношение к статической типизации.
                                                                Ответить
                                                              • > Если вам нравится не думать, а принимать на веру
                                                                Мне нравиться делать. Языка и со статической, и с динамической типизацией позволяют сделать очень много, причём обычно они друг другу не мешают и позволяют подходить к проблемам с разных сторон. Чем больше с вами общаешься, тем больше складывается ощущение, что вы больше теоретик, нежели практик.
                                                                Ответить
                                                            • PS.
                                                              http://www.pbfcomics.com/archive_b/PBF052-Kitty_Heaven.gif

                                                              История статической типизации в иллюстрациях.
                                                              Ответить
                                                          • Не поверите: я не поленился и посмотрел. Фразой про языки я всего лишь хотел сказать, что будь он хоть статическим, хоть динамическим, хоть каким хитросделанным он все равно будет со своими проблемами и изъянами. И решая одни задачи и проблемы, он будет неспособен решить другие. И дело тут не в типизации.

                                                            П. С. С естественными языками тоже самое.
                                                            Ответить
                                                            • Смотрите... когда-то давно в художественной школе был у меня преподаватель по живописи, одна из любимых фраз у него была - `труп конкурента хорошо пахнет' :) Чего мне вас переубеждать-то? Мне как бы за это не платят, а за рецензии о продуктах, за которые вы тут рубашку рвете - платят, при чем не плохо :)
                                                              Ответить
                                                              • wvxvw:
                                                                Тот факт, что общество стало цивилизованее говорит лишь о том, что люлей можно получить более цивилизованным способом xD
                                                                Ответить
                                                              • Когда мне интересен язык, я не читаю рецензии о продуктах. Я устанавливаю компилятор/интерпретатор, читаю книгу и пишу код. И тут уже становиться ясно, что хорошо, а что плохо.
                                                                Ответить
                                                              • Рецензии? Вы критик что ли??? ))))))) Блин, сразу бы сказали ))) Киньте ссылки на ваши рецензии, а то что-то тут скучно становится )
                                                                Ответить
                                                                • Вот я и смотрю, @wvxvw на практикующего программиста мало похож... Склад ума какой-то гуманитарный.
                                                                  Ответить
                                                                  • Вы не поняли, книга - это тоже рецензия.
                                                                    Мне не особенно приятно вспоминать о том, что мне предлагали в этом поучавствовать. Собственно, в моем случае, от меня даже не требовалось писать ничего, просто попросили подписаться под "цитатой", которую я, естесственно, не говорил. Как бы есть еще такой момент... самые упрямые спорщики - это футбольные болельщики, люди которые верят в правоту какой-то политической партии, приверженцы какой-нибудь религии, X-box / PS2 фанаты, ну и Java программисты :) В каждом случае причина такого поведения в том, что спорщики не понимают о чем спорят, именно поэтому ими легко манипулировать.
                                                                    Java появилась потому, что в Sun хотели создать рынок сбыта своим разработкам. Программистов в то время было, хорошо если 1% по отношению к сегодняшнему состоянию, обучение программистов было долгим и затратным. Таким образом Java стала своего рода PHP своего времени - максимальное упрощение интерфейса и реализации, только ради того, чтобы больше людей научилось на ней писать. С расчетом на то, что когда таких людей станет очень много, продавать технологии основанные на Java будет кому. Кроме того, Sun действительно нанимали лучших / самых известных программистов того времени для работы над языком, но если вы почитаете отзывы того времени, а не отзывы написанные людьми в мире, где Java уже была суровой действительностью... вы увидите, что в целом реакция была недоумением по поводу того, как столько хороших людей сделали такую гадость. Ну а потом это стало сильно напоминать историю России 20-го века с гегемонией пролетариата и единственной, самой лучшей партией :) Так же появлялись мировые религии и футбольные клубы... единственными, кто в этой группе выглядит пристойно - разработчики игровых приставок, они хотя-бы за шутки по этому поводу не лезут в драку.
                                                                    Ответить
                                                                    • Что за дебильная привычка сравнивать то время и сейчас? Из-за таких вот людей до сих пор многие считают, что Java ужасно тормознутая.

                                                                      В конце концов: никто здесь не говорит, что Java - это единственный правильный язык и круче него нет.

                                                                      И вообще вся дискуссия завязалась с фразы, что языки со статической типизацией ущербны. И Java здесь не при чем.

                                                                      П. С. А маркетинг есть маркетинг. И уж Sun в чем-то обвинять глупо.
                                                                      Ответить
                                                                      • "Маркетинг есть маркетинг" - выражение не несущее никакой семантической нагрузки - вот что вы сейчас написали? Масло маслянное? Ну и что? Зачем вы это написали?
                                                                        Глупо Sun в чем-то винить? - почему? Фраза "X глупо потому что Y" имеет смысл. Фраза "X глупо", если причина не очевидна - называется демагогией.
                                                                        Ответить
                                                                        • т. е. по основной части у вас возражений нет.

                                                                          Глупо обвинять Sun в том, что "в Sun хотели создать рынок сбыта своим разработкам. ... С расчетом на то, что когда таких людей станет очень много, продавать технологии основанные на Java будет кому..."
                                                                          Ответить
                                                                    • По-моему, речь давно уже не идёт о Java как таковой. Мы говорили о "вреде" статической типизации, разве нет? Раз уж вы заострили внимание на Java, поговорим о ней.
                                                                      Я лично никогда не считал себя "Java-программистом". Да, я зарабатываю неплохие деньги, программируя на Java. Но я знаю ещё несколько языков, динамических и статических, и если завтра мне предложат работать в Google с условием сменить Java на C/python/haskell/lisp (хотя в google широко используют java, но это не важно) - я соглашусь без колебаний (кому я там нужен... но это тоже не важно). Меня всегда интересуют идеи, которые я могу использовать в своих программах (immutable data, data-driven development, Design pattern, actors), а не песни маркетологов.
                                                                      И так, между прочим, java родилась в небольшой лаборатории в глубине Sun, когда один из основных разработчиков устал писать один и тот же код для разных микроконтроллеров, и стала передовым языком не из-за брут-форса Sun, а из-за простоты освоения и распространения программ в internet в виде аплетов. Java в теперешнем её виде - дитя сети, правда, из аплетов она перебралась на серверную сторону. Java хорошо справляется с решением многих проблем, для программирования создана прекрасная инфраструктура. Я могу запускать скомпилированные программы на любой платформе. Поэтому мне нравится java.

                                                                      > спорщики не понимают о чем спорят
                                                                      Да и вы не понимаете, о чём спорите, вы ведь не пишете на Java. Только те, кто много программирует на языке могут в полной мере судить о его достоинствах и недостатках.
                                                                      Ответить
                                                                      • Java - это самый активный сторонник статической типизации. И да, изза этого ущербный язык. Т.как то, как в нем сделана типизация не отражает отношения между типами, которые мы наблюдаем в окружающем мире. Она построена на упрощенной модели, при чем, если в некоторых случаях от упрощения никто не страдает, то в других от такого подхода страдают, в первую очередь, те, кто на этом языке пишут, во вторую - те, кто используют продукты.
                                                                        Тут даже скорее не проблема с тем, что в Java это так (в тех же регулярных выражениях модель еще проще), а в том, что это подается как универсальная модель, и когда указывают на ее недостатки, люди отказываются их видеть. Собственно, поэтому пример с футбольными болельщиками, соцреализмом и религиозными фанатиками.
                                                                        И не важно как начиналась... ту Java, которая была в лабораториях никто не видел, кроме работников лабораторий. Если бы она продолжала в том же духе, то сегодня людей, которые пишут на Java было бы столько же, сколько и людей пишущих на Erlang, хорошо если. Мы имеем то, что имеем благодарая огромным финансовым вложениям Sun. Собственно, Joel Spolsky тогда же об этом писал. У него была статья где он говорил про commodity и о том как разные промышленники этого добиваются и для чего используют. Java там была одним из примеров. Я сейчас, увы, ссылку не найду.
                                                                        Ответить
                                                                        • > Java - это самый активный сторонник статической типизации
                                                                          LOL
                                                                          Ржу нимагу
                                                                          Ответить
                                                                        • Как статическая типизация может быть недостатком языка со статической типизацией?!!

                                                                          Почему автомобили не летают в космос? Да потому, что автомобиль - это автомобиль, а не космический корабль. И он должен ездить по земле, а не болтаться на орбите.

                                                                          Кто подает это за универсальную модель? Вы верите всему, что показывают по телевизору? Вы верите во все, что прочитали в интернете? Вы верите рекламе?

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

                                                                          А Джоэл тот еще... Java-ненавистник :)
                                                                          Ответить
                                                                          • Ох, стоит только на день уехать... :)
                                                                            Мне тут как раз на днях попался хороший пример. Вы, наверное никогда не задумывались над тем, что слово "мы" глупое / неоднозначное. И это потому, что нельзя сказать, а значит ли оно "ты и я", или "тот парень и я, но не ты". Удивительно в этом то, что индейцы племени Чироки и жители Папуа Новой Гвинеи (прямо скажем, папуасы), не зависимо друг от друга зафиксировали этот факт в своих языках. Более того, если им приходится учить, например, английский, то они просто не могут жить без своих местоимений. Исследователи, поразмыслив над фактом пришли к мнению, что папуасы вообще-то правы, а все языки индо-европейской группы - ущербные. И представьте, что индо-европейские языки существуют несколько тысяч лет, по сравнению с этим существование Java - вообще ничего.
                                                                            Что такое "правильно" - это когда теория (абстракция), примененная к любым фактам, которые мы можем найти в действительности дает такой же результат, как и сама действительность. Например. Вы решили описать мир исходя из того, что в какой цвет окрашено. Вы создали класс "Цвет", унаследовали от него все цвета радуги, белый и черный. Вле больше конкретизируя, вы дошли до создания класса "Снег", и вы сделали его подвидом класса "Белый". Вышли с утра на улицу - посмотрели, снег белый. Спросили у знакомых - говорят, белый. Но вечером возвращаясь с работы увидели, что, в местах, где фонарей нет - снег серый, а там, где фонари есть - желтый, взяли прибор ночного видения - посмотрели, а он вообще, в одних приборах - зеленый, в других - красный... Так вот, проблема в том, что тип, в реальном мире определяется контекстом, и привязать его к объекту, как ярлык, как это сделано в Java (и многих других похожих языках) не правильно. По-этому в таких системах есть дополнительные возможности для типизации. В Java - интерфейсы. Но со снегом будет проблема, т.как если вы реализуете в одном классе интерфейсы "Белый" и "Черный", то определить цвет вы уже не сможете...
                                                                            Ответить
                                                                            • Ущербен не язык, а то, как глупо вы его используете. Наследование нужно редко, композиция гораздо гибче и выразительнее. К примеру, в случае снега белый цвет - атрибут, а не "родитель" снега. Для смены контекста вполне подойдёт экземпляр класса "фильтр", изменяющий цвета для наблюдателя.
                                                                              Ответить
                                                                              • показать все, что скрытоСледуя примеру большинства отметившихся в этой ветке: вы спорите потому, что умеете пользоваться клавиатурой, а не потому, что вам есть что сказать.
                                                                                Ответить
                                                                            • если все языки ущербны, то зачем заострять внимание на каком-то одном?

                                                                              соглашусь с roman-kashitsyn: то как вы предлагаете использовать наследование - глупо. очень глупо.
                                                                              Ответить
                                                                            • К тому же, непонятно, каким местом всё это относится, к примеру, к реализации стека TCP/IP. Вам не кажется, что обвинять инструмент в том, что он не решает задач, для которых он не предназначен - глупо? Универсальный швейцарский нож никогда не будет лучше хорошего набора специализированных инструментов.
                                                                              Ответить
                                                                            • > "правильно" - это когда теория (абстракция), примененная к любым фактам, которые мы можем найти в действительности дает такой же результат, как и сама действительность.

                                                                              Каждый из нас склонен считать, что видит явления такими, каковы они есть в действительности, что он объективен. Однако дело обстоит совсем не так. Мы видим мир не таким, какое он есть, а таким, каковы мы сами, – или же таким, каким настроены его видеть.

                                                                              Яркий классический пример: кого вы видите на изображении?
                                                                              http://dl.dropbox.com/u/24433581/s.gif
                                                                              Ответить
                                                                            • Ммм....зачем же вы так все усложняете(Белый<-Снег)
                                                                              Есть снег. Его цвет - белый. Всё. А уж как отрисовать картинку со снегом - дело совсем другого класса.
                                                                              Лично для меня - имя класса не может говорить о состоянии объекта. Вообще никак. Имею в виду состояние конкретного объекта. Тот же снег. Его цвет варьируется, это понимает каждый и все что нужно - узнать цвет или текстуру. Я же могу предложить сделать подобным образом:
                                                                              Snow white_snow = new Snow("white.png");
                                                                              И так далее. А вы начинаете плодить классы которые имеют огромные ненужные пересечения и единственный плюс от которых - ярлык(по-сути это ничто ради таких жертв). Лично мне было бы неприятно видеть подобную картину(все переработано ибо наследовать класс снега от конкретного цвета это жуть):
                                                                              Snow<-BlackSnow
                                                                              Snow<-WhiteSnow

                                                                              А вообще - вам правильно сказали - существует композиция
                                                                              Ответить
                                                                        • > Java - это самый активный сторонник статической типизации

                                                                          Вы далеки от истины как никогда.
                                                                          Ответить
                                                                    • >wvxvw
                                                                      1)Вы считаете, что инструменты(языки) упрощать не нужно? 2)Не нужно инструменты специализировать под задачу, дабы ими можно было проще и эффективнее пользоваться? 3)Вы противник только Java или есть ещё языки, ненавистные вам?
                                                                      Ответить
                                                                      • Нет, не нужно упрощать, нужно делать правельно. Если можно сделать правельно и проще, значит нужно выбрать последнее, если нельзя сделать правельно и просто, но можно правельно и сложно, нужно выбрать правельно и сложно, но нельзя выбирать неправильно и просто.
                                                                        Ответить
                                                                        • "Если сон - это не сон, а сон - это пересон, то не сон - это пересон" (с)
                                                                          Ответить
                                                                        • Что значить "правильно"? Каковы критерии "правильности"?
                                                                          Ответить
                                                                        • Что есть мерило правильности? Когда для кого-то что-то будет правильным, для других это будет неправильным. И оба эти взгляда будут верны.
                                                                          Ответить
                                                                        • Все, хватит. Вы уже похожи на динамического тролля
                                                                          Ответить
                                                                          • Zheng Qiao писал что, "The world is of the opinion that those who know Chinese characters are wise and worthy, whereas those who do not know characters are simple and stupid".
                                                                            Собственно, я с вами всеми согласен, всем всех благ и творческих подвигов.
                                                                            Ответить
                                                                            • Вы, как всегда, вывернули всё на изнанку (говорю же, гуманитарное мышление). Чтобы рассуждать о прелести или уродстве китайского языка, надо ЗНАТЬ КИТАЙСКИЙ ЯЗЫК. А вы рассуждаете у сферических джавах в вакууме, произведённых "злой" компанией Sun (между прочим, жалко Солнышко).
                                                                              Ответить
                                                                              • Это не про китайский язык вообще-то, ну только косвенно. Эта фраза используется японцами примерно так же, как русскими "Красная Армия всех сильней". Дело в том, что у японцев есть очень ярко выраженое чувство исключительности основанноя на двояком прочтении канджи (китайских пиктограм), т.е. у пиктограм есть названия и значения, в японском, это, в большинстве случаев, разные слова. А сторонников каны (фонетического письма) считают шарлатанами, а за ромаджи (фонетическая транскрипция латинскими буквами) - так вообще расстрел. Не смотря на то, что с практической точки зрения все бы только выиграли от узаконивания последнего.
                                                                                Проблема усугубляется тем, что японские промышленники, которые делают текстовые редакторы, печатают книги и т.п. не хотят использовать латиницу, т.как это поставит их в ситуацию, когда они будут конкурировать с иностранными компаниями. Естессвенно, делать им это очень не хочется, и, это потенциальные убытки.
                                                                                Аналогичная ситуация с Java - она ничем не лучше, и ни по каким критериям не должна была бы быть "стандартом в промышленности", ее поддерживают в таком состоянии заинтересованные компании, у которых tool-chain поменять стоит очень дорого, да и делают они продукты для Java-программистов... Точно такая же ситуация с JavaScript... мне просто последнее по роду деятельности чаще приходится слышать - вот, один из заседателей верховного жюри честно в этом признается:
                                                                                http://www.youtube.com/watch?v=Kq4FpMe6cRs
                                                                                Ответить
                                                                                • Похоже, вы пишите на каком-то "идеальном" языке для "идеальных" машин которые умеют понимать и предугадывать ваши ожидания. Скажите, наконец, что конкретно вы предлагаете в замену существующим промышленным языкам? Common Lisp?
                                                                                  Ответить
                                                                                  • Common Lisp, в теории, мог бы подойти, но он очень отстал от жизни, чтобы он мог полноценно заменить Java, нужно провести реформу, которая бы упорядочила отношения с файловой системой, внесла ясность в то, что делать, когда приложение общается с пользователем не через REPL и еще куча исторических проблем... это всем известные проблемы, но никто ими не занимается потому, что некому, а никто не станет ими заниматься, потому, что никто ими не занимается...
                                                                                    Кроме того, если бы я предлагал перейти на какой-то другой язык, я бы так и сказал :S Есть языки, которые сегодня развиваются, и они пытаются принять в рассчет недостатки существующих. Названия вам вряд ли о чем-то скажут. Я, сейчас пытаюсь познакомиться с ERROL, но это язык запросов к базам данных. Причина того, что эти языки создаются - ущербность существующих. Совсем не нужно иметь лучший заменитель уже существующего, чтобы понять, что существующий - плохой...
                                                                                    Ответить
                                                                                    • а Clojure не пробовали?
                                                                                      Ответить
                                                                                      • Clojure - так они ничего нового в смысле типизации не делают, ну только добавили зачем-то логический тип. Scala - это для тех, кому Java с первого раза мало показалось? :) Она, конечно, по-своему замечательна... но в смысле типизации ее изобретатели ничего нового не отркыли.
                                                                                        Просто в существующих языках система типов очень упрощенная по отношению к тому, как оно вообще может быть. Нет возможности выразить следующие отношения, например: типы в принципе не совместимы (в Java любой класс может реализовать любой интерфейс, а в жизни два типа могут быть взаимоисключающими). Типы только частично совместимы, но существуют объекты принадлежащие только к одному из них. Типы совпадают, но линии наследования не совпадают. С другой стороны, в жизни бывают ситуации, когда в зависимости от контекста один и тот же объект будет типа не совместимого с другим, а в другом контексте - именно того типа, с которым он был до этого не совместим.
                                                                                        Кроме того, есть технические ограничения - имена свойсвт у двух объектов могут быть одинаковыми, при этом указывая на разные вещи.
                                                                                        Чтобы написать эффективно работающую программу нужно уметь отразить действительное состояние вещей. Взамен этому Java и похожие языки предлагают формализм не похожий на реальность. Программирование в смысле уровня понимания окружающего мира находится примерно на стадии человеческой мысли середины 19-го века, когда метафизическая [трансцедентая] картина мира доминировала. Т.е типы в программировании не могут выразить дуализм, динамизм и т.д. Это удобная концепция для того, чтобы примерно объяснить многие явления, но соотносится с действительностью, как Верлетова физика с физикой. Статическая типизация никогда не позволит этого сделать.
                                                                                        Ответить
                                                                                        • Java - язык общего назначения для инженеров, а не язык для философствующих эрудитов. Инженеры решают описанные вами проблемы разработкой DSL для конкретной задачи, учитывающего все нетривиальные взаимодействия и ограничения, и переложив бремя философии на эрудитов, подобных Вам.
                                                                                          Мы с Вами никогда не придём к общему мнению, слишком разный уровень мышления. Поэтому предлагаю закончить этот бессмысленный спор.
                                                                                          Ответить
                                                                                    • Мне кажется, у вас не получается продуктивно писать ни на одном из языков, и вы склонны винить в этом языки, а не себя.
                                                                                      Ответить
                                                                                      • О, ну раз вы так хорошо в типах разбираетесь. Скажите пожалуйста, является ли демагогия видом популизма, или популизм видом демагогии? Имейте в виду, что оба понятия в одинаковой степени применимы к вашим высказываниям, но не взаимозаменимы (т.е. то, что вы до этого писали можно использовать в качестве примера). Bonus points: напишите функцию на Java, которая принимает аргументы типа и только такого типа, как `популизм' либо `демагогия'. Покажите, что другие софизмы эта функция не принимает. :)
                                                                                        Ответить
                                                                                        • Вы много выпендриваетесь, в этом ваша проблема. Если кто-то из нас двоих демагог, так это вы. Если вам нужно оперировать софизмами, используйте Prolog или функциональный язык. Хотя какой от этого практический смысл, мне судить сложно.
                                                                                          Если инструмент не удобен для решения каких-то задач, это не означает, что он плох. Это означает, что кто-то пытается завернуть в стену гвозди отвёрткой.
                                                                                          Ответить
                                                                                          • roman-kashitsyn:
                                                                                            О применении своего бреда вряд ли задумывался хотя бы один философ. Хотя вру. Вроде читал, что многие пытались найти ответы на интересующие их вопросы, а не несли бред. Ну, а сейчас, как верно подметил wvxvw - не 19й век и бреда полно.
                                                                                            Ответить
                                                                                    • Scala (диалект лиспа) не пробовали?
                                                                                      Ответить
                                            • Посмотрел видео, дядька вполне адекватен. Коротко для тех, кто не смотрел:
                                              1. Сегодня популярность языка определяется маркетингом, наличием обученных программистов и опен-сорсных библиотек.
                                              2. В ближайшие 10 лет рейтинг популярности языков вряд ли измениться.
                                              3. Динамические языки могут быть быстрыми благодаря JIT и многопоточности, но пока они тормозят, ибо все бОльшая часть средств уходит на разработку статических языков.
                                              4. Тулзы для динамических языков писать можно и нужно, но принципы их разработки отличаются от принципов построения тулов для статических языков.
                                              5. Как бэ намекнул, что JavaScript - язык будующего.
                                              В общем, ничего принципиально нового, но смотреть довольно интересно.
                                              Ответить
                              • o1.isRecomend().compareTo(o2.isRecomend())


                                Забавная java.. Во всех нормальных языках уже давно:
                                o1.isRecomend()==o2.isRecomend()
                                Ответить
                              • o1.isRecomend() <=> o2.isRecomend()
                                Ответить
                                • Единственный язык, в котором я знаю такой оператор - KIF. Но по смыслу не подходит...
                                  Ответить
                                • Кстати да, я всё не решался спросить...
                                  <=> :: (Ord a) => a -> a -> Ordering
                                  <=> = compare
                                  ?
                                  Ответить
    • Реализация от Boolean:
      return o1.isRecomend() == o2.isRecomend() ? 0 : (o1.isRecomend() ? 1 : -1);
      Ответить
      • Роману все равно не понравится, ибо мой вариант не понравился, а он был с условным, у вас с тернистым.
        Ответить
        • Этот мне нравиться больше :) Но лучше, на мой взгляд, использовать compareTo, предоставляемый Boolean.
          Ответить
          • а я бы написал явно. Объяснение:
            1. То что используется стандартное поведение, скорее всего удовлетворяет бизнес логике, т. е. с точки зрения приложения в данном случае true должно быть больше чем false.
            Если вдруг (что очень-очень-очень мало вероятно) создатели Java решат, что false должен быть больше чем true, и внесут изменения в реализацию Boolean, то приложение от этого не пострадает.
            2. Реализация тривиальна, и читается также легко как и javadoc
            zero if this object represents the same boolean value as the
                 *          argument; a positive value if this object represents true
                 *          and the argument represents false; and a negative value if
                 *          this object represents false and the argument represents true
            Ответить
            • Если вдруг (что очень-очень-очень мало вероятно) создатели Java решат, что false должен быть больше чем true, и внесут изменения в реализацию Boolean, то приложение от этого не пострадает.
              Первое - в джаву никогда не вносятся такие изменения, потому что ломают совместимость.
              Второе - в данном случае это код из реализации compareTo кастомного объекта - поэтому даже если такое случится - правильнее соответствующим образом поменять поведение.
              Ответить
              • Вы хотели просто повторить мои слова?
                Ответить
                • Нет. "Если вдруг (что очень-очень-очень мало вероятно) создатели Java решат, что false должен быть больше чем true, и внесут изменения в реализацию Boolean, то приложение от этого не пострадает." Если вдруг решат - желательно чтобы это заафектило и этот метод.
                  Ответить
                  • а вот тут уже вопрос к бизнес логике: желательно это или не желательно. Не могу с ходу придумать пример, когда бы это было желательно.
                    Ответить
      • Ну получается своя реализация compareTo у Boolean, но зачем)
        Ответить
        • А кто его знает =)
          Если бы isRecommend() возвращал не базовый тип, а экземпляр класса Boolean, то все было бы куда проще:
          return o1.isRecommend().compareTo(o2.isRecommen d());
          Ответить
          • Было бы проще конкретно в этом месте. Возможно, могли бы появиться проблемы в других :)
            На самом деле Java-программисты почему-то не особо любят использовать обёртки там, где можно без них обойтись.
            Ответить
            • Один из моих мотивов - не хочется словить передачу null Boolean в метод, принимающий boolean, поэтому там где не может быть null использую примитивы.
              Ответить
              • Хоар называет null своей "ошибкой на миллиард": http://lambda-the-ultimate.org/node/3186
                Ответить
            • Сам таким грешу, ибо обертка зачастую предоставляет излишний функционал.
              Скоро перестану грешить, как диплом закончу.
              Ибо, как оказалось, негде мне будет работать Java программистом, буду пыхо-быдло-кодером хамяком.
              Ответить
              • Это не грех, многие стараются избегать обёрток (я тоже). Обёртку Boolean обычно используют там, где нужна "тернарная" логика: да, нет, ХЗ. Например, для Nullable полей БД в ORM-слое. Встречал ещё где-то в классах javax.swing.
                Ответить

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