Re[2]: Баянище
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.08 11:14
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Zen of Python, п. 5.


В питоне отступы являются частью синтаксиса, так что не в тему.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Когнитивный вопрос (if null)
От: CreatorCray  
Дата: 06.08.08 11:14
Оценка:
Здравствуйте, remark, Вы писали:

R>MSVC имеет тенденцию генерировать как написано, т.е. не умничать. А попробуй для тех примеров, где ICC умничает, поставить целевой процессор Pentium4...

В данном случае наблюдалось для режимов P4 и Core2Duo (/QxP и /QxT)

R>

симметрично!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Когнитивный вопрос (if null)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.08 11:14
Оценка:
Здравствуйте, Legion13, Вы писали:

L>Наоборот, короче получается. "Если то-то, вернуть это." И все.


Это код короче, а реальное действие всё равно с ИЛИ. Разница между видом записи и предпринимаемым действием заставляет задуматься.

То что ты пишешь это
   if (data == null)
   {
      return string.Empty;
   }

   throw new Exception();
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 11:14
Оценка: -1
Здравствуйте, adontz, Вы писали:

A>Во-первых, else сразу виден по отступам, return — нет. Соответственно, понять что выполнится этот код или тот, сложнее.

A>Во-вторых, неиспользование else приводит к потенциальной возможности внести баг при рефакторинге.
Ну, по моему опыту, те, кто пишут else после return кроме всего прочего плохо соблюдают отступы, комбинируют пробелы и табы, так что ничерта там по отступам не видно . Во вторых — return подствечивается как ключевое слово языка, и видно его достаточно хорошо. В третьих — рекомендуют минимизировать число return в тексте метода обычно, некоторые даже не стесняются добавлять лишний уровень вложенности чтоб остался только один return в конце (я правда это мнение не разделяю).
Про баг при рефакторинге можно поподробнее?
Re[4]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 11:22
Оценка: :)
Здравствуйте, Aikin, Вы писали:

A>Твой же вариант понятен после небольшого обдумывания (0,5 сек, не более, но все же обдумывания) либо когда ты знаком с таким подходом.

В защиту варианта без else приведу еще один довод. return — ОЧЕНЬ опасный оператор, так как изменяет логику выполнения метода. После него не выполняется ничего. Так вот, так как этот оператор опасен — нужно делать так, чтобы он стал как более заметным. Когда мы делаем return, закрываем фигурную скобку и далее ставим пустую строку — этот return сразу становится более видимым. В случае же с else — опаратор else закрывает return от взгляда, и его в результате становится сложнее заметить. Важнее то у нас то, что у нас return, а не то, что у нас else
Re[5]: Когнитивный вопрос (if null)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.08 11:27
Оценка:
Здравствуйте, elmal, Вы писали:

E>Ну, по моему опыту, те, кто пишут else после return кроме всего прочего плохо соблюдают отступы, комбинируют пробелы и табы, так что ничерта там по отступам не видно .


Я работабю с включённым View Whitespace и в довесок регулярно CtrlK,Ctrl+D жму, так что мимо.

E>Во вторых — return подствечивается как ключевое слово языка, и видно его достаточно хорошо.


Ничего там не видно, пол-программы это ключевые слова.

E>В третьих — рекомендуют минимизировать число return в тексте метода обычно, некоторые даже не стесняются добавлять лишний уровень вложенности чтоб остался только один return в конце (я правда это мнение не разделяю).


Обычно это приводит к введению вспомогательных переменных и в целом ухудшает читаемость.

E>Про баг при рефакторинге можно поподробнее?


Когда нет else никто тебе не скажет "error CS0161: not all code paths return a value", потому что где-то внизу всегда есть return. Соответственно, забыть реализовать ветку очень просто.

Скажем, рефакторинг заключается в том, что теперь мы хотим вернуть только первые 50 символов строки. пример надуманный, но суть покажет.
if (data != null)
{
    if (data.FirstValue.Length < 50)
    {
        return data.FirstValue;
    }

    // А вот это забыли написать
    // return data.FirstValue.Substring(0, 50);
}

return string.Empty;

