о читабельности кода
May. 29th, 2013 10:19 pmЯ беседовал сегодня с Г. о разных способах выразить то же самое на 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. (Это не значит, конечно, что надо именно так писать - у дополнительной функции и дополнительного уровня косвенности есть своя когнитивная цена. Я лично так писать не стану.)
Вот так как-то.
Вот два примера - мелких, и, может, даже мелочных, но иллюстрируют тему.
Пару лет назад мы говорили с Г. ровно о том же и тогда я сказал ему: в юности меня раздражала идиома работы с указателем 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. (Это не значит, конечно, что надо именно так писать - у дополнительной функции и дополнительного уровня косвенности есть своя когнитивная цена. Я лично так писать не стану.)
Вот так как-то.
no subject
Date: 2013-05-29 07:25 pm (UTC)if (results > 0)
return true;
return false;
no subject
Date: 2013-05-29 07:27 pm (UTC)(Я пÑедпоÑÑÑ Ð¿Ð¾ÑÑавиÑÑ else, но ÑÑо по-Ð¼Ð¾ÐµÐ¼Ñ ÑиÑÑÐ°Ñ ÑÑÑеÑика).
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-05-29 07:31 pm (UTC)(Ð¸Ð¼ÐµÑ Ð² Ð²Ð¸Ð´Ñ Ð·Ð½Ð°Ð¼ÐµÐ½Ð¸ÑÑÑ Ð¿ÑоÑÑÐ±Ñ Ð´Ð¶Ð°Ð²Ð¸ÑÑа в ÑÑоловой: " Ðаблик ÑÑаÑик Ñайнал ÐоÑÑ Ð±Ð¾ÑÑ Ð½ÑÑ ÐоÑÑ, пожалÑйÑÑа")
no subject
Date: 2013-05-29 09:42 pm (UTC)(no subject)
From:(no subject)
From:$soup++
From:(no subject)
From:no subject
Date: 2013-05-29 07:34 pm (UTC)no subject
Date: 2013-05-30 01:43 am (UTC)(0 is not None, и Ñем более Ð¸Ð¼Ñ Ð² памÑÑи __zero__ и __nonzero__
(no subject)
From:no subject
Date: 2013-05-29 07:35 pm (UTC)no subject
Date: 2013-05-29 08:37 pm (UTC)no subject
Date: 2013-05-29 07:37 pm (UTC)return bool(results > 0);
?
no subject
Date: 2013-05-29 08:21 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Ðе вполне ÑеÑÑÑзно :)
Date: 2013-05-29 07:51 pm (UTC)Ркогда поÑле пеÑеÑÑÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð°ÑÑжиÑÑÑ, ÑÑо Ð¿Ð¾Ð´Ð²Ð¾Ñ Ð° неÑ, и код 2 Ð´ÐµÐ»Ð°ÐµÑ Ñо же, ÑÑо делал Ð±Ñ ÐºÐ¾Ð´ 1, Ñ ÐµÑÑ Ð¿Ð¾ÑÑаÑÑ Ð´Ð¾Ð»Ñ ÑекÑÐ½Ð´Ñ Ð½Ð° ÑаздÑажение :)
no subject
Date: 2013-05-29 07:59 pm (UTC)ЧиÑал Ñ ÐºÐ°Ðº-Ñо ÑÑаÑÐµÐ¹ÐºÑ Ð½Ð° ÑÐµÐ¼Ñ "поÑÐµÐ¼Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¿ÑеподаваÑÑ Ð¡Ð¸ пеÑвокÑÑÑникам", Ñам авÑÐ¾Ñ Ð¿Ð»Ð°ÐºÐ°Ð»ÑÑ Ð¸Ð·-за конÑÑÑÑкÑий Ñипа if(fork()) - поÑÐ¾Ð¼Ñ ÑÑо ÑÑÑденÑÑ Ð¸Ñ Ð½Ðµ понимаÑÑ, не пеÑепиÑав в виде int pid = fork(); if(pid != 0) - но пÑи ÑÑом Ð´Ð»Ñ Ñеловека, ÑегÑлÑÑно иÑполÑзÑÑÑего fork() они вÑглÑдÑÑ ÑовеÑÑенно еÑÑеÑÑвенно. ÐÐ¾Ñ ÑÑÑ Ð´Ð¸ÑÑанÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑденÑом, ÑÑаÑелÑно ÑаÑкÑÑваÑÑим идиомаÑиÑеÑкÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ Ð¸ "пÑоÑеÑÑионалом" Ð¼Ñ Ð¸ назÑваем "опÑÑом".
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:Re: Ðе вполне ÑеÑÑÑзно :)
From:no subject
Date: 2013-05-29 07:55 pm (UTC)Ðне кажеÑÑÑ, ÑÑо ваÑÐ¸Ð°Ð½Ñ "return (results > 0)" воÑпÑинимаеÑÑÑ Ð±Ð¾Ð»ÐµÐµ еÑÑеÑÑвенно, еÑли говоÑиÑÑ Ð½Ðµ о знаÑениÑÑ Ð¸ конÑÑолÑнÑÑ ÑÑÑÑкÑÑÑÐ°Ñ ÑзÑка, а о вÑÑиÑлимоÑÑи вÑÑажений. ÐÑÑгими Ñловами, еÑли Ñ Ð¼ÐµÐ½Ñ ÐµÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкое вÑÑажение "(results > 0)", Ñо Ð´Ð»Ñ Ð¼ÐµÐ½Ñ Ð±Ð¾Ð»ÐµÐµ еÑÑеÑÑвенно ÑÑÐ°Ð·Ñ Ð²ÐµÑнÑÑÑ ÑезÑлÑÑÐ°Ñ ÐµÐ³Ð¾ вÑÑиÑлениÑ. Рв конÑÑÑÑкÑии Ñ if-then-else Ñ ÑнаÑала ÑмоÑÑÑ Ð½Ð° ÑÑÐ¾Ñ ÑезÑлÑÑаÑ, и еÑли он Ñавен "true", Ñо Ñвно возвÑаÑÐ°Ñ "true", и еÑли "false", Ñо Ñвно возвÑаÑÐ°Ñ "false" -- Ñо еÑÑÑ Ñ ÑÑложнил вÑÑажение, не добавив ниÑего нового.
ÐÑÑаÑи, в Ñаком ÑлÑÑае бÑло Ð±Ñ Ð¾ÑÐµÐ½Ñ Ð¸Ð½ÑеÑеÑно ÑзнаÑÑ Ð²Ð°Ñе оÑноÑение к логиÑеÑким опеÑаÑиÑм в Ñелом. УÑловно говоÑÑ, Ð²Ñ Ð¿ÑедпоÑиÑаеÑе "(a && b)" или "if a then b else false"? :)
no subject
Date: 2013-05-29 07:59 pm (UTC)p= calloc (n,sizeof(int));
if (p) ......
еÑли же он оÑкÑда Ñо Ñам издалека пÑиÑел, Ñо ÑаÑе напиÑÑ if(p!=NULL)
no subject
Date: 2013-05-29 08:00 pm (UTC)no subject
Date: 2013-05-29 08:04 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-05-29 08:02 pm (UTC)no subject
Date: 2013-05-29 08:09 pm (UTC)ÐапÑимеÑ, бÑла ÑÑнкÑÐ¸Ñ IsPositive в коÑоÑой двÑÑ ÑÑÐ°Ð¶Ð½Ð°Ñ ÑÑажеÑка if. ÐаменÑем ÑÑажеÑÐºÑ Ð½Ð° кÑаÑкÑÑ Ð·Ð°Ð¿Ð¸ÑÑ return (result > 0). Ðппа, ÑепеÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ IsPositive заинлайниÑÑ Ð² меÑÑо вÑзова! ÐÑи ÑÑении кода Ñже не нÑжно не Ñо, ÑÑо микÑоÑÑилий по деÑиÑÑовке, но и макÑоÑÑилий по пеÑÐµÑ Ð¾Ð´Ñ Ð½Ð° опÑеделение IsPositive, и ÑлоÑа в памÑÑи на доп-ÑÑÑноÑÑÑ. РвÑзÑваÑÑей ÑÑнкÑии бÑла пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ result? ÐÑкидÑваем, заменÑем вÑÑажение result в вÑÑажении (result > 0) на иниÑиализаÑÐ¾Ñ result, напÑÐ¸Ð¼ÐµÑ my_container.count(input). Снова одноÑÑÑоÑÐ½Ð°Ñ ÑÑнкÑиÑ? ÐÑкидÑваем, инлайним ÐµÑ Ð² меÑÑа вÑзова. ФÑнкÑий в клаÑÑе болÑÑе неÑ, конÑилиÑÑ? ÐÑкидÑваем клаÑÑ. ÐÑкидÑваем Ñайл Ñ ÐºÐ»Ð°ÑÑом. Ð Ñд.
no subject
Date: 2013-05-30 08:58 am (UTC)no subject
Date: 2013-05-29 08:09 pm (UTC)no subject
Date: 2013-05-29 09:01 pm (UTC)"еÑли Ñ Ð±Ð¾Ð»ÑÑе нÑÐ»Ñ Ð²ÐµÑнÑÑÑ Ð¢ инаÑе веÑнÑÑÑ Ð¤" лÑÑÑе Ñем "веÑнÑÑÑ Ñ Ð±Ð¾Ð»ÑÑе нÑлÑ"
no subject
Date: 2013-05-29 08:10 pm (UTC)a важно ÑÑо еÑÑÑ ÑеÑÑÑÐ·Ð½Ð°Ñ ÑазниÑа в (моÑм) воÑпÑиÑÑии "if (p)" vs. "if (p != NULL)" и "result > 0" vs. if-then-else: в пеÑвом ÑлÑÑае более длиннÑй ваÑÐ¸Ð°Ð½Ñ Ð½Ðµ ÑилÑно длиннее, ÑÑо по пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¾Ð´Ð¸Ð½ expression и одна ÑÑÑока. if-then-else, конеÑно, Ð¼Ð¾Ð¶ÐµÑ ÐºÐµÐ¼-Ñо пÑоÑе ÑиÑаÑÑÑÑ Ñем "result > 0", но неÑжели возникаÑÑее по пÑоÑÑении ÑаздÑажение (б3Ñ, неÑжели нелÑÐ·Ñ Ð±Ñло напиÑаÑÑ Ð¿ÑоÑÑо "result > 0"???) не пеÑÐµÐ±Ð¸Ð²Ð°ÐµÑ Ð²ÑÑ Ð¿Ð¾Ð»ÑÐ·Ñ Ð¾Ñ ÑеоÑеÑиÑеÑки повÑÑенной ÑиÑабелÑноÑÑи?
no subject
(no subject)
From:(no subject)
From:no subject
Date: 2013-05-29 08:18 pm (UTC)no subject
Date: 2013-05-29 08:18 pm (UTC)Ðо Ð²Ð¾Ñ ÑÑо мне инÑеÑеÑно: еÑли напиÑаÑÑ Ð´Ð»Ð¸Ð½Ð½ÑÑ Ð²ÐµÑÑÐ¸Ñ Ð½Ð° инÑеÑвÑÑ, инÑеÑвÑÑеÑÑ Ð½Ðµ подÑмаÑÑ, ÑÑо Ñ "ненаÑÑоÑÑий" пÑогÑаммиÑÑ?
no subject
Date: 2013-05-30 07:41 pm (UTC)ÐеÑ. ÐнÑеÑвÑÑеÑÑ Ð¿Ð¾Ð´ÑмаÑÑ: "Ð! ÐаконеÑ-Ñо Ñ Ð¾ÑÑ ÐºÑо-Ñо понимаеÑ, как надо пÑогÑаммиÑоваÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ поÑом ÑабоÑало, а не ÑÑÐ¾Ð±Ñ Ð²ÑпендÑиÑÑÑÑ!"
РвозможнÑе иÑклÑÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑого пÑавила Ðам в каÑеÑÑве меÑÑа ÑабоÑÑ ÑдоволÑÑÑвиÑ, ÑкоÑее вÑего, вÑе Ñавно не доÑÑавÑÑ.
no subject
Date: 2013-05-29 08:19 pm (UTC)return (results > 0)? true : false;
?
no subject
Date: 2013-05-30 03:15 pm (UTC)Тоже пÑо Ñакой ваÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð´Ñмал.
no subject
Date: 2013-05-29 08:22 pm (UTC)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; } - ÑÑо попадалоÑÑ Ð¸ бÑло непÑиÑÑно.
РазÑмееÑÑÑ, многое завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÑекÑÑа, иногда ÑазвеÑнÑÑо полÑÑаеÑÑÑ ÑÑнее. ÐÑаÑкоÑÑÑ Ð°Ð±ÑолÑÑÐ½Ð°Ñ - ÑеÑÑÑа ÑлиÑком ÑÑÑемного ÑаланÑа.
no subject
Date: 2013-05-30 08:37 pm (UTC)#define _r return
#define r_ result
//...
_r r_>0;
(no subject)
From:no subject
Date: 2013-05-29 08:24 pm (UTC)return true;
} else {
return false;
}
ТÑÑ ÑÑи бÑлевÑÑ Ð·Ð½Ð°ÑениÑ:
1) ÑезÑлÑÑÐ°Ñ ÑÑавнениÑ,
2) возвÑаÑаемое знаÑение когда (1) true,
3) возвÑаÑаемое знаÑение когда (1) false.
Рданной конкÑеÑной ÑеализаÑии возвÑаÑаемÑй ÑезÑлÑÑÐ°Ñ Ñавен знаÑÐµÐ½Ð¸Ñ (1), но ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ ÑÑо они ÑÐ°Ð²Ð½Ñ Ð¸Ð»Ð¸ пÑовеÑиÑÑ (а вдÑÑг Ñам опеÑаÑка, а вдÑÑг кÑо-Ñо Ñделал глобалÑнÑй search+replace по ÑегекÑпÑ), код надо пÑопаÑÑиÑÑ Ð³Ð»Ð°Ð·Ð°Ð¼Ð¸.
no subject
Date: 2013-05-29 08:25 pm (UTC)ÐейÑÑвиÑелÑно Ð²Ð°Ð¶Ð½Ð°Ñ Ð¸ инÑеÑеÑÐ½Ð°Ñ Ð¿Ñоблема write-only vs.readability пÑоиллÑÑÑÑиÑована доволÑно неÑдаÑнÑм пÑимеÑом, Ñ ÐºÐ¾ÑоÑÑм вÑе и пÑинимаÑÑÑÑ Ñ Ð°Ð·Ð°ÑÑом ÑпоÑиÑÑ :)
ÐÑиÑоединÑÑÑ Ð¸ Ñ. ÐÑÑÑе вÑего Ñ Ð½Ð°Ñ Ð² Ð¿Ð¾Ñ Ð°Ð¿Ðµ - ниÑего лиÑнего (:
return $results;
...ÐºÑ Ð¼. еÑли ÑÑÑ, конеÑно, не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÑиÑаÑелÑного знаÑениÑ.
no subject
Date: 2013-05-30 05:54 am (UTC)ÐкÑÑмоÑонÑик.
(no subject)
From:(no subject)
From:no subject
Date: 2013-05-29 08:26 pm (UTC)[ÑÑÑ Ð±Ñло ÑаÑÑÑждение о меÑÑÐ¸ÐºÐ°Ñ ÐºÐ¾Ð´Ð°, но Ñ Ð¿Ð¾Ð½Ñл, ÑÑо забÑл вÑÑ Ð¾Ð± ÑÑом]
no subject
Date: 2013-05-29 08:30 pm (UTC)yes_no = results >0;
return yes_no;
no subject
Date: 2013-05-29 08:33 pm (UTC)no subject
Date: 2013-05-29 08:51 pm (UTC)no subject
Date: 2013-05-29 09:02 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2013-05-29 08:55 pm (UTC)return ret;
заодно и дебаггиÑÑемоÑÑÑ ÑлÑÑÑаеÑÑÑ - можно на return поÑÑавиÑÑ Ð±ÑÐµÐºÐ¿Ð¾Ð¹Ð½Ñ Ð¸ поÑмоÑÑеÑÑ, ÑÑо же он вÑе-Ñаки вÑÑиÑлил и ÑобиÑаеÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ. ÐообÑе return c вÑÑажением Ñ ÑÑиÑÐ°Ñ Ð½ÐµÐ²Ð°Ð¶Ð½Ð¾Ð¹ пÑакÑикой.
no subject
Date: 2013-05-29 09:03 pm (UTC)(no subject)
From:(no subject)
From:.
From:Re: .
From:Re: .
From:Re: .
From:Re: .
From:Re: .
From:Re: .
From:
Date: 2013-05-29 08:56 pm (UTC)Ð ÑлÑÑае Ñ p или p != null ÑоглаÑен. Я Ñ Ñаким ÑÑалкиваÑÑÑ ÑаÑÑо в js, коÑоÑÑй мало Ñого, ÑÑо Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой ÑипизаÑией, Ñак еÑÑ Ð¸ ÑинÑакÑиÑом Ð¿Ð¾Ñ Ð¾Ð¶ на джавÑ, где Ñак пиÑаÑÑ Ð²Ð¾Ð¾Ð±Ñе нелÑзÑ. ÐоÑÑÐ¾Ð¼Ñ "подвиÑание" на "вÑполнение" в Ñме ÑÑого кода дейÑÑвиÑелÑно ÑаздÑажаеÑ.
Ðо вÑоÑом ÑлÑÑае, как мне кажеÑÑÑ, Ð²Ñ Ñже оÑÑ Ð¾Ð´Ð¸Ñе Ð¾Ñ Ð·Ð¾Ð»Ð¾Ñой ÑеÑединÑ. ÐÑли Ñж ÑÑиÑаÑÑ, ÑÑо return results > 0 "вÑполнÑеÑÑÑ" Ñ Ð¾ÑÑ ÑÐºÐ¾Ð»Ñ Ð½Ð¸Ð±ÑÐ´Ñ Ð´Ð¾Ð»Ð³Ð¾, Ñо нÑжно пÑизнаваÑÑ, ÑÑо пÑоÑкÑоливÑÑÑÑÑ ÑÑи лиÑние ÑÑи ÑÑÑоки Ñоже не мгновенно.