avva: (moose)
[personal profile] avva
Я беседовал сегодня с Г. о разных способах выразить то же самое на C/C++ и смежных языках, и действительно ли это влияет на быстроту и качество чтения и понимания кода. Вообще говоря в последние годы я обнаруживаю в себе все больше и больше неприязни к "хитрым" способам что-то выразить в коде, более лаконичным, чем простой и наивный способ сказать то же самое, даже если он занимает больше строк кода. Почти все "хитрые" трюки привлекают к себе внимание и задерживают это внимания на себе, снижают скорость чтения кода и ясность его понимания. Но ровно то же самое я мог бы сказать и пять лет назад, а вместе с тем мое отношение изменилось еще дальше в сторону против трюков; наверное, мне нравится в коде еще большая ясность и прозрачность, чем раньше, и "трюками" я считаю вещи, которые другие программисты, наверное, сочтут совсем обыденными. Не захожу ли я в этом слишком далеко?

Вот два примера - мелких, и, может, даже мелочных, но иллюстрируют тему.

Пару лет назад мы говорили с Г. ровно о том же и тогда я сказал ему: в юности меня раздражала идиома работы с указателем if (p != NULL), и вместо нее в своем личном коде я всегда писал if (p) (и еще указателям присваивал 0, а не NULL). А сейчас, сказал я, предпочту первый вариант. Попытался объяснить, почему: когда читаешь такой код, как if(p), то пусть на долю секунды, но твое внимание отвлекается на него и ты делаешь приведение типов "в уме". Я могу сколь угодно твердо знать и помнить, что именно означает указатель в булевом контексте, но когда я читаю строки кода до того, я все равно помню, что вот это - указатель, а вот это - булево (логическое) выражение, и они совершенно разные вещи. Оператор != дает мне перейти от одного к другому, совершенно не задумываясь об этом переходе, именно потому, что он есть, этот оператор, он явно говорит: сейчас я вам дам булевое значение. А в случае if(p) мне нужно этот переход сделать самому, и это хоть на крохотную долю секунды, но отвлекает меня от действительно важных вещей.

Сегодня мы вспомнили ту старую беседу, потому что обсуждали похожий пример, в котором моя точка зрения показалась Г. совсем уж возмутительной (в случае с if(p) он говорит, не соглашается с моим выбором, но понимает логику). У меня есть в конце работы функции переменная, скажем, results. Функция возвращает булевое значение. Как мне написать выход:


1. return results > 0;


или


2. if (results > 0) {
  return true;
} else {
  return false;
}


(не обращайте внимания на скобки во втором варианте, это эстетика, если они вам не нравятся, представьте его без них). Я сказал, что хоть самому это странно говорить, пожалуй, предпочту второй вариант. Г. вначале подумал, что я пошутил так. А я не шучу. Логика та же самая. У меня нет никаких проблем понять первую форму, более того, мне естественно именно первую форму написать и это мое первое побуждение, но когда я думаю о том, как через полгода буду этот код читать (или кто-то другой будет), то, поколебавшись, выбираю вторую форму. Это не очевидный для меня выбор, понятно, что жалко тратить несколько строк, там где одной, вполне очевидной, хватает, но все-таки ясность чтения пересиливает.

У меня есть два аргумента против первой формы. Во-первых, почему это "трюк", почему привлекает внимание? Потому что мы относимся (кстати, прошу помнить, что я говорю о себе, все эти "мы" условные и гипотетиечские, если у вас это устроено по-другому, я не против), так вот, мы относимся к булевым значениям иначе, чем к целым числам, строкам, числам плавающей точкой. Все эти типы для нас - единицы информации, а булевы значения, как бы это сказать, единицы решения (information units и decision units). Мы привыкли в коде видеть булевы значения в одном из трех контекстов: 1) литералы true/false в аргументах и возвратных значениях функций; 2) внутри контрольных структур: if while for итд.; 3) аргументы логических операторов == != < итд. Причем третий контекст обычно содержится внутри второго, контекста "решения, что делать", а первый тоже можно считать его под-видом, только отдаленным во времени, но особенно прозрачным образом (скажем, если мы вернули true, то ожидаем, что кто-то тут же с этим значением сделает что-то "решительное", связанное с решением). Все другие использования булевых значений оказываются "странными" и привлекают наше внимание. Я не хочу эту "странность" преувеличивать, она, может, минимальна, и конечно при чтении все очевидно, но все же она есть. Иногда эта странность оправдана, потому что ее требует логика задачи. Скажем, при вычислении сложных и запутанных булевых значений стоит положить промежуточный результат в переменную. Или хранить в булевой переменной done условие окончания цикла. Или держать вектор булевых значений для чего-то. Во всех этих случаях, конечно, надо использовать булевые значение в этих немного более редких контекстах (хотя насчет "done" я не уверен - он настолько обычен, что редким трудно счесть, может, его стоит записать в собратья первого пункта выше), что поделать, это нужно "для работы". А в "return results > 0" это использование булевого значения скорее несколько фривольное, чем "для работы", поэтому крохотная задержка внимания, которого оно требует, неоправдано.