Получаем логическую ошибку. В моём варианте
if (data != null)
{
    if (data.FirstValue.Length < 50)
    {
        return data.FirstValue;
    }
    // А вот это забыли написать
    //else
    //{
    //    return data.FirstValue.Substring(0, 50);
    //}
}
else
{
    return string.Empty;
}

компилятор даст по рукам.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 11:42
Оценка:
Здравствуйте, adontz, Вы писали:

A>Я работабю с включённым View Whitespace и в довесок регулярно CtrlK,Ctrl+D жму, так что мимо.

Бывают такие заказчики, что жать такие кнопки низя . Так любят бренчеваться, что переформатировать код запрещено административно, бывает и такое .

A>Ничего там не видно, пол-программы это ключевые слова.

Я ответил в соседнюю ветку еще одну причину.

A>Обычно это приводит к введению вспомогательных переменных и в целом ухудшает читаемость.

Ну, с этим то я согласен, но лишний уровень вложенности ИМХО уменьшает читаемость еще больше.

A>Когда нет else никто тебе не скажет "error CS0161: not all code paths return a value", потому что где-то внизу всегда есть return. Соответственно, забыть реализовать ветку очень просто.

Ну, у меня например среда разработки до компиляции будет орать черти как, что у меня вообще код не правильный в случае, если забуду return . Ругнется ли компилятор не знаю, не проверял.
Ну, рефакторить тут надо совсем по другому . Поставив задачу уменьшить вложенность.
Re[5]: Когнитивный вопрос (if null)
От: Aikin Беларусь kavaleu.ru
Дата: 06.08.08 11:44
Оценка:
Здравствуйте, Legion13, Вы писали:

L>Наоборот, короче получается. "Если то-то, вернуть это." И все.

Если бы было "И все" не было бы о чем спорить. Но там не все, а пошла логика дальше.
Re[5]: Когнитивный вопрос (if null)
От: Aikin Беларусь kavaleu.ru
Дата: 06.08.08 11:44
Оценка:
Здравствуйте, elmal, Вы писали:

A>>Твой же вариант понятен после небольшого обдумывания (0,5 сек, не более, но все же обдумывания) либо когда ты знаком с таким подходом.

E>В защиту варианта без else приведу еще один довод. return — ОЧЕНЬ опасный оператор, так как изменяет логику выполнения метода. После него не выполняется ничего.

Очень опасный Изменяет логику.
elmal, тебе самому не смешно? Любая закорючка в коде (исключая коментариев) изменяет логику, после этого что, код не писать?

E>Так вот, так как этот оператор опасен — нужно делать так, чтобы он стал как более заметным. Когда мы делаем return, закрываем фигурную скобку и далее ставим пустую строку — этот return сразу становится более видимым. В случае же с else — опаратор else закрывает return от взгляда, и его в результате становится сложнее заметить. Важнее то у нас то, что у нас return, а не то, что у нас else

Ага, первый, вон, заметен, а второй уже нет? Я говорю вот о чем: раз оба варианта равнозначны (хотя бы логически), то их нужно одинаково выделять или не выделять.


Давайте доведем эту боязнь до абсолюта и потребуем единственный выход из функции:
string Foo(object a)
{
    string result;
   MyType data = a as MyType;

   if (data == null)
   {
      result = string.Empty;
   }
   else
   {
      result = data.FirstValue;
   }
   
   return result;
}


Так лучше? Врядли.
Хотя этот прием имеет право на жизнь (особенно когда result является аккумулятором), но явно не в данном случае.



А вообще, делайте так как вам удобнее и удобнее вашим коллегам. Тут болше дело вкуса. Ибо и так, и так, и сяк правильно.

СУВ, Aikin
Re[6]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 11:55
Оценка: -2
Здравствуйте, Aikin, Вы писали:

A>Очень опасный Изменяет логику.

