return из switch
От: Аноним  
Дата: 14.08.08 07:14
Оценка:
Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу

int i;
switch(i)
{
case 0:
    break;
default:
    return -1;
}
return 0;

int i, ret;
switch(i)
{
case 0:
    ret = 0;
    break;
default:
    ret = -1;
}
return ret;

п.с. VS6.0/VS8.0
Re: return из switch
От: Сергей Мухин Россия  
Дата: 14.08.08 07:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу


некоторые думают, чтj это не кошерно. Для оптимизации пофиг.
---
С уважением,
Сергей Мухин
Re: return из switch
От: EyeOfHell  
Дата: 14.08.08 07:45
Оценка: :))

Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу


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

Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .
Re[2]: return из switch
От: Аноним  
Дата: 14.08.08 08:23
Оценка: +1
Здравствуйте, EyeOfHell, Вы писали:

EOH>

Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу


EOH>скорость тут не при чем. return в произвольном месте, так же как и goto, нарушает линейность кода . И когда Вы через полгода будете править этот свич, то можете пропустить return и даписать код после него. А потом неделю искать багу .


EOH>Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .


хм.. а мне кажется ретурн в свитче улучшает читабельность кода
Re[3]: return из switch
От: alzt  
Дата: 14.08.08 10:50
Оценка: :)
Здравствуйте, Аноним, Вы писали:

EOH>>Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .


А>хм.. а мне кажется ретурн в свитче улучшает читабельность кода


В примере который выше — мне тоже так кажется.
А вообще ситуации разные бывают. Ретурн меняет поведение свитча, т.е. я ожидаю, что управление перейдёт на следующую строку после свитча, а на самом деле может произойти выход из функции. Т.к. свитч может быть большой, то легко проглядеть.
Re[2]: return из switch
От: sokel Россия  
Дата: 14.08.08 11:01
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>некоторые думают, чтj это не кошерно. Для оптимизации пофиг.


предположительно, single return path кошерней для [N]RVO.
Re[2]: return из switch
От: Аноним  
Дата: 14.08.08 11:51
Оценка: +1
EOH>скорость тут не при чем. return в произвольном месте, так же как и goto, нарушает линейность кода . И когда Вы через полгода будете править этот свич, то можете пропустить return и даписать код после него. А потом неделю искать багу .
В С++ нельзя полагаться на некую "линейность" хотябы потому что там еще исключения иногда бывают, и написанному коду должно быть пофиг где происходит выход (с учетком нормально вызова деструкторов всяческих гардов).
Re[3]: return из switch
От: EyeOfHell  
Дата: 14.08.08 12:20
Оценка:

В С++ нельзя полагаться на некую "линейность" хотябы потому что там еще исключения иногда бывают, и написанному коду должно быть пофиг где происходит выход (с учетком нормально вызова деструкторов всяческих гардов)


Так кто спорит. Но, к сожалению, когда через полгода-год нужно что-то поменять в паре десятков тысячь строк кода и навигация по нему идет исключительно через code definition window и find, то велика вероятность пропустить неочевидное поведение. Поэтому в больших проектах стараются код по мере сил держать линейным, неочевидного ничего не писать а исключения использовать исключительно для обработки ошибок . Дабы снизить последующие наклодные расходы по отладке и сопровождению. Исключить проблемы, понятное дело, не получается. Но если благодаря простому коду удалось впоследствии избежать хотя бы нескольких багов от его изменения — то это уже очень значительный плюс по времени.

Все это субъектино, конечно. Костыли так сказать, потому что слаб человек и память у него не ахти . Понятное дело что внимательному программисту с хорошей памятью вся эта мишура нафиг не нужна. Но, к сожалению, кода много — а внимательных людей с хорошей памятью мало. Приходится выкручиваться кто как может .
Re: return из switch
От: sc Россия  
Дата: 14.08.08 14:34
Оценка: +1
Здравствуйте, Аноним, Вы писали:

все зависит от конкретного случая. в простых случаях вполне нормально, например:
enum { eDog, eFox, eWolf };
....
std::string SomeEnumToSomeString(int e)
{
    switch(e)
    {
    case eDog:  return "Dog";
    case eFox:  return "Fox";
    case eWolf: return "Wolf";
    }
    throw "Unexpected enum";
}

смотрится вполне читабельно.
Re: return из switch
От: Аноним  
Дата: 14.08.08 15:59
Оценка:
Спасибо всем за ответы!
В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
Re[4]: return из switch
От: The Lex Украина  
Дата: 15.08.08 14:26
Оценка:
Здравствуйте, alzt, Вы писали:

