Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "switch" vs "if/else", выбор? 
V
    Опции темы
baldina
Дата 25.4.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



SABROG, код ужаснул меня...
PM MAIL   Вверх
SABROG
Дата 25.4.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(baldina @ 25.4.2008,  13:04)
SABROG, код ужаснул меня...

Меня самого он ужасает, иногда прежде чем думать про оптимизацию сначала стоит задача сделать так, чтобы работало хоть как-то, чтобы понять в правильном вообще направлении я иду или нет. Уже 2 раза переписывал ядро программы. Причем иногда очевидные вещи даже в голову не приходят.

Цитата(mes @  25.4.2008,  12:51 Найти цитируемый пост)
а не проще разгрузить такое большое кол-во однотипных операций - самому же дышать легче будет.

Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

Это сообщение отредактировал(а) SABROG - 25.4.2008, 14:01


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

смотри в сторону перегрузки метода

Добавлено через 2 минуты и 12 секунд
Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Меня самого он ужасает, иногда прежде чем думать про оптимизацию 

 в данном примере не оптимизация, а построение логики


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 25.4.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @ 25.4.2008,  14:14)
Цитата(SABROG @  25.4.2008,  13:49 Найти цитируемый пост)
Если бы там были только текстовые данные, так там ведь может быть что угодно вообще. Одним toString() не обойдешься. Там и toDouble, и toUInt(), и toInt(). Причем в некоторых случаях int надо преобразовывать в указатель. По сути под каждый уникальный параметр (не тип!) свое действие.

смотри в сторону перегрузки метода

Смотрел и шаблоны смотрел. Не особо меня радует это. Сделал вариант со свичем: 

Код

namespace Tp
{
    enum tParTypes
    {
        None,
        Name, 
        Note, 
        Tour, 
        Country, 
        Operator, 
        Postfix, 
        Owner, 
        OpComission,
        Comission,
        Currency,
        SposNote,
        SpogNote,
        CatNote,
        SpoSort,
        XmlEngine,
        Type,
        tSort,
        Service,
        ToFreight,
        BackFreight
    };
}
...
QHash <unsigned int, QString> lstParNames;
...
    lstParNames[Tp::Name] = "name";
    lstParNames[Tp::Note] = "note";
    lstParNames[Tp::Tour] = "tour";
    lstParNames[Tp::Country] = "country";
    lstParNames[Tp::Operator] = "operator";
    lstParNames[Tp::Postfix] = "postfix";
    lstParNames[Tp::Owner] = "owner";
    lstParNames[Tp::OpComission] = "opcomission";
    lstParNames[Tp::Comission] = "comission";
    lstParNames[Tp::Currency] = "currency";
    lstParNames[Tp::SposNote] = "sposnote";
    lstParNames[Tp::SpogNote] = "spognote";
    lstParNames[Tp::CatNote] = "catnote";
    lstParNames[Tp::SpoSort] = "sposort";
    lstParNames[Tp::XmlEngine] = "xmlengine";
    lstParNames[Tp::Type] = "type";
    lstParNames[Tp::tSort] = "sort";
...
            QHashIterator<unsigned int, QString> i(lstParNames);
            while (i.hasNext()) 
            {
                i.next();
                if (!pBase->record().isNull(i.value()))
                {
                    QVariant parVal = pBase->record().isNull(i.value());
                    switch(i.key())
                    {
                    case Tp::None:
                        break;
                    case Tp::Name:
                        row->name = parVal.toString();
                        break;
                    case Tp::Note:
                        row->note = parVal.toString();
                        break;
                    case Tp::Tour:
                        row->Tour = parent->tour->value(parVal.toUInt());
                        break;
                    case Tp::Country:
                        row->Country = parent->state->value(parVal.toUInt());
                        break;
                    case Tp::Operator:
                        row->Operator = parent->partner->value(parVal.toUInt());
                        break;
                    case Tp::Postfix:
                        row->postfix = parVal.toString();
                        break;
                    case Tp::Owner:
                        row->Owner = parent->partner->value(parVal.toUInt());
                        break;
                    case Tp::OpComission:
                        row->OpCom = parVal.toDouble();
                        break;
                    case Tp::Comission:
                        row->Com = parVal.toDouble();
                        break;
                    case Tp::Currency:
                        row->Currency = parent->currency->value(parVal.toUInt());
                        break;
                    case Tp::SposNote:
                        row->sposnote = parVal.toString();
                        break;
                    case Tp::SpogNote:
                        row->spognote = parVal.toString();
                        break;
                    case Tp::CatNote:
                        row->catnote = parVal.toString();
                        break;
                    case Tp::SpoSort:
                        row->SpoSort = parVal.toInt();
                        break;
                    case Tp::XmlEngine:
                        row->xmlEngine = parVal.toUInt();
                        break;
                    case Tp::Type:
                        row->SpoType = parVal.toInt();
                        break;
                    case Tp::tSort:
                        row->sort = parVal.toUInt();
                        break;
                    }
                }
            }