О втором аргументе я подумал чуть позже, и вот он какой. Я пытался наблюдать за собой, как именно я воспринимаю "return results > 0". И вдруг понял, как это охарактеризовать: зная, что функция возвращает булевое значение, я неизбежно, читая эту строку, делаю в уме такой небольшой танец на месте. Я думаю (пусть не словами, а сильно сокращенными ощущениями, но все же): "если больше нуля, то true, если нет, то false". Если так, то так, а если нет, то этак. Шаг влево - так, шаг вправо - этак. Выходит, что я в уме продумываю ровно то же, что и при чтении более длинной формы с if (results > 0). Но если она все равно у меня в уме возникает, так пусть и на экране будет. Несовпадение знаков на экране и продумывания в уме и вызывает это крохотную задержку при чтении, и ситуация тут аналогична if(p). А вот, скажем, если бы было написано что-то вроде "return IsPositive(results);", то это у меня не вызывает танца в уме, тут нет никакой задержки. Танец как бы откладывается до того момента, когда я прочитаю код IsPositive. (Это не значит, конечно, что надо именно так писать - у дополнительной функции и дополнительного уровня косвенности есть своя когнитивная цена. Я лично так писать не стану.)

Вот так как-то.
Page 1 of 3 << [1] [2] [3] >>

Date: 2013-05-29 07:25 pm (UTC)
From: [identity profile] amigofriend.livejournal.com
Ну уж совсем-то хардкорить не обязательно.

if (results > 0)
return true;

return false;

Date: 2013-05-29 07:27 pm (UTC)
From: [identity profile] avva.livejournal.com
Да, можно и так. Это все с моей точки зрения несущественные различия в сравнении с return results > 0;

(Я предпочту поставить else, но это по-моему чистая эстетика).

(no subject)

From: [identity profile] shiloff.livejournal.com - Date: 2013-05-30 12:24 am (UTC) - Expand

(no subject)

From: [identity profile] dmzlj.livejournal.com - Date: 2013-05-30 05:10 pm (UTC) - Expand

(no subject)

From: [identity profile] foolofsilence.livejournal.com - Date: 2013-05-30 09:08 am (UTC) - Expand

(no subject)

From: [identity profile] suvov.livejournal.com - Date: 2013-05-31 10:14 am (UTC) - Expand

Date: 2013-05-29 07:31 pm (UTC)
From: [identity profile] orleanz.livejournal.com
а как Вам джавная избыточность?

(имею в виду знаменитую просьбу джависта в столовой: " Паблик статик файнал Борщ борщ нью Борщ, пожалуйста")

Date: 2013-05-29 09:42 pm (UTC)
From: [identity profile] cema.livejournal.com
Should not be static, he wants his own portion.

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2013-05-31 10:49 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-05-30 05:39 am (UTC) - Expand

$soup++

