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

    +75

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    protected String createPublicCacheKey(String...keyElements) {
    	String initial = "public";
    
    	StringBuilder format = new StringBuilder();
    	format.append(initial);
    
    	for(int i=0;i<keyElements.length;i++) {
    		format.append(".%s");
    	}
    
    	return String.format(format.toString(), keyElements);
    }

    Объясните, позязя, почему нельзя сразу добавлять данные к StringBuilder'у. Может быть в этом есть скрытый сакральный смысл желание выпендриться знанием JDK.

    Запостил: kostoprav, 27 Июня 2014

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

    • показать все, что скрытоИспользование строк в качестве ключей - само по себе ГК.
      Ответить
      • Нужно использовать GUID'ы?
        Ответить
      • отчего же? Именно для это в дотнете строки и сделаны неизменяемыми
        Ответить
        • Хахаха ты правда думаешь что строки ниизменяемы чтобы быть ключаме?????
          Ответить
          • Да, а что? Ну в смысле ключами в мепе,или я не так понял?
            Ответить
          • так думает Рихтер, а у меня нет повода выебываться, что я круче него
            Ответить
            • В тех же крестах строки мутабельные. Что совершенно не мешает безопасно использовать их в качестве ключей.
              Ответить
              • Дык я и не спорю что нельзя. Только в крестах безопасность ложиться на плечи мартышки
                Ответить
                • ты путаешь сишку с крестами
                  в крестах компилятор следит за const, а не мартышка
                  Ответить
                  • о как. то есть сейчас вы говорите, что необязательно что бы строки были иммутабельными, достаточно что бы конст? я в замешательстве и смущении
                    Ответить
                    • в с++ нет иммутабельных объектов
                      есть помеченные как константные
                      такие объекты отслеживаются компилятором, для них свои правила применения их методов и методов над ними, компилятор сильно тревожится, если ты пытаешься залезть к ним в карман

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

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

                        Я >> отчего же? Именно для это в дотнете строки и сделаны неизменяемыми

                        Аска >> В тех же крестах строки мутабельные. Что совершенно не мешает безопасно использовать их в качестве ключей.

                        Диффи >> в крестах компилятор следит за const, а не мартышка

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

                        Я нихуя не понимаю в каком месте вы хотите сделать мну виноватым.
                        Ответить
                        • std::map<std::string, int> mymap;  // какая-то фигня, которая использует объекты std::string в качестве ключей, скорее всего, это мапа
                          std::string mykey = "Hello!";  // строка mykey константная или мутабельная?
                          mykey = "no, bye-bye"; // хм, наверное, всё же мутабельная
                          mykey[3] = '-'; // точно мутабельная
                          mymap[mykey] = 42; // DANGER DANGER настало время идти на hh за следящей мартышкой
                          Ответить
                          • я об этом с самого начала и говорил.

                            Тут какая то эпидемия? У меня такое ощущение, что если я зайду через год, и скажу что типа "да, так и есть, двоичный код состоит из 1 и 0" меня изобьют, обольют бензином и сожгут.
                            Ответить
                            • Ты не замечаешь, что фраза про призыв мартышек написана зеленым? :)
                              // продолжение кода
                              mymap[mykey] = 42;
                              mykey[3] = '+'; // АЗАЗАЗА сейчас все поломается
                              std::cout << mymap["no,-bye-bye"] << std::endl; // 42...  хм, а мапе то похуй
                              std::string - мутабельная строка? Да.
                              Опасна ли эта мутабельность для мапы? Нет.
                              Нужна ли следящая мартышка? Нет.
                              Ответить
                              • так то все комменты в коде зеленым

                                в плюсах нет аналогичной проблемы? (ну только со строками)
                                http://ideone.com/XAE6Z0
                                Ответить
                                • > в плюсах нет аналогичной проблемы
                                  Неа, нету. http://ideone.com/xokXst

                                  > ну только со строками
                                  Для любой фигни, ведущей себя как value type этой проблемы нету. Можно даже std::map<std::vector<std::queue<int>>, std::string> заюзать в качестве ключа для мапы. Но не нужно.
                                  Ответить
                                • http://ideone.com/dHXeVG портировал
                                  Как говорит выше Борманд, Для любой фигни, ведущей себя как value type этой проблемы нету.
                                  Ответить
                                  • > auto map = std::map<myobj, int>();
                                    Зачем же так дословно портировать? :) Это эквивалентно std::map<myobj, int> map; А ближе к коду кегдана будут new и смартпоинтер.
                                    Ответить
                                    • Надо портировать код, код сам себя не портирует!

                                      Кстати, а штатными средствами (используя публичные методы, не залезая внутрь) можно погнуть std::map, подсунув объект Кегдана? Или только указатель/смартпоинтер/иной объект с указателем на что-то внутри?

                                      Я попытался с обычным объектом, но у меня руки слабые: http://ideone.com/Fqb5kM.
                                      Ответить
                                      • достаточно кое-что исправить в
                                        bool operator < (const myobj& o) const {
                                          myobj * hukker = const_cast<myobj *>(this);
                                          myobj & ksakep = const_cast<myobj &>(o);
                                          // ALL YOUR MONKEY ARE BELONG TO US
                                        }


                                        сделай недетерминированное сравнение, и уникальность ключей в мапе пойдет по пизде
                                        Ответить
                                        • bool operator < (const myobj& o) const {
                                              return rand() & 1;
                                          }
                                          Ответить
                                          • Жаль, это не даёт гадить в map так же прямолинейно, как в C# у Кегдана.
                                            Ответить
                                            • > Или только указатель/смартпоинтер/иной объект с указателем на что-то внутри?
                                              да
                                              Ответить
                                      • > Я попытался с обычным объектом, но у меня руки слабые
                                        Ты наркоман штоле? Погнул же как Кегдан у себя в C#, но не заметил.
                                        http://ideone.com/06SKkz
                                        Ответить
                            • Кстати, у вас в C# инты изменяемые!
                              Массивы уже порвались?
                              Ответить
                        • >> Аска >> В тех же крестах строки мутабельные. Что совершенно не мешает безопасно использовать их в качестве ключей.

                          > либо неизменяемость строк (иммутабельность или константы) либо следить что бы никто не положил мапу нахуй
                          Что значит "положить мапу нахуй"? Написать свою map<string, pituh> с возможностью изменить любой ключ (а значит - бесплатно создавать дубликаты) её пользователям?

                          Или тут про какие-то оптимизации и пирфомансе говорится? (положить == заDoSить) Неизменяемая строка => её можно закэшировать и свести к указателю => сравнивать 4-8 байт, а не 0-100500?
                          Ответить
    • лол, в с c# можно http://msdn.microsoft.com/ru-ru/library/5fxz4s6t(v=vs.110).aspx
      хотя все равно язык говно, там же нет вывода типов
      Ответить
    • I've been loikong for a post like this forever (and a day)
      Ответить
    • <a href="http://jopopeqvgo.com">Kneogwdle</a> wants to be free, just like these articles!
      Ответить
      • Молодец, друг! На радостях я нагибаюсь и припадаю к твоему стоящему живительному источнику.
        Ответить
    • I apiptcraee you taking to time to contribute That's very helpful. http://tvqcro.com [url=http://dvcfxtyu.com]dvcfxtyu[/url] [link=http://amooupy.com]amooupy[/link]
      Ответить

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