--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 25.4.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



P.S. для уникальных типов - уникальные операции
P.S.S кстати насчет строковых имен - я бы посоветовал бы использовать вместо них строковые константы 
Преимушества:
1. при опечатке компилятор заметит
2. при смене имени ключа не стоит переживать что где то  в теле завбудешь исправить имя
3. переменная может быдь названа более удобным способом -(например если ключ слишком длинный)
4. и многое другое))


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


любитель
****


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

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



Цитата(SABROG @  25.4.2008,  14:19 Найти цитируемый пост)
Смотрел и шаблоны смотрел. Не особо меня радует это. Сделал вариант со свичем: 

ну ты и намудрил! но обсуждать здесь совесть не позволяет и так ушли от темы .
Если хочешь выслушать предложения заведи другую тему ))



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 25.4.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Мда... Читать, если честно, ужасно smile Рефакторить надо smile 

ЗЫ Функции больше 15 строчек есть зло!


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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Любитель @  25.4.2008,  16:47 Найти цитируемый пост)
ЗЫ Функции больше 15 строчек есть зло!

ты не прав, есть ф-ии где по другому не обойтись. Да и в большинстве своем они больше 15 строчек...


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 25.4.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Любитель @  25.4.2008,  15:47 Найти цитируемый пост)
 Функции больше 15 строчек есть зло! 

Цитата(vinter @  25.4.2008,  15:57 Найти цитируемый пост)
ты не прав, есть ф-ии где по другому не обойтись. 


значит функции злые - не всем же им добрыми быть))



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 25.4.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(vinter @  25.4.2008,  15:57 Найти цитируемый пост)
ты не прав, есть ф-ии где по другому не обойтись

Экстрактить в отдельный метод smile


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Любитель @  25.4.2008,  15:59 Найти цитируемый пост)
Экстрактить в отдельный метод

Это когда получается. А бывает, что надо заводить структуры на 5-10 параметров... ага. И в итоге код получается в два раза больше... и ни фига не понятнее.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 25.4.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



И вообще, не надо впадать в крайности. Согласен, код функции, занимающий более 15-20 строчек, вызывает напряги. Но иногда невозможно разделить большую функцию на несколько маленьких (например, контекст огромный). Так же и с goto - в большинстве случаев он не нужен, но иногда (выход из вложенного цикла, например) он предпочтителен, так как и быстрей, и наглядней, по моему.
PM   Вверх
MAKCim
Дата 25.4.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(mes @  25.4.2008,  10:52 Найти цитируемый пост)
Так ?

так может быть переполнение стека

Цитата(Mayk @  25.4.2008,  11:20 Найти цитируемый пост)
что нет? покажи полностью небольшой пример когда контструкцию с goto *[] нельзя свести к switch/case.

замени в моем предыдущем примере статический массив динамическим  smile 

Цитата(Mayk @  25.4.2008,  11:20 Найти цитируемый пост)
зависит от оптимизатора компилятора. Некоторые вполне за О(1) перепрыгнут куда надо.

чем больше состояний, тем больше среднее время выполнения одной итерации

Цитата(Lazin @  25.4.2008,  12:20 Найти цитируемый пост)
неа, если например case-ы - целые значения идущие по порядку, то смещение может быть вычислено вместо проверки всех условий, либо смещение берется из таблицы, либо просто вычисляется.

наводит на мысль о двоичном поиске в таком случае, но не об O(1)
т. е 
Код

switch (number) {
    case 0: return 0;
    case 1: return 1;
    case 2: return 2;
    case 3: return 3;
    case 4: return 4;
    case 5: return 5;
    case 6: return 6;
}

и number = 4

при "тупой" реализации switch/case нужно 5 проверок
при реализации двоичного поиска 2-3
но никак не 1
соответственно число сравнений возрастает с увеличением числа case

Добавлено через 3 минуты и 39 секунд
Цитата(bsa @  25.4.2008,  19:51 Найти цитируемый пост)
Согласен, код функции, занимающий более 15-20 строчек, вызывает напряги

смотря кто писАл код  smile 


Это сообщение отредактировал(а) MAKCim - 25.4.2008, 20:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 25.4.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(MAKCim @  25.4.2008,  19:39 Найти цитируемый пост)
при "тупой" реализации switch/case нужно 5 проверок
при реализации двоичного поиска 2-3
но никак не 1

Макс, не факт. Пробегала инфа, что для switch многие компиляторы используют хэширование smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 25.4.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(MAKCim @  25.4.2008,  20:39 Найти цитируемый пост)
так может быть переполнение стека

не совсем понял .. что именно вызывает переполнение в отличие от "оригинального" примера?



--------------------
PM MAIL WWW   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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