From: [identity profile] alex shayda - Date: 2013-05-30 07:21 am (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2013-05-30 02:52 pm (UTC) - Expand

Date: 2013-05-29 07:34 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
Мне кажется, это еще от языка зависит. Я пока не совсем понимаю почему, но в C я скорее напишу "if( p != NULL)", а в питоне вполне обойдусь простым "if p:". Аргумент про танец в уме я понимаю, но цена этого танца в разных языках, как ни странно, разная.

Date: 2013-05-30 01:43 am (UTC)
From: [identity profile] avnik.livejournal.com
Это пока не вляпаемся в разницу между if not p: и if p is None:
(0 is not None, и тем более имя в памяти __zero__ и __nonzero__

(no subject)

From: [identity profile] max630.livejournal.com - Date: 2013-05-30 02:26 am (UTC) - Expand

Date: 2013-05-29 07:35 pm (UTC)
From: [identity profile] plakhov.livejournal.com
К чертям ментальное. Что насчет высоты экрана и времени жизни колёсика мышки?

Date: 2013-05-29 08:37 pm (UTC)
romikchef: (штора)
From: [personal profile] romikchef
В теории мы сюда должны попадать не колесом, а ctrl-кликом...

Date: 2013-05-29 07:37 pm (UTC)
From: [identity profile] bvlb.livejournal.com
как насчет:

return bool(results > 0);

?
Edited Date: 2013-05-29 07:37 pm (UTC)

Date: 2013-05-29 08:21 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
неплохо, кстати.

(no subject)

From: [identity profile] blacklion.livejournal.com - Date: 2013-05-29 08:46 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_winnie/ - Date: 2013-05-30 10:30 am (UTC) - Expand

(no subject)

From: [identity profile] blacklion.livejournal.com - Date: 2013-05-30 11:37 am (UTC) - Expand

(no subject)

From: [identity profile] nevelichko.livejournal.com - Date: 2013-05-29 08:50 pm (UTC) - Expand
alexeybobkov: (Default)
From: [personal profile] alexeybobkov
Если я увижу код типа 2, я обязательно потеряю время на секундное раздумье: "А почему так многословно написано? Нет ли тут какого-нибудь подвоха? Перечитаю-ка я эти строчки ещё разок, может, я чего-то не заметил!"
А когда после перечтения обнаружится, что подвоха нет, и код 2 делает то же, что делал бы код 1, я ещё потрачу долю секунды на раздражение :)

Date: 2013-05-29 07:59 pm (UTC)
From: [identity profile] Шура Люберецкий (from livejournal.com)
Вот-вот. Есть сложившиеся идиомы, и их желательно уметь опознавать сразу.

Читал я как-то статейку на тему "почему нельзя преподавать Си первокурсникам", там автор плакался из-за конструкций типа if(fork()) - потому что студенты их не понимают, не переписав в виде int pid = fork(); if(pid != 0) - но при этом для человека, регулярно использующего fork() они выглядят совершенно естественно. Вот эту дистанцию между студентом, тщательно раскрывающим идиоматическую конструкцию и "профессионалом" мы и называем "опытом".

(no subject)

From: [identity profile] dimanium.livejournal.com - Date: 2013-05-29 08:48 pm (UTC) - Expand

(no subject)

From: [identity profile] Шура Люберецкий - Date: 2013-05-30 07:16 am (UTC) - Expand

(no subject)

From: [identity profile] Шура Люберецкий - Date: 2013-05-30 07:21 am (UTC) - Expand

(no subject)

From: [identity profile] pal-sergeich.livejournal.com - Date: 2013-05-31 07:44 pm (UTC) - Expand

(no subject)

From: [identity profile] ilya-dogolazky.livejournal.com - Date: 2013-05-31 10:54 pm (UTC) - Expand

(no subject)

From: [identity profile] pal-sergeich.livejournal.com - Date: 2013-06-01 08:25 am (UTC) - Expand

(no subject)

From: [personal profile] romikchef - Date: 2013-05-29 08:33 pm (UTC) - Expand

(no subject)

From: [identity profile] spamsink.livejournal.com - Date: 2013-05-29 08:35 pm (UTC) - Expand

(no subject)

From: [identity profile] archaicos.livejournal.com - Date: 2013-05-30 05:36 am (UTC) - Expand

(no subject)

From: [personal profile] romikchef - Date: 2013-05-30 06:33 am (UTC) - Expand

(no subject)

From: [identity profile] spamsink.livejournal.com - Date: 2013-05-30 06:41 am (UTC) - Expand

Date: 2013-05-29 07:55 pm (UTC)
From: [identity profile] dimanium.livejournal.com
Удивлён, но это, конечно, дело вкуса.

Мне кажется, что вариант "return (results > 0)" воспринимается более естественно, если говорить не о значениях и контрольных структурах языка, а о вычислимости выражений. Другими словами, если у меня есть логическое выражение "(results > 0)", то для меня более естественно сразу вернуть результат его вычисления. А в конструкции с if-then-else я сначала смотрю на этот результат, и если он равен "true", то явно возвращаю "true", и если "false", то явно возвращаю "false" -- то есть я усложнил выражение, не добавив ничего нового.

Кстати, в таком случае было бы очень интересно узнать ваше отношение к логическим операциям в целом. Условно говоря, вы предпочитаете "(a && b)" или "if a then b else false"? :)
Edited Date: 2013-05-29 07:55 pm (UTC)

