Си диез / Говнокод #11565 Ссылка на оригинал

0

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

Запостил: Maps Maps, (Updated )

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

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

        P.S. Ну вернее 3 вместо двух в моем примере, или в коде ОП'а.
        Ответить
            • Тут имеются в виду только 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 и анонимные наследники.
                        Ответить
                          • >джва поиска ведь
                            Откуда инфа? Пруфы в студию.

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

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8