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

    +97

    1. 1
    2. 2
    3. 3
    Integer [] jh = new Integer [1];
    Integer j0 = new Integer(17);
    jh[0]= j0;

    Заполняем массив.

    Запостил: 3.14159265, 30 Января 2013

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

    • Правильно будет как-то так?
      Integer[] jh = new Integer[] {17};
      Ответить
      • Да. В 1.4 было чуть сложнее из-за отсутствия автобоксинга, но в целом с сишком мало что изменилось.
        Самое смешное что этот массив потом идёт аргументом в варарг.
        И потом эти люди будут рассказывать о многословности жабы.
        Полагаю это приятней чем крестократкость #12488.
        Ответить
        • Ну вот кстати обидно, что как в с++11 нельзя:
          // хочется вот так
          vibrator.vibrate({0, 300, 300, 300}, -1);
          // но нужно так
          vibrator.vibrate(new long[] {0, 300, 300, 300}, -1);
          Ответить
          • > new long vibrator
            иногда мне трудно даже вообразить, что программируют постояльцы уютненького
            Ответить
            • Всего лишь особый вибро-сигнал для говнотифи, который нельзя спутать со входящей смской или звонком.
              Ответить
              • коричневая частота?
                Ответить
                • Жалко, что хоть ведроидскому светодиоду передается rgba, но работают только красный синий и зеленый. Умел бы он микшировать цвета - сделал бы коричневую индикацию ;(
                  Ответить
                  • Дело не только в цвете. Главное, чтобы эффект был.
                    Ответить
          • >// хочется вот так
            >{0, 300, 300, 300}
            Больше js напоминает. Да и зачем язык усложнять? Ну сделайте шаблонный варарг метод array, который вернет массив.
            vibrator.vibrate(Make::array(0, 300, 300, 300), -1);
            И не надо запоминать какие скобки что и зачем делают. И код читабельный.
            Ответить
            • что делают {1, 2, 3, 4} интуитивно понятно еще с сишки
              в которой и 20 лет назад работало int array[] = {1, 2, 3, 4};
              просто в с++11 эту схему инициализации наконец-то обобщили и предоставили способ передачи {....} в конструктор/метод/функцию
              Ответить
              • Да я не особо против. Не меньше 40 лет прошло как они очухались. Есть одна проблема: там везде знак равно забыли.
                PS Они через 10 лет проснутся и запилят кортежи в стиле js.
                {
                   a:"c++",becomes:"fucking",crap:"!"
                  ,doIt:[](...) { cout<<"А я метод!" }
                }

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

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

                    Кортежи предлагаю так:
                    c<'+',"+",2,complicated()>

                    Зачем угловые? Чтоб никто не догадался!

                    >илитарный же язык
                    Говноилитарный. Только пхп илитарнее: PHP (3188) C++ (1121). И кстати правильно что на третьем месте шарп. Но с таким серъезным соперником как кресты бороться будет трудно.
                    Ответить
                    • > Ошибочка, анонимные классы.
                      struct {int f(){return 0;}}
                      Ответить
                    • >Кортежи предлагаю так:
                      std::make_tuple('+',"+",2,complicated())
                      Ответить
                      • Слишком просто. Тогда и массивы следовало:
                        std:make_array(1,2,3,4);
                        Ответить
                        • если очень надо - то можно и make_array
                          просто { .... } - это не array, это initializer_list
                          Ответить
                          • > просто { .... } - это не array
                            #include <iostream>
                            using namespace std;
                            int main() {
                               auto a = {1,2,3,4};
                               cout<<a.begin()[2]<<endl;
                               return 0;
                            }

                            http://liveworkspace.org/code/lEir4$7
                            Ответить
                • Ну как, проснулись?
                  Ответить
          • чё надо на куче создавать? Вот жеже говнище
            Ответить
            • в жабе всё на куче кроме примитивов
              Ответить
            • Ты говоришь "куча" будто это что-то плохое.
              Ответить
            • Там куча выделяет память намноого быстрее сишной. Если объекты достаточно быстро подыхают, амортизированная скорость окажется чуть-чуть медленнее работы со стеком.
              Ответить
              • UPD: Подыхают = становятся никому не нужными. Копирующие гц с несколькими поколениями спасают только нужные объекты, забивая на все остальные. Поэтому скорость сборки первого поколения зависит от количества нужных объектов, которые гц приходится копировать во второе поколение, но не зависит от общего количества объектов, выделенных с момента прошлой сборки.

                P.S. Всю эту картину сильно портят финализаторы, поэтому их и не рекомендуют юзать без особой необходимости.
                Ответить
              • Куча еще полезна при работе с замыканиями анонимными классами, чтобы захваченные параметры хранить.
                Ответить
                • Ну в полезности кучи, я думаю, Тарас не сомневается. Просто ему не нравится то, что ее тут юзают чаще чем в сишке.

                  P.S. Кстати хотспотовский JIT умеет убирать ненужные new и превращать объект тупо в пачку переменных на стеке, если ссылка на объект не утекает за пределы функции?
                  Ответить
                  • Я знаю одно: что не моча, то говно
                    CLR(.NET) и выделяет на стеке переменные, и замыкания тоже через стек реализованы, и передача в метод объектов и по значениям, и по ссылкам (ref, out), и много других фич, которые теоретически должны повысить скорость.
                    А общая скорость по бенчам ниже чем у JVM.
                    Ответить
                    • Потому что спецы мелкософта оптимизируют итераторы, делая их неинтуитивными структурами, но случайно забывают включить в библиотеку Set, чтобы выполнять uniq для списка за амортизированное O(n).
                      Ответить
                      • > амортизированное O(n)
                        Хештаблица?
                        Ответить
                        • Она самая. Деревом uniq можно сделать только за O(n*log(n)), как и сортировкой.
                          Ответить
                      • > забывают включить в библиотеку Set
                        http://msdn.microsoft.com/ru-ru/library/bb359438.aspx
                        Aлсо dick tionary
                        Ответить
                        • Видимо Роман об этом: Поддерживается в версиях: 4.5, 4, 3.5.
                          Ответить
                        • >>bb359438.aspx
                          since 3.5

                          > >спецы мелкософта оптимизируют итераторы, делая их неинтуитивными структурами
                          Два плюса серу, только за это. Там кстати споры были насчет "оптимизицации"
                          for (v in enumer){
                          ()=>{use of v};
                          }
                          Ибо шарпообезьянки не привыкли к тому что мутабельная переменная v захватывается и при вызове лямбды там будет финальное значение.

                          Хотя любой мало-мальски писавший на js по-любому наступал на это (или уже знал).
                          Ответить
                          • На js я на это налетел немного по другой причине, когда прикручивал маркеры к опенстритмаповской карте. Я знал, что лямбда будет захватывать значение переменной по ссылке, и переписал его в отдельную переменную. Код выглядел примерно так:
                            for (var i=0; i<n; i++) {
                                var id = i;
                                addSomething(..., function() {
                                    doSomething(id);
                                });
                            }
                            Но естественно в doSomething всегда попадало последнее значение. Но не потому, что я не знал о лямбде, а из-за богомерзкого скопинга js, о котором я тогда не знал, и по наивности думал, что var работает так же, как и в нормальных языках.
                            Ответить
                            • P.S. Поэтому я теперь, если приходится писать на js, по-паскальски пишу все var'ы в первой строке функции, дабы не смущать читателя, пришедшего из языков с нормальными скопами.
                              Ответить
                            • А что там происходило? Мои императивные мозги не понимают подвоха.
                              Ответить
                              • А в жс паскальский скопинг (переменные действуют на всю функцию) с богомерзким, вводящим в заблуждение псевдосишным синтаксисом, позволяющим писать вар в любом месте. Из за этого все лямбды захватили одну и ту же переменную, и клик по любому маркеру обрабатывался как клик по последнему, т.к. в конце цикла в ней окажется н-1.
                                Ответить
                                • Я ничего не понял. Можно пример на идеоне или лайворкспейсе для императивных питушков написать? (Что получилось и как по вашему должно быть? (можно даже примерчик в каком-нибудь сишарпике накатать))
                                  Ответить
                                  • > Я ничего не понял.
                                    Пример с багом из-за богомерзкого скопинга жс: http://ideone.com/MgVwAS А интуитивно должно быть как в си - описал переменную внутри блока - значит ее скоп - этот самый блок, а не вся функция. К лямбдам никаких претензий, претензии только к ёбнутым скопам.
                                    Ответить
                                    • P.S. К паскалю тоже никаких претензий, там хоть переменная и действует на всю функцию, но это интуитивно и наглядно, т.к. там var написан перед телом функции.
                                      Ответить
                                    • >Пример с багом из-за богомерзкого скопинга жс

                                      Вот хороший пример, без функций
                                      var a='Taras';
                                      
                                          do{
                                              var a='Goomno';
                                          }while(false);
                                          alert(a);

                                      Угадайте что будет.

                                      И поэтому в кои-то веки внесли хорошее предложение расширить js словом let, что и сделали добрые дяди из мозиллы.
                                      https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7?redirectslug=New_in_JavaScript_1.7#section_11
                                      Ответить
      • Integer[] jh = new Integer[] {Integer.valueOf(17)}; // w\o autoboxing
        Ответить
    • Она встала с места, процокала тонкими каблучками по ступеньках и, встав возле меня, продолжила:
      Ответить

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