?

Log in

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

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:

[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)
[User Picture]
From:dbrane
Date:March 18th, 2013 02:08 pm (UTC)
(Link)
if (blah === 10), конечно :-).
(Reply) (Thread)
[User Picture]
From:evolver
Date:March 18th, 2013 02:59 pm (UTC)
(Link)
const uint GOOD_SCORE = 10;

bool hasGoodScore() {
  return (someFunc() == GOOD_SCORE);
}

if (hasGoodScore()) ...
(Reply) (Thread)
From:dmzlj
Date:March 18th, 2013 04:46 pm (UTC)
(Link)
естественнее второе, но если пишу на си, стараюсь следовать первому, если вспоминаю. конечно, после языков с нормальной типизацией это смешно
(Reply) (Thread)
[User Picture]
From:aka_author
Date:March 18th, 2013 05:14 pm (UTC)
(Link)

const A_NUMBER_I_LIKE_BEST = 10;

/* какой-то код */

if( someFunc() == A_NUMBER_I_LIKE_BEST )

Старшие товарищи приучили меня, что писать число в коде цифрами некошерно.
(Reply) (Thread)
[User Picture]
From:tobotras
Date:March 19th, 2013 07:56 am (UTC)
(Link)
Вопрос был не об этом, но Вы ответили :)
(Reply) (Parent) (Thread)
[User Picture]
From:ignik
Date:March 19th, 2013 12:09 am (UTC)
(Link)
Вааще-та тут всё зависит что такое 10. Обычно никаких 10 нет. Поэтому
switch ( SomeFunc() ) {
  case 10: 
}



Edited at 2013-03-19 12:10 am (UTC)
(Reply) (Thread)
[User Picture]
From:livejournal
Date:April 5th, 2013 08:45 pm (UTC)

О Си и массивах — через год

(Link)
Пользователь mklochkov сослался на вашу запись в записи «О Си и массивах — через год» в контексте: [...] Питера ван Линдена, который и натолкнул меня на идею, как это сделать. Еще своим комментарием [...]
(Reply) (Thread)