Date: 2013-05-29 07:59 pm (UTC)
From: [identity profile] vasja-iz-aa.livejournal.com
я напишу коротко если этот ноль означает только что совершенную неудачную попытку что то сделать, в случаях похожих на
p= calloc (n,sizeof(int));
if (p) ......

если же он откуда то там издалека пришел, то чаще напишу if(p!=NULL)

Date: 2013-05-29 08:00 pm (UTC)
From: [identity profile] leonov.livejournal.com
Ясность чтения во втором случае только страдает - окончательное понимание того, что происходит в этом коде, появляется только после чтения всех четырех строчек. Ведь там может быть что угодно, приводящее к отличному результату от однострочного варианта. И задержка эта гораздо больше, чем уходит на описанный мысленный танец.

Date: 2013-05-29 08:04 pm (UTC)
From: [identity profile] kaathewise.livejournal.com
Поддерживаю.

(no subject)

From: [identity profile] omnibee.livejournal.com - Date: 2013-05-29 08:08 pm (UTC) - Expand

(no subject)

From: [identity profile] 2hard4u.livejournal.com - Date: 2013-05-29 09:36 pm (UTC) - Expand

(no subject)

From: [identity profile] omnibee.livejournal.com - Date: 2013-05-29 09:41 pm (UTC) - Expand

Date: 2013-05-29 08:02 pm (UTC)
From: [identity profile] burrru.livejournal.com
Мудрый подход.

Date: 2013-05-29 08:09 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Последовательные сокращения кода - начинают между собой взаимодействовать давая ещё большее сокращение. Как играх-"шариках", когда удаление одной кучки шариков вызывает падение верних в пустое место, и схлопывание дополнительных скоплений.

Например, была функция IsPositive в которой двухэтажная этажерка if. Заменяем этажерку на краткую запись return (result > 0). Оппа, теперь функцию можно IsPositive заинлайнить в место вызова! При чтении кода уже не нужно не то, что микроусилий по дешифровке, но и макроусилий по переходу на определение IsPositive, и слота в памяти на доп-сущность. В вызывающей функции была переменная result? Выкидываем, заменяем выражение result в выражении (result > 0) на инициализатор result, например my_container.count(input). Снова однострочная функция? Выкидываем, инлайним её в места вызова. Функций в классе больше нет, кончились? Выкидываем класс. Выкидываем файл с классом. И тд.

Date: 2013-05-30 08:58 am (UTC)

Date: 2013-05-29 08:09 pm (UTC)
From: [identity profile] beldmit.livejournal.com
Вариант 2 куда удобнее, если надо добавить дополнительные действия (отладку, например).

Date: 2013-05-29 09:01 pm (UTC)
From: [identity profile] 109518.livejournal.com
А ведь да. И потом лучше переводится на человецеский язык:

"если х больше нуля вернуть Т иначе вернуть Ф" лучше чем "вернуть х больше нуля"

Date: 2013-05-29 08:10 pm (UTC)
From: [identity profile] cmm.livejournal.com
во-первых, я бы вместо этого дикого if-then-else написал (будучи принужден style guidе'ом либо другим видом тирании) "(result > 0 ? true : false)".  но хрен бы с ним, неважно.

a важно что есть серьёзная разница в (моём) восприятии "if (p)" vs. "if (p != NULL)" и "result > 0" vs. if-then-else: в первом случае более длинный вариант не сильно длиннее, это по прежнему один expression и одна строка.  if-then-else, конечно, может кем-то проще читаться чем "result > 0", но неужели возникающее по прочтении раздражение (б3ь, неужели нельзя было написать просто "result > 0"???) не перебивает всю пользу от теоретически повышенной читабельности?
Edited Date: 2013-05-29 08:15 pm (UTC)

Date: 2013-05-29 09:30 pm (UTC)
From: [identity profile] krace.livejournal.com
б3ь — это п2ь! =)

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2013-05-30 11:26 am (UTC) - Expand

