- 1
- 2
- 3
- 4
code = _factorCodeMax[factorUnid];
code++;
_factorCodeMax[factorUnid] = code;
return code;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+138
code = _factorCodeMax[factorUnid];
code++;
_factorCodeMax[factorUnid] = code;
return code;
Думаете return ++factorCodeMax[factorUnid] смотрелось бы лучше ? ;)
> 1mGai
и ты туда же??
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
Временными переменными можно пренебречь, да и они есть в каждом из вариантов.
По-идее должно быть самым быстрым вариантом, но влом пробовать.
Чуть длиннее, чем с ++, но мне по каким-то необъяснимым причинам нравится конструкция += 1.
А для хэша (да и вообще любой индексируемой структуры) неплохо было бы иметь операцию обновления значения, чтобы можно было сделать всё в один лукап.
У Data.Map вроде бы есть updateLookupWithKey.
Правда, аналог в java выглядел бы ужасно. В c# получше, там лямбды есть.
код с побочным эффектом отделён от "чистого"
В python нету оператора ++, вот привычка и осталась
Да у вас же стэйтмент!
А на самом деле - что ++, что += это выражения. Которые с++/c# позволяют использовать как стейтменты.
Спасибо, не знал. Кстати, некоторые языки об этом другого мнения:
invalid proektiroval syntax
Мы, конечно, можем сделать один get, и прочитать\поменять много-много свойств у объекта.
Но мы не можем в одну операцию прочесть и, при необходимости, заменить этот объект другим. Придется делать get для получения старого и set для сохранения нового (ну собственно как и в случае с value-type).
А там только амортизированный O(1)
Тогда мапа сможет сделать лукап, (возможно) найти ячейку, обновить/вставить значение при помощи функции и вернуть новое значение. Итого всего один лукап.
Но для этого нужно писать свою мапу.
>Но для этого нужно писать свою мапу.
Это конечно звучит красиво, но как-то изъебисто.
И если, например, оно используется в многопоточной среде (а оно наверняка так и будет).
Может так случится, что вычисления дорогостоящей лямбды на одном и том же значении будут запускаться несколько раз.
>updateWith(K key, (Option[(K, V)] => V))
То есть оно уже считается. Тут приходит еще один тред и просит то же значение. И та же лямбда запускается уже в другом треде.
ConcurentHashMap.putIfAbsent(), FutureTask и анонимные наследники.
всё равно джва поиска ведь
Откуда инфа? Пруфы в студию.
Да и вообще поиски не столь важно не, сколь способность мапы раssпаралеливаеться и сколько раз вычисляется дорогостоящая функция.
То ж псевдокод-заменитель для малоумных братьев.
is equivalent.
Совсем не означает что внутри оно тоже так тупо. Там ведь еще чудесное слово atomic.
Пруфы надо из сырцов.
Да и не я эту тему поднял
>>В жабе-то есть что-то для этого?
Ой-вей. Раньше надо было ко мне быть таким снисходительным.
А сейчас я обиделся и уже не могу не рыдать.
на жаба-сленге это слово подразумевает нечто большее, чем защита от влияния другого потока?
Это слово подразумевает, раз уж пишем отдельный метод, то проще сделать всё за один скан, чем накладывать лочку и сканить джва раза.
Да нет, вроде один
Ну это правильно. Конструкция универсальна и православна, а инкременты - сахарочек.
И я бы оставил сей коммент без внимания, если бы не один нюанс.
>>>Признаюсь, я ориентировался на массив...
А я же говорил, что перегрузка - зло.
return ++_factorCodeMax[factorUnid];