A>А вообще ситуации разные бывают. Ретурн меняет поведение свитча


Ай. Непоставленный в нужном месте или поставленный в ненужном break тоже ой как "меняет поведение свича"...

A>, т.е. я ожидаю, что управление перейдёт на следующую строку после свитча, а на самом деле может произойти выход из функции. Т.к. свитч может быть большой, то легко проглядеть.


Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.
Голь на выдумку хитра, однако...
Re[2]: return из switch
От: The Lex Украина  
Дата: 15.08.08 14:28
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Спасибо всем за ответы!

А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.

Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
Голь на выдумку хитра, однако...
Re[2]: return из switch
От: Erop Россия  
Дата: 17.08.08 17:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Спасибо всем за ответы!

А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
Важно не это. Важно чтобы все ветви switch'а одиаково заканчивались. Или все return'ом или все break'ом. А не так, что там return, тут break, а там "проваливающися brrak"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: return из switch
От: Аноним  
Дата: 18.08.08 08:22
Оценка: +1
А>Спасибо всем за ответы!
А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.

ИМХО большой свитч — плохой свитч. Если необходимо делать длинное перечисление, то функциональную часть каждого случая уместней переводить в отдельный метод. Например:

switch (m_Direction)
{
case 0:
    return GoToSouth();
case 1:
    return GoToWest();
case 2:
    return GoToNorth();
case 3:
    return GoToEast();
default:
    return ERROR_REDCODE;
}



ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?
Re[5]: return из switch
От: EyeOfHell  
Дата: 18.08.08 08:25
Оценка:

Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.


Почти все state machines выглядят как свечи. Основательная state machine даже при очень хорошей декомпозиции будет иметь большие свичи, которые в таблицы не преобразуются по определению.

State machines конечно используются реже чем 'тут у нас морда программы, тут ее логика, а тут сигналы', но все равно достаточно, чтобы свичи были. И как от них избавляться?
Re[3]: return из switch
От: EyeOfHell  
Дата: 18.08.08 08:26
Оценка: +1

Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!


state machines
Re[3]: return из switch
От: Аноним  
Дата: 18.08.08 08:48
Оценка:
А>ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?
Код со свичом:
class Walker
{
int m_Direction;
public:
Walker(int direction):m_Direction(direction){};
int Go()
{
switch (m_Direction)
{
case 0:
    return GoToSouth();
case 1:
    return GoToWest();
case 2:
    return GoToNorth();
case 3:
    return GoToEast();
default:
    return ERROR_REDCODE;
}
}
};
Код без:

class IWalker
{
public:
virtual int Go() = 0;
};

class SouthWalker : public IWalker
{
public:
virtual int Go(){return GoToSouth()};
};

class WestWalker : public IWalker
{
public:
virtual int Go(){return GoToWest()};
};

class NorthWalker : public IWalker
{
public:
virtual int Go(){return GoToNorth()};
};

class EastWalker : public IWalker
{
public:
virtual int Go(){return GoToEast()};
};


Предвещая вопрос что типа в создании конкретного экземпляра класса потребуется свич — нет не потребуется, если раскрутить логику до уровня когда каждое направление имеет свою отдельную ветвь исполнения с самого начала определения направления.
Re[3]: return из switch
От: Аноним  
Дата: 18.08.08 09:04
Оценка: :)
Здравствуйте, The Lex, Вы писали:

TL>Здравствуйте, Аноним, Вы писали:


А>>Спасибо всем за ответы!

А>>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.

TL>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!


Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"?
Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
Re[4]: return из switch
От: Аноним  
Дата: 18.08.08 09:10
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>>ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?


[]

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


Если так логику раскрутить, то и исходный свитч не понадобится.
Re[4]: return из switch
От: FlamingWind Россия  
Дата: 18.08.08 09:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?

А>
А>Код без:

А>class IWalker
А>{
А>public:
А>virtual int Go() = 0;
А>};

А>class SouthWalker : public IWalker
А>{
А>public:
А>virtual int Go(){return GoToSouth()};
А>};

А>class WestWalker : public IWalker
А>{
А>public:
А>virtual int Go(){return GoToWest()};
А>};

А>class NorthWalker : public IWalker
А>{
А>public:
А>virtual int Go(){return GoToNorth()};
А>};

А>class EastWalker : public IWalker
А>{
А>public:
А>virtual int Go(){return GoToEast()};
А>};
А>


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


Красиво

Только, все же, если до токо как "куда-нибудь пойти" идет много-много общих строк кода и выбор направления движения как раз таки определяется переменной Direction. В этом случае, как я понимаю, без switch никак?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.