(no subject)

From: [identity profile] smilga.livejournal.com - Date: 2013-05-30 11:13 am (UTC) - Expand

Date: 2013-05-29 08:18 pm (UTC)
From: [identity profile] pphantom.livejournal.com
Это правильный подход, но у него есть один изъян. В общем-то на каждом языке принято писать определенным образом. и такие конструкции на C/C++ действительно будут восприниматься как потенциальный подвох. Так что, вообще говоря, надо доводить идею до логического конца и менять используемый язык.

Date: 2013-05-29 08:18 pm (UTC)
From: [identity profile] yucca.livejournal.com
Для меня, если писать return (results>0), скобки как-то фокусируют взгляд и ускоряют понимание.
Но вот что мне интересно: если написать длинную версию на интервью, интервьюеры не подумают, что я "ненастоящий" программист?

Date: 2013-05-30 07:41 pm (UTC)
From: [identity profile] 75dc287ea30b451.livejournal.com
"Но вот что мне интересно: если написать длинную версию на интервью, интервьюеры не подумают, что я "ненастоящий" программист?"

Нет. Интервьюеры подумают: "О! Наконец-то хоть кто-то понимает, как надо программировать, чтобы оно потом работало, а не чтобы выпендриться!"

А возможные исключения из этого правила Вам в качестве места работы удовольствия, скорее всего, все равно не доставят.

Date: 2013-05-29 08:19 pm (UTC)
From: [identity profile] belezbar.livejournal.com
Не совсем удачные примеры, имхо, но, в целом, поддерживаю. Гораздо важнее, чтобы код могли читать и понимать люди, нежели компьютер. А как такой вариант:
return (results > 0)? true : false;
?

Date: 2013-05-30 03:15 pm (UTC)
From: [identity profile] thejustmoose.livejournal.com
+100500
Тоже про такой вариант подумал.

Date: 2013-05-29 08:22 pm (UTC)
From: [identity profile] sizeof.livejournal.com

if (p) - мне кажется, дело не в краткости, а в том, что NULL (0) во многих контекстах воспринимается как выделенное значение, означающее, что "указателя нет" ("объекта нет"). Для примера if (p) это менее прозрачно из-за абстрактности имени p, но для чуть более конкретного случая - имхо, выражает мысль яснее:

Word* translation = dictionary.find (word);
if (!translaion) ... // если нет перевода, то

Для типов, в которых 0 означает "несуществование", (дескрипторы, enum-ы, в которых 0 зарезервирован и т.п.) идиоматика бывает сходна.

return results > 0; имхо, если его читать как return that (results > 0); - воспринимается лучше, при желании that можно сделать функцией. :) Два оператора return легко скопипастить и получить ошибку.
if (...) { return true; } else { return true; } - это попадалось и было неприятно.

Разумеется, многое зависит от контекста, иногда развернуто получается яснее. Краткость абсолютная - сестра слишком стремного таланта.
Edited Date: 2013-05-29 10:13 pm (UTC)

Date: 2013-05-30 08:37 pm (UTC)
From: [identity profile] nalivalovo.livejournal.com
Кратк. - сест. тал. И неебт.
#define _r return
#define r_ result
//...
_r r_>0;

(no subject)

From: [identity profile] sizeof.livejournal.com - Date: 2013-05-30 09:01 pm (UTC) - Expand

Date: 2013-05-29 08:24 pm (UTC)
From: [identity profile] occam-aga.livejournal.com
if (results > 0) {
return true;
} else {
return false;
}

Тут три булевых значения:
1) результат сравнения,
2) возвращаемое значение когда (1) true,
3) возвращаемое значение когда (1) false.

В данной конкретной реализации возвращаемый результат равен значению (1), но чтобы понять что они равны или проверить (а вдруг там опечатка, а вдруг кто-то сделал глобальный search+replace по регекспу), код надо пропарсить глазами.
Edited Date: 2013-05-29 08:28 pm (UTC)

