Здравствуйте, Аноним, Вы писали:
А>Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу
некоторые думают, чтj это не кошерно. Для оптимизации пофиг.
Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу
скорость тут не при чем. return в произвольном месте, так же как и goto, нарушает линейность кода . И когда Вы через полгода будете править этот свич, то можете пропустить return и даписать код после него. А потом неделю искать багу .
Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .
Слышал, что ретурн из свитча не есть гуд. Почему — не знаю, возможно из-за худшей оптимизации. Развейте, пожалуйста, сомнения по этому поводу
EOH>скорость тут не при чем. return в произвольном месте, так же как и goto, нарушает линейность кода . И когда Вы через полгода будете править этот свич, то можете пропустить return и даписать код после него. А потом неделю искать багу .
EOH>Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .
хм.. а мне кажется ретурн в свитче улучшает читабельность кода
Здравствуйте, Аноним, Вы писали:
EOH>>Но это даже не методология, а так, рекомендация. Что-то вроде "если можно легко обойтись без return в switch — лучше его там не писать". Понятное дело что если по логике функции return там уместен — то он там и должен быть .
А>хм.. а мне кажется ретурн в свитче улучшает читабельность кода
В примере который выше — мне тоже так кажется.
А вообще ситуации разные бывают. Ретурн меняет поведение свитча, т.е. я ожидаю, что управление перейдёт на следующую строку после свитча, а на самом деле может произойти выход из функции. Т.к. свитч может быть большой, то легко проглядеть.
EOH>скорость тут не при чем. return в произвольном месте, так же как и goto, нарушает линейность кода . И когда Вы через полгода будете править этот свич, то можете пропустить return и даписать код после него. А потом неделю искать багу .
В С++ нельзя полагаться на некую "линейность" хотябы потому что там еще исключения иногда бывают, и написанному коду должно быть пофиг где происходит выход (с учетком нормально вызова деструкторов всяческих гардов).
В С++ нельзя полагаться на некую "линейность" хотябы потому что там еще исключения иногда бывают, и написанному коду должно быть пофиг где происходит выход (с учетком нормально вызова деструкторов всяческих гардов)
Так кто спорит. Но, к сожалению, когда через полгода-год нужно что-то поменять в паре десятков тысячь строк кода и навигация по нему идет исключительно через code definition window и find, то велика вероятность пропустить неочевидное поведение. Поэтому в больших проектах стараются код по мере сил держать линейным, неочевидного ничего не писать а исключения использовать исключительно для обработки ошибок . Дабы снизить последующие наклодные расходы по отладке и сопровождению. Исключить проблемы, понятное дело, не получается. Но если благодаря простому коду удалось впоследствии избежать хотя бы нескольких багов от его изменения — то это уже очень значительный плюс по времени.
Все это субъектино, конечно. Костыли так сказать, потому что слаб человек и память у него не ахти . Понятное дело что внимательному программисту с хорошей памятью вся эта мишура нафиг не нужна. Но, к сожалению, кода много — а внимательных людей с хорошей памятью мало. Приходится выкручиваться кто как может .
Здравствуйте, alzt, Вы писали:
A>А вообще ситуации разные бывают. Ретурн меняет поведение свитча
Ай. Непоставленный в нужном месте или поставленный в ненужном break тоже ой как "меняет поведение свича"...
A>, т.е. я ожидаю, что управление перейдёт на следующую строку после свитча, а на самом деле может произойти выход из функции. Т.к. свитч может быть большой, то легко проглядеть.
Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.
Здравствуйте, Аноним, Вы писали:
А>Спасибо всем за ответы! А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
Здравствуйте, Аноним, Вы писали:
А>Спасибо всем за ответы! А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
Важно не это. Важно чтобы все ветви switch'а одиаково заканчивались. Или все return'ом или все break'ом. А не так, что там return, тут break, а там "проваливающися brrak"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
А>Спасибо всем за ответы! А>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме 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++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?
Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.
Почти все state machines выглядят как свечи. Основательная state machine даже при очень хорошей декомпозиции будет иметь большие свичи, которые в таблицы не преобразуются по определению.
State machines конечно используются реже чем 'тут у нас морда программы, тут ее логика, а тут сигналы', но все равно достаточно, чтобы свичи были. И как от них избавляться?
Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
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>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"?
Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
Здравствуйте, Аноним, Вы писали:
А>>ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?
[]
А>Предвещая вопрос что типа в создании конкретного экземпляра класса потребуется свич — нет не потребуется, если раскрутить логику до уровня когда каждое направление имеет свою отдельную ветвь исполнения с самого начала определения направления.
Если так логику раскрутить, то и исходный свитч не понадобится.
Здравствуйте, Аноним, Вы писали:
А>>ПО сабжу: Камрады, один знакомый все утверждал, что использование 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 никак?
Re[5]: return из switch
От:
Аноним
Дата:
18.08.08 09:16
Оценка:
А>Если так логику раскрутить, то и исходный свитч не понадобится.
дык
Re[5]: return из switch
От:
Аноним
Дата:
18.08.08 09:21
Оценка:
FW>Только, все же, если до токо как "куда-нибудь пойти" идет много-много общих строк кода и выбор направления движения как раз таки определяется переменной Direction. В этом случае, как я понимаю, без switch никак?
Ну ведь гдето есть код который выставляет эту переменную в нужные значения в зависимости от неких внешних факторов, которые выражаются не свичом, а логикой более высокого уровня (которую принято называть базнес-логикой) ? Так прямо там и создавать нужный класс.
Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.
EOH>Почти все state machines выглядят как свечи. Основательная state machine даже при очень хорошей декомпозиции будет иметь большие свичи, которые в таблицы не преобразуются по определению.
EOH>State machines конечно используются реже чем 'тут у нас морда программы, тут ее логика, а тут сигналы', но все равно достаточно, чтобы свичи были. И как от них избавляться?
Здравствуйте, Аноним, Вы писали:
А>Ну ведь гдето есть код который выставляет эту переменную в нужные значения в зависимости от неких внешних факторов, которые выражаются не свичом, а логикой более высокого уровня (которую принято называть базнес-логикой) ? Так прямо там и создавать нужный класс.
Ну пусть "бизнес-логтка" такая: Повернуть налево на столько направлений, сколько полных часов прошло с начала суток. И что деалть бум?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: return из switch
От:
Аноним
Дата:
18.08.08 13:34
Оценка:
E>Ну пусть "бизнес-логтка" такая: Повернуть налево на столько направлений, сколько полных часов прошло с начала суток. И что деалть бум?
Хреновый ТЗ. Давайте вы лучше вначале код со свичом напишете который ее реализует, а там посмотрим.
class Walker {
public:
enum Direction_t{ Nord, East, South, West };
Walker()
{
setWalker( Nord, &Walker::goNord );
setWalker( East, &Walker::goEast );
setWalker( South, &Walker::goSouth );
setWalker( West, &Walker::goWest );
}
int Walk( Direction_t d, int param )
{
WalkerMethod walker = getWalker( d );
assert( walker != 0 );
return (this->*walker)( param );
}
private:
typedef int Walker::*WalkerMethod( int );
void setWalker( Direction_t, WalkerMethod ); // Реализаия неважна. Например std::map<Direction_t, WalkerMethod>
WalkerMethod getWalker( Direction_t ) const;
собственно методы
int goNord( int );
int goEast( int );
int goSouth( int );
int goWest( int );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>Хреновый ТЗ. Давайте вы лучше вначале код со свичом напишете который ее реализует, а там посмотрим.
dir = ( dir + howrs ) % Dir_Count;
Walk( dir );
Так хорошо?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Не делай больших свичей, как и вообще ветви свчиа, густо и сытно наполненные функциональностью.
EOH>Почти все state machines выглядят как свечи. Основательная state machine даже при очень хорошей декомпозиции будет иметь большие свичи, которые в таблицы не преобразуются по определению.
Угу. Если у тебя еще и автомат состояний "вручную описан на больших-больших свичах" — тогда, извините, это не ко мне.
Здравствуйте, Аноним, Вы писали:
А>>>Спасибо всем за ответы! А>>>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
TL>>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
А>Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"? А>Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
Лично я всегда не любил "код идусского типа" — который "много-много строк кода, за которые и будет уплочено". Каждому свое, как говорили одни мои земляки — но не просите меня за эти "много кода" вас и ваш код любить и даже уважать.
Голь на выдумку хитра, однако...
Re[9]: return из switch
От:
Аноним
Дата:
18.08.08 20:52
Оценка:
А>>Хреновый ТЗ. Давайте вы лучше вначале код со свичом напишете который ее реализует, а там посмотрим. E>
dir = ( dir + howrs ) % Dir_Count;
E>Walk( dir );
Так хорошо?
лехко
dir = ( dir + howrs ) % Dir_Count;
walker[dir]->Go();
class Walker {
public:
enum Direction_t{ Nord, East, South, West };
Walker()
{
const struct { Direction_t direction; WalkerMethod method; } the_way[] =
{
Nord, &Walker::goNord,
East, &Walker::goEast,
South, &Walker::goSouth,
West, &Walker::goWest
};
for (int i = 0; i < sizeof(the_way)/sizeof(the_way[0]); ++i)
setWalker( the_way[i].direction, the_way[i].method );
}
...
}
За орфографию не ручаюсь — писал прямо "по вебу" — в результате "писанины" весь "управляющий алгоритм" естественно и небезебразно "уезжает из кода в данные" со всеми вытекающими...
ЗЫ: описание массива прямо в конструкторе неуклюже и непринципиально — просто чтобы не выдумывать "специальное место для", а принцип проиллюстрировать...
dir = ( dir + howrs ) % Dir_Count;
А>walker[dir]->Go();
А>
А как этот код соотносится со следующим высказыванием:
Ну ведь гдето есть код который выставляет эту переменную в нужные значения в зависимости от неких внешних факторов, которые выражаются не свичом, а логикой более высокого уровня (которую принято называть базнес-логикой) ? Так прямо там и создавать нужный класс.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, The Lex, Вы писали:
TL>ЗЫ: описание массива прямо в конструкторе неуклюже и непринципиально — просто чтобы не выдумывать "специальное место для", а принцип проиллюстрировать...
Так тоже можно, и обычно лкчше имено так. Но в данном конкретном случае, IMHO, подход с таблицей более громоздкий...
Кроме того, если писать не таблицу, а серию setWalker, то можно написать и что-то вроде
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: return из switch
От:
Аноним
Дата:
19.08.08 07:05
Оценка:
Здравствуйте, The Lex, Вы писали:
TL>Здравствуйте, Аноним, Вы писали:
А>>>>Спасибо всем за ответы! А>>>>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
TL>>>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
А>>Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"? А>>Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
TL>Лично я всегда не любил "код идусского типа" — который "много-много строк кода, за которые и будет уплочено". Каждому свое, как говорили одни мои земляки — но не просите меня за эти "много кода" вас и ваш код любить и даже уважать.
"код идусского типа" — который "много-много строк кода, за которые и будет уплочено".
Блин, а кто не индус-то тогда?
А если в индусы записывать тех кто пользует свитч.. то Индия была бы богатейшей страной мира.
Re[11]: return из switch
От:
Аноним
Дата:
19.08.08 07:09
Оценка:
E>А как этот код соотносится со следующим высказыванием:
Ну ведь гдето есть код который выставляет эту переменную в нужные значения в зависимости от неких внешних факторов, которые выражаются не свичом, а логикой более высокого уровня (которую принято называть базнес-логикой) ? Так прямо там и создавать нужный класс.
Угу. Если у тебя еще и автомат состояний "вручную описан на больших-больших свичах" — тогда, извините, это не ко мне
А как вы предлагаете писать автоматы состояний? С учетом того, что в процессе изменения кода примитивный автомат может подрости 'естественным образом'.
Сразу уточню: я согласен с тем, что для задач чтени-записи форматов и протоколов state machine не нужны — есть готовые библиотеки, xml парсеры итд. Но, к сожалению, за мою более чем десятилетнюю практику достаточно часто встречались случаи, когда state machine нужна была в коде и библиотекой не решалась. Ваше мнение, как быть?
Угу. Если у тебя еще и автомат состояний "вручную описан на больших-больших свичах" — тогда, извините, это не ко мне
EOH> А как вы предлагаете писать автоматы состояний?
Я предлагаю любой управляющий механизм выносить в данные. Особенно:
EOH> С учетом того, что в процессе изменения кода примитивный автомат может подрости 'естественным образом'.
(к)
EOH>Сразу уточню: я согласен с тем, что для задач чтени-записи форматов и протоколов state machine не нужны — есть готовые библиотеки, xml парсеры итд. Но, к сожалению, за мою более чем десятилетнюю практику достаточно часто встречались случаи, когда state machine нужна была в коде и библиотекой не решалась. Ваше мнение, как быть?
Никак. Сделать людям доброе дело и бросить это дело — программирование и вообще.
Если честно, я злой — невыспался — а ты сам толком не понимаешь что спросить, но спросить хочешь, и спрашиваешь "а как вообще быть-то"? Потому ответ "вообще никак не быть — самое то!" (к) — имхо, самый правильный общий ответ на общий вопрос.
Если честно, я злой — невыспался — а ты сам толком не понимаешь что спросить, но спросить хочешь, и спрашиваешь "а как вообще быть-то"? Потому ответ "вообще никак не быть — самое то!" (к) — имхо, самый правильный общий ответ на общий вопрос.
Да я вообщем-то тоже не добрый, просто маска у меня очень тщательно закреплена и сон на нее не влияет . Сами же наверняка понимаете, что это неконструктивно и просто самоутверждаетесь за мой счет . Я высказал мнение, что return из switch плохо потому что switch может быть большим. Получил ответ, что больших свитчей не бывает. Привел пример state machines. Получил ответ что 'state machines на свичах не пишут'. А на резонный вопрос 'на чем же их пишут?' получил закономерное 'Завязывал бы ты с программированием, пацан' .
Вообщем удачи Вам и все такое. Высыпайтесь лучше и будет вам щастье .
P.S. Спросить я ничего не хочу, я уже и так все что мне нужно для зарабатывания денег знаю. Меня интересует эффективность программирования — чтобы можно было создавать программы быстро, но багов при этом было мало и эволюционировали программы легко. И я готов пообсуждать разные подходы, методологии стили и приемы. А кто круче мне не интересно, уж извиняйте.
Здравствуйте, EyeOfHell, Вы писали:
EOH>Да я вообщем-то тоже не добрый, просто маска у меня очень тщательно закреплена и сон на нее не влияет . Сами же наверняка понимаете, что это неконструктивно и просто самоутверждаетесь за мой счет . Я высказал мнение, что return из switch плохо потому что switch может быть большим. Получил ответ, что больших свитчей не бывает. Привел пример state machines. Получил ответ что 'state machines на свичах не пишут'. А на резонный вопрос 'на чем же их пишут?' получил закономерное 'Завязывал бы ты с программированием, пацан' .
Люблю я любителей думать за меня однако — к сожалению, за их счет особо не утвердишься в виду необходимости самостоятельного выдумывания конструктива — с тем же успехом можно "просто его выдумывать".
1. return из switch — это не плохо — это очень даже хорошо. Плохо то, "что switch может быть большим".
2. state machines — это не плохо — это очень даже хорошо. Плохо "для реализации state machines писать большой свич", а аргументировать его "наличием state machines" — это еще хуже. Это как раз из разряда: "нам за строки кода платят — нафиг нам сдался компактный код" (к)
3. "на чем пишут state machines?" — тут привели пример генератора. При желании пишется свой. Также можно написать — как привел привер Егор — сам механизм state machines, а карту переходов вынести в конфигурабельность. Вся эта петрушка происходит именно от того, от чего отталкиваешься ты, приводя это как аргумент "что return из switch плохо потому что switch может быть большим". Вместо того, чтобы не делать большие свичи, а в легких и прозрачных запросто применять ретурны, ты придумываешь оправдания, почему таки, по твоему скромному мнению, надо делать большие свичи. А их не надо делать _вообще_. Никто не против, если автомат переходов у тебя будет на свичах — но автомат отдельно, а функциональность отдельных состояний — отдельно. "Разделяй и властвуй" — в программировании сей постулат архиприменим как нигде. (политику не будем — там как раз неприменим для целей _созидания_ )
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, The Lex, Вы писали:
TL>>Здравствуйте, Аноним, Вы писали:
А>>>Спасибо всем за ответы! А>>>В общем, чем сложнее и больше свитч, тем менее желательно использовать в нём для выхода что-либо кроме break.
TL>>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
А>Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"? А>Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
"Много кода" и "много говнокода" — это разные вещи.
Здравствуйте, The Lex, Вы писали:
TL>2. state machines — это не плохо — это очень даже хорошо. Плохо "для реализации state machines писать большой свич", а аргументировать его "наличием state machines" — это еще хуже. Это как раз из разряда: "нам за строки кода платят — нафиг нам сдался компактный код" (к)
Враньё чистейшей воды. Не было таких слов, и смысл там был совсем другой.
Re[8]: return из switch
От:
Аноним
Дата:
21.08.08 07:46
Оценка:
EOH>Сразу уточню: я согласен с тем, что для задач чтени-записи форматов и протоколов state machine не нужны — есть готовые библиотеки, xml парсеры итд. Но, к сожалению, за мою более чем десятилетнюю практику достаточно часто встречались случаи, когда state machine нужна была в коде и библиотекой не решалась. Ваше мнение, как быть?
Result StateMachine::HandleStateChange(NewState st)
{
switch (st)
{
case State1:
return onSTate1();
case State2:
return onSTate2();
case State3:
return onSTate3();
case State4:
return onSTate4();
case State5:
return onSTate5();
case State6:
return onSTate6();
case State7:
return onSTate7();
............
}
}
И все. НИКАКОГО БОЛЬШЕ КОДА В ФУНКЦИИ СО СВИЧОМ. Если уж угораздило сделать свич.
Re[9]: return из switch
От:
Аноним
Дата:
21.08.08 08:59
Оценка:
Здравствуйте, Аноним, Вы писали:
[]
А>И все. НИКАКОГО БОЛЬШЕ КОДА В ФУНКЦИИ СО СВИЧОМ. Если уж угораздило сделать свич.
Угораздило? А как безнего?
Когда-то удобно делать так, но не всегда. Иногда удобно, чтобы все данные были перед глазами. Тогда и усилий по их передаче в функции делать не нужно (это не так просто как кажется). И дебажить проще. Плодить сами функции опять же не нужно. Например, код printf и библиотека eXpat не используют подход с функциями.
Re[10]: return из switch
От:
Аноним
Дата:
21.08.08 09:07
Оценка:
А>Угораздило? А как безнего? А>Когда-то удобно делать так, но не всегда. Иногда удобно, чтобы все данные были перед глазами. Тогда и усилий по их передаче в функции делать не нужно (это не так просто как кажется). И дебажить проще. Плодить сами функции опять же не нужно. Например, код printf и библиотека eXpat не используют подход с функциями.
Как раз таки нужно. В современном С++ коде в большинстве случаев функционал можно разбить на полностью самостоятельные фрагменты строчек по 40.
"код printf и библиотека eXpat" не являются современным С++ кодом. Они вообще не С++, и кроме того есть код индустриальной библиотеки, и код коммерческого активно развиваемого — 2 большие разницы. Не стоит в коммерческих проектах подражать библиотекам типа CRT, буста etc.
Re[11]: return из switch
От:
Аноним
Дата:
21.08.08 09:29
Оценка:
Здравствуйте, Аноним, Вы писали:
А>>Угораздило? А как безнего? А>>Когда-то удобно делать так, но не всегда. Иногда удобно, чтобы все данные были перед глазами. Тогда и усилий по их передаче в функции делать не нужно (это не так просто как кажется). И дебажить проще. Плодить сами функции опять же не нужно. Например, код printf и библиотека eXpat не используют подход с функциями. А>Как раз таки нужно. В современном С++ коде в большинстве случаев функционал можно разбить на полностью самостоятельные фрагменты строчек по 40. А>"код printf и библиотека eXpat" не являются современным С++ кодом. Они вообще не С++, и кроме того есть код индустриальной библиотеки, и код коммерческого активно развиваемого — 2 большие разницы. Не стоит в коммерческих проектах подражать библиотекам типа CRT, буста etc.
Размазывание кода по функциям в 40 строк.. и куда катится "современный" С++
п.с. О привязке к С++ вообще никто не говорил.
Re[12]: return из switch
От:
Аноним
Дата:
21.08.08 09:38
Оценка:
А>Размазывание кода по функциям в 40 строк.. и куда катится "современный" С++
К легко тестируемому и поддерживаемому коду.
А>п.с. О привязке к С++ вообще никто не говорил.
С и С++ совершенно разные языки по подходам к кодировани. Тогда уж надо уточнять.
Вместо того, чтобы не делать большие свичи, а в легких и прозрачных запросто применять ретурны, ты придумываешь оправдания, почему таки, по твоему скромному мнению, надо делать большие свичи. А их не надо делать _вообще_. Никто не против, если автомат переходов у тебя будет на свичах — но автомат отдельно, а функциональность отдельных состояний — отдельно. "Разделяй и властвуй" — в программировании сей постулат архиприменим как нигде. (политику не будем — там как раз неприменим для целей _созидания_.
Наверное мы с Вами друг друга не поняли. Мне оправдываться тут вообщем-то не перед кем . Возник сугу бо теоретический вопрос, почему гуру не любят return в switch. Я гуру себя не считаю, но рассказал, что вообще return не любят в больших свичах, потому что эти свичи потом править и менять, а если там return то можно неправильно поменять и будут баги.
Я — против написания больших свичей. Действительно против. Я вообще не люблю большие функции, люблю декомпозицию и уважаю справочные таблицы. Но я могу утверждать, что большие свичи встречаются. И лично мне встречались. И не всегда получается быстро и качественно писать без них. Тривиальный код на пять строк — там пофиг есть return или нет .
Генератор автоматов — это очень круто. Только вот я, как профессионал ( не в том смысле что крут, а в том что продаю свои умения за деньги ) привык решать задачи наиболее простым способом. И если мне нужна в коде логика, которая подозрительно похожа на state machine, то я оцениваю ее объем и время. И если мне ее руками писать 5 минут, а генератором 30, и при этом отладка однозначно покрывается юнит тестом — то я буду писать руками. Не потому что не умею пользоваться генератором, а потому что руками оно быстрее решается. И return я там ставить не буду . Ставил уже. Потом плохо было .
ПО сабжу: Камрады, один знакомый все утверждал, что использование switch в C++ вообще... неуместно в принцепи! Мол в C++ надо "как-то иначе". Естесно, на вопрос "Как?" ответ не прозвучал. Может кто нибудь сведующий кашерный стиль кодинга развеет непонимание?
Наиболее простой шаблон — это справочна таблица. В отличие от свича она растет вне кода и в ней нельзя сделать синтаксическую ошибку. Контейнеры вида map — дешего и сердито. Свичи применяются строго в случаях когда вариантов не много и на них должна быть разная реакция. В этом плане switch предпочтительнее if() ... else if(), так как в последнем есть немаленький шанс напутать с else и порядком проверки условий. Особенно когда возникнет необходимость что-нибудь дописать.