?

Log in

No account? Create an account

Стилистическое - Оживший юзерпик

Mar. 18th, 2013

11:57 am - Стилистическое

Previous Entry Share Next Entry

Глядя в код некоторых коллег увидел тут глубокое экзистенциальное различие между нами. Акакувас?

Poll #1902710 Стилистическое

Как вы сравниваете вычисляемое с константой?

if (10 == someFunc()) ...
13(18.3%)
if (someFunc() == 10) ...
49(69.0%)
if (isEqualToTen(someFunc())) ...
1(1.4%)
ещё как-то
8(11.3%)

Comments:

Page 1 of 2
<<[1] [2] >>
[User Picture]
From:tarkhil
Date:March 18th, 2013 08:04 am (UTC)
(Link)
someObject.CalculateSampleValue.equalTo(new IntegerConstant("ten")) ;)
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 08:15 am (UTC)
(Link)
Скажи, что ты пошутил! :)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:tnt23
Date:March 18th, 2013 08:11 am (UTC)
(Link)
Очень мешает, что это радиобаттоны, а не чекбоксы!
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 08:15 am (UTC)
(Link)
Тогда разверни — в каких случаях как?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:zinal
Date:March 18th, 2013 08:19 am (UTC)
(Link)
Для целых:
if (x()==10)

Для любых объектов (в том числе для строк):
if ( "Text".equals(x()) )

Причина сугубо практическая - лень делать проверку на null.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 08:24 am (UTC)
(Link)
Не понял. А если x() может вернуть null, как пострадает if (x() == "Text")?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:dzz
Date:March 18th, 2013 08:21 am (UTC)
(Link)
Вообще-то, в языках со слабой типизацией == не всегда означает ожидаемое сравнение, так что иногда я за if(IsEqual(SomeFunc(), 10))
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 08:23 am (UTC)
(Link)
Ну, это я для простоты — важно, что у тебя (SomeFunc(), 10), а не (10, SomeFunc()).
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:tolok
Date:March 18th, 2013 08:26 am (UTC)
(Link)
10 == someFunc() это, наверное, из sql выросло, что ли
(Reply) (Thread)
[User Picture]
From:zaitcev
Date:March 18th, 2013 08:02 pm (UTC)
(Link)
Не, это просто идиотское суеверие такое, боятся поставить = и не заметить. Транслятор обычно выдает "операция без внешних эффецтов" в таком случае, но старообрядцам этого мало. Хотят чтобы сразу ошибка "присвоение к константе".
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:rmrfchik
Date:March 18th, 2013 08:27 am (UTC)
(Link)
Magic number? IN MY PROGRAM???
Ну и в идеале, канешн, это предикат.
Т.е
if ( isQueueFull(myQueue))...
и
boolean isQueueFull(queue)
{
return queue.length >= QUEUE_LENGTH;
}
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 08:57 am (UTC)
(Link)
Ты не уходи от ответа-то :-)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:vitus_wagner
Date:March 18th, 2013 08:27 am (UTC)
(Link)
Как было написано в хакерс тесте:
Have you ever changed value of four?
... Intentionally?
... In the language, other than Fortran?
(Reply) (Thread)
[User Picture]
From:_slw
Date:March 18th, 2013 08:28 am (UTC)
(Link)
через темплэйты надо.
и еще через вызов удаленного soap метода
(Reply) (Thread)
[User Picture]
From:mklochkov
Date:March 18th, 2013 08:45 am (UTC)
(Link)
В языке-то в каком?
Первый вариант применяют труъ программеры на старом хардкорном Си (который ещё K&R), дабы избежать ошибок вида "if(a=5) {do_something();}"
Правда, в именно в твоем случае (сравнение вычисляемого с константой) компилятор, скорее всего, скажет что-то вроде "lvalue required".
Ну еще вещественные числа так сравнивать нельзя, надо так "if(abs(somefunc() - 10.0) < epsilon).
В большинстве остальных случаев, IMHO, второй вариант самый наглядный.
(Reply) (Thread)
[User Picture]
From:dzz
Date:March 18th, 2013 08:51 am (UTC)
(Link)
> Правда, в именно в твоем случае (сравнение вычисляемого с константой) компилятор, скорее всего, скажет что-то вроде "lvalue required".

K&R под руками нет, а gcc отлично справляется ;)
(Reply) (Parent) (Thread)
[User Picture]
From:besm6
Date:March 18th, 2013 09:04 am (UTC)
(Link)
Если подумать... Если приходится сравнивать результат функции с _одной_ константой, то что-то спроектировано не так.

Так что в норме либо case по всему набору возможностей, либо pattern match, что по сути одно и то же.

Нет, разумеется, бывают отдельные случаи, когда задача такова, или (чаще) когда язык настолько беден, что приходится иметь константы, обозначающие другие варианты алгебраического типа (типа 0 в качестве N/A).
(Reply) (Thread)
[User Picture]
From:dz
Date:March 18th, 2013 09:24 am (UTC)
(Link)
Ужас, мальчики, как всё хуёво тут у вас. Это же общее место, уровень плинтуса.

Вариант "10 == value" применяется ТОЛЬКО потому, что в случае типичной опечатки, которая превращает его в "10 = value", компилятор сообщает об ошибке.

Всё.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 09:25 am (UTC)
(Link)
Я тебя умоляю. Куча народу пишет аналог этого варианта на самых разных языках. Вот мне и интересно, почему.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:joyfolk
Date:March 18th, 2013 09:27 am (UTC)
(Link)
Если именно ==, то второй вариант. Если equals - обычно первый.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 18th, 2013 09:28 am (UTC)
(Link)
Ух ты. А почему?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:ufm
Date:March 18th, 2013 09:43 am (UTC)
(Link)
В "чистом Це" - первый вариант для единообразия.

А так, бывет сравнение и в таком виде:
try
10 = SomeFunc(),
ok
catch
_:_ -> error
end
(Reply) (Thread)
[User Picture]
From:crimcat
Date:March 18th, 2013 10:34 am (UTC)
(Link)
const == f()
Привык уж так. Даже, бывает, в жавском коде так пишу не задумываясь.
(Reply) (Thread)
[User Picture]
From:dimas
Date:March 18th, 2013 11:11 am (UTC)
(Link)
ЭОС :)

1. считается теоретически лучше, т.к. не присвоишь, но на присвоение уже вроде все компиляторы умеют ругаться, а от такого варианта меня выворачивает
2. вобщем то мой вариант, но предпочитают не иметь неименованных констант
3. ну это вообще ява какая-то
4. собстно так и ответил
(Reply) (Thread)
[User Picture]
From:tnt23
Date:March 18th, 2013 12:09 pm (UTC)
(Link)
"У меня лазерный принтер!"
(Reply) (Parent) (Thread) (Expand)