Date: 2013-05-29 08:25 pm (UTC)
romikchef: (штора)
From: [personal profile] romikchef
Интересный пост.
Действительно важная и интересная проблема write-only vs.readability проиллюстрирована довольно неудачным примером, с которым все и принимаются с азартом спорить :)
Присоединюсь и я. Лучше всего у нас в похапе - ничего лишнего (:

return $results;

...кхм. если тут, конечно, не может быть отрицательного значения.
Edited Date: 2013-05-29 08:45 pm (UTC)

Date: 2013-05-30 05:54 am (UTC)
From: [identity profile] migmit.livejournal.com
> Лучше всего у нас в похапе

Оксюморончик.

(no subject)

From: [personal profile] romikchef - Date: 2013-05-30 06:10 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-05-30 07:13 pm (UTC) - Expand

Date: 2013-05-29 08:26 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
Цена 1) чтения лишнего кода, 2) сопровождения лишнего кода - тоже не нулевая, и я бы предпочёл первый (короткий) вариант именно по этой причине. Строчки кода - они не бесплатные, даже если кому-то кажется, что они совершенно ясно и однозначно объясняют смысл кода. В конце концов, "умственное преобразование" может оказаться дешевле, чем чтение лишних строчек кода и умственная перепроверка ("это действительно то [тривиальное], что я подумал? зачем так демонстративно тупо?").

[тут было рассуждение о метриках кода, но я понял, что забыл всё об этом]
Edited Date: 2013-05-29 08:29 pm (UTC)

Date: 2013-05-29 08:30 pm (UTC)
From: [identity profile] vb-k.livejournal.com
Если функция маленькая и простая, совершенно неважно, как писать. Если большая и сложная, то maintainability - главная задача. В данном случае это означает, что следует избегать множественных return-ов и что лучше иметь возвращаемую переменную, чтобы пользоваться ею в отладчике. Например:

yes_no = results >0;
return yes_no;

Date: 2013-05-29 08:33 pm (UTC)
From: [identity profile] ircmaan.livejournal.com
Интересно, что и в непрограммистских жизненных ситуациях удобно использовать подобный метод.

Date: 2013-05-29 08:51 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
`if (p != NULL)` ладно, есть люди, которые пишут `if (b == true)`. И даже `if (true == b)`. Вот где карательную психиатрию-то надо применять.

Date: 2013-05-29 09:02 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
if ( (b == true) == true )

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2013-05-29 09:42 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2013-05-30 11:29 am (UTC) - Expand

Date: 2013-05-29 08:55 pm (UTC)
From: [identity profile] rav-erev.livejournal.com
bool ret = (results > 0);
return ret;

заодно и дебаггируемость улучшается - можно на return поставить брекпойнт и посмотреть, что же он все-таки вычислил и собирается возвращать. Вообще return c выражением я считаю неважной практикой.

Date: 2013-05-29 09:03 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
некоторые люди, напротив, считают неважной практикой использование дебаггера.

(no subject)

From: [identity profile] rav-erev.livejournal.com - Date: 2013-05-29 09:18 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-05-30 05:53 am (UTC) - Expand

.

From: [identity profile] kkk-ddd.livejournal.com - Date: 2013-05-30 06:49 am (UTC) - Expand

Re: .

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2013-05-30 07:20 am (UTC) - Expand

Re: .

From: [identity profile] kkk-ddd.livejournal.com - Date: 2013-05-30 08:21 am (UTC) - Expand

Re: .

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2013-05-30 09:50 am (UTC) - Expand

Re: .

From: [identity profile] kkk-ddd.livejournal.com - Date: 2013-05-30 01:51 pm (UTC) - Expand

Re: .

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2013-05-30 04:35 pm (UTC) - Expand

Re: .

From: [identity profile] rezkiy.livejournal.com - Date: 2013-05-30 06:45 pm (UTC) - Expand

Date: 2013-05-29 08:56 pm (UTC)
From: [identity profile] allvo.livejournal.com
ИМХО.
В случае с p или p != null согласен. Я с таким сталкиваюсь часто в js, который мало того, что с динамической типизацией, так ещё и синтаксисом похож на джаву, где так писать вообще нельзя. Поэтому "подвисание" на "выполнение" в уме этого кода действительно раздражает.

Во втором случае, как мне кажется, вы уже отходите от золотой середины. Если уж считать, что return results > 0 "выполняется" хоть сколь нибудь долго, то нужно признавать, что проскроливыются эти лишние три строки тоже не мгновенно.
Page 1 of 3 << [1] [2] [3] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 04:38 pm
Powered by Dreamwidth Studios