Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возник спор с товарищем по поводу вложенности кода, оператор if и вложенности 
:(
    Опции темы
StepS
  Дата 17.5.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



Всем привет, у нас с товарищем по работе возник спор.
есть функция:

мой вариант:
Код

public void SomeFunction(someparameters){
  try{
     .....//somecode
     if(condition){   // в этом блоке по else не нужно никаких действий
       print();
       ....//somecode
     }
  } catch {
  }
}


вариант коллеги:
Код

public void SomeFunction(someparameters){
  try{
     .....//somecode
     if(!condition){   // в этом блоке просто выход из метода
       return;
     }
     print();
     ....//somecode
  } catch {
  }
}


он говорит, что его вариант лучше, т.к. в коде меньше вложенностей (т.е. отступов), а я говорю, что мой вариант лучше т.к. легче читается и легок при отладке, ведь если поставить break point на строку с print() и условие выполняться не будет, то на брэкпоинт никогда не попадешь и потратишь еще 1-2 часа на понятие почему (из моего опыта).

У кого какие мыслы по этому поводу ?
PM MAIL ICQ   Вверх
Sartorius
Дата 17.5.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 Голосую за первый ибо нужно стремиться к максимальной простоте кода.
ЗЫ А вообще спор напоминает спор о расстановке фигурных скобок. И так же закончиться ничем ИМХО
PM MAIL ICQ   Вверх
ivashkanet
Дата 17.5.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



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

Исходя из этого вариант:
Код

public void SomeFunction(someparameters)
{
 //много кода
 //еще много кода
 //опять много кода
 if(!condition) return;
 // пошли дальше
}

Неприемлем (эту строчку можно просто не заметить в куче кода), хотя следующий код вполне приветствуемая практика:
Код

public void SomeFunction(someparameters)
{
 if(!condition) return;
 if(!condition1) return;
 if(!condition2) return;
 // пошли дальше
}

Этот способ называется "сторожевые условия".


Резюмирую: лучше тот код, который проще читать!
Цитата(кто-то умный (в моих вольных воспоминаниях))

Написать программу понятную компьютеру может и дурак,
много сложнее написать программу понятную человеку.

PM MAIL WWW ICQ   Вверх
Дрон
Дата 17.5.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



StepS, в общем виде они равноправны. В некоторых случаях лучше первый, в некоторых второй.
В принципе, первый я использую чаще, потому что:
- однозначно, по возможности лучше иметь минимум точек выхода (return);
- позитивные условия (без отрицания) мне нравятся больше smile

С другой стороны, я сам пишу вторым способом, но только в самом начале метода для проверки валидности параметров или состояния объекта.
В середине метода такие проверки только сбивают с толку.



--------------------
Да. Именно так.
PM   Вверх
adLucem
Дата 17.5.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Первый вариант логически более правильный (проверяется прямое условие, соблюдаются принципы структурного программирования - см. Макконелл Совершенный код)

Код

if ( !condition ) { // При рефакторинге это место будет претендентом, так как проверяется обратное а не прямое условие
}


Второй вариант более читабелен (отсутствует дополнительное смещение большого? куска кода - см. Кериевски Рефакторинг с применением шаблонов).

Хотя я в большинстве случаев предпочитаю первый вариант, если речь не идет о контроле контрактов (например, проверке входных данных) и контроле инвариантов.

Использование того или иного подхода, а для качественного анализа нужен больший объем кода, потому что в данном случае применение того или иного стиля полностью определяет контекст (если не брать во внимание предпочтения и общий стиль проекта).

Это сообщение отредактировал(а) adLucem - 17.5.2007, 15:11
PM MAIL ICQ   Вверх
StepS
Дата 17.5.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



я согласен что в начале метода можно его использовать (но я считаю, лучше этого избегать), а вот в середине метода - только в крайних случаях и никак не по причине уменьшения отспутов.
Нужно уменьшить число вложенности - пожалуйта: выносите в отдельные методы и будет вам счастье (ИМХО)

PM MAIL ICQ   Вверх
adLucem
Дата 17.5.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



StepS, Совершенно согласен - вынесение логики в отдельный метод (composite method) - наиболее подходящее решение.

Но опять же не применимое при контроле входных данных и инвариантов.
PM MAIL ICQ   Вверх
StepS
Дата 17.5.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



ок. я понял, всем спасибо за дискуссию
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.