A>elmal, тебе самому не смешно? Любая закорючка в коде (исключая коментариев) изменяет логику, после этого что, код не писать?
Я имел ввиду, что этот оператор абсолютно сродни оператору goto, тем он и опасен. Выход с посощью return из двух циклов сразу и все такое — вполне нормальная практика, но, так как по сути return это тот же goto — крайне желательно, чтобы соответствующий оператор был хорошо заметен. При беглом просмотре программы я просто могу не сразу заметить этот return, в результате читать программу становится труднее.
Re[7]: Когнитивный вопрос (if null)
От: Aikin Беларусь kavaleu.ru
Дата: 06.08.08 11:57
Оценка:
Здравствуйте, elmal, Вы писали:

E>Ну, с этим то я согласен, но лишний уровень вложенности ИМХО уменьшает читаемость еще больше.

Тут дело вот в чем: он не лишний, а такой же как и у true-ветви if-а. Поэтому он ничего не уменьшает/усложняет.
Re[8]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 12:15
Оценка:
Здравствуйте, Aikin, Вы писали:

E>>Ну, с этим то я согласен, но лишний уровень вложенности ИМХО уменьшает читаемость еще больше.

A>Тут дело вот в чем: он не лишний, а такой же как и у true-ветви if-а. Поэтому он ничего не уменьшает/усложняет.
Чую такими темпами в священные войны перейдем скоро . Так вот — если убрать else, в результате не требуется делать дополнительный отступ, как результат — больше вероятность того, что строчка влезет в заданное количество символов.
Лишний не лишний. Можно уменьшить уровень вложенности хотя б для одной ветки — значит лишний . Нельзя — значит не лишний . На практике то, многие еще в ветвь else еще один if потом захотят запихнуть, а в тот if еще for и т.д . И в этой каше потом твоя совесть будет чиста только в том случае, если ты не сделал вообще ни одного лишнего уровня вложенности и написал все по фен шую .
Re[9]: Когнитивный вопрос (if null)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.08 12:17
Оценка: +1
Здравствуйте, elmal, Вы писали:

E>больше вероятность того, что строчка влезет в заданное количество символов.


вот. Это существенно. Что тут сказать? Моё личное мнение, что 78 символов — устаревшее ограничение и wide мониторы рулят
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: Когнитивный вопрос (if null)
От: elmal  
Дата: 06.08.08 12:23
Оценка:
Здравствуйте, adontz, Вы писали:

A>вот. Это существенно. Что тут сказать? Моё личное мнение, что 78 символов — устаревшее ограничение и wide мониторы рулят

Ну, я тоже поддерживаю такое мнение, и увеличил его до 120 (именно через столько символов показывает среда разработки вертикальную разделительную линию). Но в любом случае, число символов в строке должно быть ограниченно, 78 или 120 — не принципиально .
Re[3]: Когнитивный вопрос (if null)
От: Mamut Швеция http://dmitriid.com
Дата: 06.08.08 14:31
Оценка: +1
А>1. Но ведь имхо человеческий мозг мыслит иначе. А второй вариант инвертирует логику.

Почему же инвертирует? Я, например, так и думаю: если нуль, то ну его нафиг, заканчиваем работу


dmitriid.comGitHubLinkedIn
Re[10]: Когнитивный вопрос (if null)
От: Mamut Швеция http://dmitriid.com
Дата: 06.08.08 14:38
Оценка:
A>вот. Это существенно. Что тут сказать? Моё личное мнение, что 78 символов — устаревшее ограничение и wide мониторы рулят

Это не только из-за мониторов. Есть мнение, что 80 чимволов оптимизировано для чтения (вроде, в типографике тоже используется)


dmitriid.comGitHubLinkedIn
Re[2]: Когнитивный вопрос (if null)
От: Roman Odaisky Украина  
Дата: 06.08.08 18:35
Оценка:
Здравствуйте, remark, Вы писали:

R>Зависит от того, какая ветвь вероятнее. Всё очень просто. Смотрим Intel® 64 and IA-32 Architectures Optimization Reference Manual:


R> — predict unconditional branches to be taken

R> — predict indirect branches to be NOT taken
R> — predict backward conditional branches to be taken
R> — predict forward conditional branches to be NOT taken

А что, __builtin_expect/__assume и if(unlikely(p == null_ptr)) уже отменили?

Тем более, что в C++0y предполагается что-то вроде if [[ std::probably ]] (condition).
До последнего не верил в пирамиду Лебедева.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.