1. C# / Говнокод #11565

    +138

    1. 1
    2. 2
    3. 3
    4. 4
    code = _factorCodeMax[factorUnid];
    code++;
    _factorCodeMax[factorUnid] = code;
    return code;

    Запостил: Maps, 10 Августа 2012

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

    • Простой и понятный код.
      Думаете return ++factorCodeMax[factorUnid] смотрелось бы лучше ? ;)
      Ответить
      • Сеттер тут сработает?
        Ответить
      • _factorCodeMax[factorUnid] += 1;
        return _factorCodeMax[factorUnid];
        Ответить
        • И, если это хэш, получаем 2 лукапа...

          P.S. Ну вернее 3 вместо двух в моем примере, или в коде ОП'а.
          Ответить
          • Пруф:

            Ваш код: http://ideone.com/6jeOP 2 get 1 set
            Код ОП'а: http://ideone.com/BIo0x 1 get 1 set
            Мой код: http://ideone.com/6WBrw 1 get 1 set
            Ответить
            • а временную переменную забыли?
              Ответить
              • Тут имеются в виду только get/set, вызываемые у коллекции.
                Временными переменными можно пренебречь, да и они есть в каждом из вариантов.
                Ответить
                • int code;
                  _factorCodeMax.TryGetValue(factorUnid, out code);
                  return _factorCodeMax[factorUnid] = ++code;

                  По-идее должно быть самым быстрым вариантом, но влом пробовать.
                  Ответить
          • Признаюсь, я ориентировался на массив...
            Чуть длиннее, чем с ++, но мне по каким-то необъяснимым причинам нравится конструкция += 1.

            А для хэша (да и вообще любой индексируемой структуры) неплохо было бы иметь операцию обновления значения, чтобы можно было сделать всё в один лукап.
            У Data.Map вроде бы есть updateLookupWithKey.
            Правда, аналог в java выглядел бы ужасно. В c# получше, там лямбды есть.
            Ответить
            • кажется понял, почему мне больше нравится +=
              код с побочным эффектом отделён от "чистого"
              Ответить
              • Побочный эффект слева, чистый код (в данном случае единичка) справа? ;)
                Ответить
                • Обновление ячейки массива (первая строка) отделено от поиска и возвращения значения (вторая строка).
                  Ответить
                  • Окай... А вот такой код тогда чем хуже?
                    _factorCodeMax[factorUnid] ++;
                    return _factorCodeMax[factorUnid];
                    Ответить
                    • у меня был стэйтмент, а тут выражение
                      В python нету оператора ++, вот привычка и осталась
                      Ответить
                      • > у меня был стэйтмент, а тут выражение
                        Да у вас же стэйтмент!

                        А на самом деле - что ++, что += это выражения. Которые с++/c# позволяют использовать как стейтменты.
                        Ответить
                        • > += это выражение
                          Спасибо, не знал. Кстати, некоторые языки об этом другого мнения:
                          x = 1
                          print (x += 1)
                                    ^
                          SyntaxError: invalid syntax
                          Ответить
            • Что-то не могу найти в c# операцию inplace обновления значения по указанному ключу. Кастую в тред @abatishchev.
              Ответить
              • Можно решить если объекты ссылочного типа, а не типа значения будут.
                Ответить
                • В общем случае - нет.

                  Мы, конечно, можем сделать один get, и прочитать\поменять много-много свойств у объекта.

                  Но мы не можем в одну операцию прочесть и, при необходимости, заменить этот объект другим. Придется делать get для получения старого и set для сохранения нового (ну собственно как и в случае с value-type).
                  Ответить
                  • Тогда наверное разумнее выбрать контейнер для которого время доступа к элементам O(1)
                    Ответить
                    • Для ассоциативного массива ничего быстрее хэш-таблицы вроде не придумали :(
                      А там только амортизированный O(1)
                      Ответить
                      • Значит надо кешировать адрес элемента, если уж хочется и прочесть его и заменить значением, в зависимости от того что прочитали. В жабе-то есть что-то для этого?
                        Ответить
                        • Ну в принципе да, нужно хранить в хеше ссылку на ссылку на значение ;) Тогда все норм.
                          Ответить
                        • Нет, нужно просто предоставить метод Map.updateWith(K key, (Option[(K, V)] => V)).
                          Тогда мапа сможет сделать лукап, (возможно) найти ячейку, обновить/вставить значение при помощи функции и вернуть новое значение. Итого всего один лукап.
                          Но для этого нужно писать свою мапу.
                          Ответить
                          • Ну и до кучи тогда надо полезные методы в духе insertOrUpdate и removeOrUpdate.
                            Ответить
                          • >Тогда мапа сможет сделать лукап
                            >Но для этого нужно писать свою мапу.
                            Это конечно звучит красиво, но как-то изъебисто.

                            И если, например, оно используется в многопоточной среде (а оно наверняка так и будет).
                            Может так случится, что вычисления дорогостоящей лямбды на одном и том же значении будут запускаться несколько раз.
                            >updateWith(K key, (Option[(K, V)] => V))
                            То есть оно уже считается. Тут приходит еще один тред и просит то же значение. И та же лямбда запускается уже в другом треде.
                            Ответить
                        • >В жабе-то есть что-то для этого?
                          ConcurentHashMap.putIfAbsent(), FutureTask и анонимные наследники.
                          Ответить
                          • > ConcurentHashMap.putIfAbsent()
                            всё равно джва поиска ведь
                            Ответить
                            • >джва поиска ведь
                              Откуда инфа? Пруфы в студию.

                              Да и вообще поиски не столь важно не, сколь способность мапы раssпаралеливаеться и сколько раз вычисляется дорогостоящая функция.
                              Ответить
                              • из описания: http://goo.gl/Lw7zi
                                Ответить
                                • Гы-гы. Наивный.
                                  То ж псевдокод-заменитель для малоумных братьев.
                                  is equivalent.
                                  Совсем не означает что внутри оно тоже так тупо. Там ведь еще чудесное слово atomic.
                                  Пруфы надо из сырцов.
                                  Ответить
                                  • джаваебство какое-то :)
                                    Ответить
                                    • Какое еще джаваебство? Скорее слив и ШАРПОПРОБЛЕМЫ.

                                      Да и не я эту тему поднял
                                      >>В жабе-то есть что-то для этого?
                                      Ответить
                                      • Ладно-ладно. Один поиск, только не плачьте.
                                        Ответить
                                        • >Ладно-ладно.
                                          Ой-вей. Раньше надо было ко мне быть таким снисходительным.
                                          А сейчас я обиделся и уже не могу не рыдать.
                                          Ответить
                                  • > Там ведь еще чудесное слово atomic.
                                    на жаба-сленге это слово подразумевает нечто большее, чем защита от влияния другого потока?
                                    Ответить
                                    • В жабе принято заглядывать в сырцы - как же оно работает, прежде чем лезть с неверными утверждениями.

                                      Это слово подразумевает, раз уж пишем отдельный метод, то проще сделать всё за один скан, чем накладывать лочку и сканить джва раза.
                                      Ответить
                            • > джва поиска
                              Да нет, вроде один
                              http://tinyurl.com/yjfzadc
                              Ответить
                              • Роман, ну вот зачем??? То понятно што один.
                                return segmentFor(hash).put(key, hash, value, true);
                                 V put(K key, int hash, V value, boolean onlyIfAbsent) {
                                Ответить
            • >>но мне по каким-то необъяснимым причинам нравится конструкция += 1.
              Ну это правильно. Конструкция универсальна и православна, а инкременты - сахарочек.
              И я бы оставил сей коммент без внимания, если бы не один нюанс.
              Ответить
            • У a+=x; тоже есть побочные эффекты.

              >>>Признаюсь, я ориентировался на массив...
              А я же говорил, что перегрузка - зло.
              Ответить
        • Вообще оптимальным я считаю будет сделать вот так:
          return ++_factorCodeMax[factorUnid];
          Ответить
    • У виновника торжества вопрошали, с каких же щей сие решение он выбрал?
      Ответить

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