metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-04-13 03:07 pm

There is one question that has been bugging me...

с тех пор как я обчитался Фаулера и Макконнела. А именно: где-то там у них не советуется заводить дополнительные временные переменные, а сразу дергать метод, если нужно, и брать его возвращаемое значение. Почему-то мне кажется, что завести переменную с понятным именем и хранить значение в ней будет более кратким и понятным вариантом, чем каждый раз вызывать метод:

1)
string auxcode = auxCodeField.getAsString();
if (!Find(auxcode))
Add(auxcode);

и
2) if(!Find(auxCodeField.getAsString())) then
Add(auxCodeField.getAsString());

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

[identity profile] g-rub.livejournal.com 2009-04-13 12:17 pm (UTC)(link)
Грань довольно очевидна: если значение используется более одного раза, временная переменная является необходимой сущностью, если используется однократно -- излишней.

[identity profile] yurri.livejournal.com 2009-04-13 12:18 pm (UTC)(link)
Переменная в общем случае логичнее, т.к. результат, возвращаемый методом, может между вызовами измениться. Таким образом, в If можем попасть в секцию того условия, которому значение уже не соответствует.

[identity profile] bigfrogg.livejournal.com 2009-04-13 12:19 pm (UTC)(link)
Второй код не то нечитабелен, он ещё
1 - Работает дольше (из-за того что auxCodeField.getAsString() вызывается 2 раза)
2 - Потенциально опасен, из-за того что второй вызов auxCodeField.getAsString() может (в зависимости от алгоритма программы) вернуть уже не то, что вернул первый вызов auxCodeField.getAsString()

[identity profile] henu3detb.livejournal.com 2009-04-13 12:29 pm (UTC)(link)
Лично я не люблю цепочки вызовов или вложенные вызовы по одной причине: если где-то в цепочке вывалится Exception (а часто вываливается NullPointerException), то по стектрейсу неясно кто у меня null, и надо запускать дебагер. А бывает что и подебажить не так просто.

[identity profile] raydac.livejournal.com 2009-04-13 12:31 pm (UTC)(link)
локальная переменная в Java будет лежать в таблице локальных, а при работе с методом, на стек будет класться постоянно объект и вызываться его метод, так что первое (если вызовов несколько) быстрее будет

[identity profile] feorex.livejournal.com 2009-04-13 03:06 pm (UTC)(link)
Практически всегда использую первый вариант

[identity profile] thesz.livejournal.com 2009-04-13 08:05 pm (UTC)(link)
В Хаскеле так можно.

В императивных языках - нет.

Замучаешься отлаживать.

[identity profile] molnij.livejournal.com 2009-04-14 03:56 am (UTC)(link)
вспомнилось http://russian.joelonsoftware.com/Articles/BacktoBasics.html

[identity profile] zmila.livejournal.com 2009-04-14 06:31 am (UTC)(link)
не знаю, чем их так привлекает "поздняя оптимизация",
но у гуру вэб-жаваскриптистов рекомендуется даже вместо:
var myDiv = document.getElementById('my_div');
myDiv.style.border = "3px solid red";
myDiv.style.display = "block";


писать:
var myDiv = document.getElementById('my_div');
var myDivStyle = myDiv.style;
myDivStyle.border = "3px solid red";
myDivStyle.display = "block";


ибо даже доступ к переменной-члену объекта (не говоря об вызове функции) уже нееффективнее, чем доступ к локальной переменной
такие дела :)

вообще, в общем, тут дело индивидуальной градации - начиная с какого момента начинается параноя, излишество.
я стараюсь делать так: если некий результат используется более одного раза - в переменную его. (благо eclipse позволяет быстро и легко рефакторить жава-код).
и не делать цепочных вызовов - так легче потом дебажить.

[identity profile] zamotivator.livejournal.com 2009-04-15 08:51 am (UTC)(link)
А не пофигу ли?
Компилятор оптимизнёт один фиг.
Или тут борьба за чистоту пространства имён?