А>Если так логику раскрутить, то и исходный свитч не понадобится.
дык
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>>Извините за выражение, но х.там! "чем сложнее и больше свитч, тем менее желательно использовать" (к) — _такой_ большой и сложный свич вообще!
А>Извинить, не извинить не могу, потому что не пойму что за "х.там" может "х.. там"? А>Если я правильно понял, фраза "_такой_ большой и сложный свич вообще! " выражает недовольство большими свитчами. Я тоже не люблю когда много кода. Но когда его мало, босс отказывается платить
"Много кода" и "много говнокода" — это разные вещи.