12.01.2004, 15:05 | #1 |
Участник
|
Привет, читаю документацию, раздел "Dead code examples", там написано:
In the following example else is never "used" as execution already ended at the return statement (the else construct has no use here), it's "dead code": if (a) { return a; } else { b++: return b; } Use this form instead: if (a) return a; b++: return b; Мне кажется, что это бред. Так ли это в действительности или это опечатка? (Аксапту не юзаю т.к. нет рег. ключа для режима конфигурирования...) |
|
12.01.2004, 16:26 | #2 |
Участник
|
Второй вариант предпочтительнее ...
if (a) return a; b++; return b; Какой смысл ставить else ? И помоему у тебя очепятка. После b++ должна быть ";" |
|
12.01.2004, 17:32 | #3 |
Участник
|
Цитата:
Сообщение от Юрий
Привет, читаю документацию, раздел "Dead code examples", там написано:
In the following example else is never "used"... там ничего про переменную а не было? там нигде не было a = true; ? |
|
12.01.2004, 19:00 | #4 |
Участник
|
1.Понятно что можно без else, но я речь веду про строгость и интуитивность языка...
2.Пример из файла Axapta-obj.chm, нарыл где-то в инете по ссылкам с этого сайта - но точно не помню. |
|
12.01.2004, 19:03 | #5 |
Участник
|
странно, у меня такого файла.
а файл большой? можно по почте прислать? или если он небольшой, то на форум выложить? |
|
12.01.2004, 19:24 | #6 |
Шаман форума
|
Это development best practices - прислать?
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
12.01.2004, 19:24 | #7 |
Участник
|
стандартный? нет не надо.
лучше ссылку на эту страницу |
|
12.01.2004, 19:27 | #8 |
Шаман форума
|
Ссылку куда...не понял
У меня на локале болтается :-))) вхожу в Указатель, там набираю слово dead....
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
12.01.2004, 19:29 | #9 |
Участник
|
нашел
http://technet.navision.com/usered/BPH/Bes...CodeExample.htm это? действительно странно. Это не dead код. Может здесь правила, когда Best Practices Check срабатывает? |
|
12.01.2004, 21:18 | #10 |
Шаман форума
|
Наверное, авторы имели в виду, что и без "else" будет работать.
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
13.01.2004, 09:29 | #11 |
Гость
|
К сожалению, не нашел точного определения "dead code" в руководстве. Может, кто-нибудь подскажет?
Поэтому решил посмотреть на указанный пример с "низкоуровневой" точки зрения. Вспоминается студенческий курсовой по проектированию трансляторов. Ниже приведен грубый перевод указанных фрагментов кода на Ассемблер, как его сделал бы компилятор. Смешно, конечно, проводить такие аналогии, но кое-что интересное в этом можно заметить. 1-Й вариант: Код: TST AX, AX JZ L01 // начало блока if MOV RESULT, AX RET // конец блока if JMP L02 // эта команда НИКОГДА не выполнится !!! L01: // начало блока else INC BX MOV RESULT, BX RET // конец блока else L02: ... Код: TST AX, AX JZ L01 // начало блока if MOV RESULT, AX RET // конец блока if L01: INC BX MOV RESULT, BX RET |
|
13.01.2004, 12:43 | #12 |
Administrator
|
Думаю, что имелось ввиду как раз то, о чем Ruff написал (см. вариант на Ассемблере). Хотя пример, наверное, не самый удачный. Можно еще предположить, что это как-то связано с оптимизацией интерпретации кода. Во втором варианте граф потока управления получается проще, чем в первом, хотя вариант с a=false получит некоторое преимущество.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
13.01.2004, 14:28 | #13 |
Участник
|
На самом деле вы меня не поняли
Меня интересует будет ли работать оба варианта и таким образом это просто неточность в руководстве. Или не будет. Просто Аксапты нет, а функционалом интересуюсь (с точки зрения программиста конечно). |
|
13.01.2004, 14:40 | #14 |
Участник
|
скорее всего неточность в руководстве.
|
|
13.01.2004, 15:43 | #15 |
Гость
|
Цитата:
скорее всего неточность в руководстве.
А я пока продолжу свои мысли по этому поводу. 1. Обратите внимание на примеры, приведенные в Best Practices. Dead code там выделен красным цветом. И в нашем примере - это именно оператор else с открывающей фигурной скобкой (я бы подкрасил еще и закрывающую скобку). Но не b++ и не return b. 2. Обратите внимание на текст, сопровождающий примеры в руководстве. В первых двух примерах (в которых dead кодом являются соответственно b++ и return a) ключевой фразой является ... is never reached (не будут достигнуты). Тогда как в третьем (рассматриваемом нами) примере ключевая фраза звучит по-другому: else is never "used". То есть, как я понимаю, код достижим, но является лишним. Или, я бы даже сказал "виртуально" не достижим (т.е. на более низком уровне - см. Ассемблер). Из всего сказанного выше я бы сделал вывод о том, что "dead code" - это недостижимый или лишний, бессмысленный в данном контексте код. Отвечая Юрию, работать будут оба варианта, причем абсолютно идентично, но присутствие в первом варианте оператора else - признак dead code. Вот и все. Кстати, первые два примера тоже будут работать, просто в них есть операторы, которые не выполнятся. В третьем примере - это оператор else. Он и не выполнится, а не его тело. PS: Что-то я много всего понаписал тут - обидно будет, если никто не ответит. Может, кто-то все-таки знает точное определение dead code? |
|
14.01.2004, 08:32 | #16 |
Участник
|
Цитата:
Сообщение от Ruff
Цитата:
скорее всего неточность в руководстве.
dead code = Любая часть программы, которая никогда не может быть доступна из за того, что все вызовы этой части были удалены, либо из за управляющей структуры, которая логически обязана переводить управление в другое место. Оригинал(http://www.hyperdictionary.com/computing/dead+code): Any part of a program that can never be accessed because all calls to it have been removed, or because it is guarded by a control structure that provably must always transfer control somewhere else. The presence of dead code may reveal either logical errors due to alterations in the program or significant changes in the assumptions and environment of the program (see also software rot); a good compiler should report dead code so a maintainer can think about what it means. Sometimes it simply means that an *extremely* defensive programmer has inserted can't happen tests which really can't happen - yet. Synonym grunge
__________________
WBR, Anton |
|
14.01.2004, 09:32 | #17 |
Участник
|
Цитата:
Сообщение от Антон Солдатов
dead code = Любая часть программы, которая никогда не может быть доступна
Только дело в том, что в приведенном примере НЕТ кода, который НИКОГДА не может быть доступным. |
|
14.01.2004, 09:45 | #18 |
Участник
|
Цитата:
Сообщение от mazzy
Только дело в том, что в приведенном примере НЕТ кода, который НИКОГДА не может быть доступным.
Ruff вполне хорошо обьяснил почему часть логической конструкции else можно считать "мертвым кодом". Опять же imho, считаю else после return, просто неэстетичным. Для кого то так писать покажеться более логичным.. для кого то нет. Но ошибки в документации нет.
__________________
WBR, Anton |
|
14.01.2004, 10:04 | #19 |
Участник
|
[quote=Антон Солдатов]
Цитата:
Сообщение от mazzy
Ruff вполне хорошо обьяснил почему часть логической конструкции else можно считать "мертвым кодом".
но по приведенному определению эта конструкция dead code'ом не является С эстетическими оценками согласен. |
|
14.01.2004, 11:44 | #20 |
Гость
|
Но самое смешное во всем этом то, что сама Аксапта (3.0 SP1) на приведенный фрагмент не ругается ни при компиляции, ни при проверке Best Practices!
Более того, она не ругается даже на такой ЯВНЫЙ "мертвяк": Код: if (a) { return a; } else { b++; return b; } b--; Вот и читай после этого Best Practices... То есть, верь после этого людям! Написано-то складно, а на деле... |
|