1. C++ / Говнокод #17440

    +54

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    // Блок кода с выходом по break
    #define BLOCK for (int _count = 1; _count--;)
    
    bool Result::commit()
    {
    	BLOCK {
    		mysql_query(db->mysql, "BEGIN");
    
    		if (!saveBasePart())
    			break;
    
    		if (getCategory() != NULL) {
    			if (!saveCustomValues())
    				break;
    		}
    
    		mysql_query(db->mysql, "COMMIT");
    		return true;
    	}
    
    	mysql_query(db->mysql, "ROLLBACK");
    	return false;
    }

    Запостил: hdkeeper, 14 Января 2015

    Комментарии (20) RSS

    • do {...} while(0); же, более идиоматично.
      Ответить
    • ScopeGuard
      Ответить
      • Имхо, лучше инкапсулировать это в какой-нибудь Transaction:
        // вариант с bool
        bool Result::commit()
        {
            Transaction transaction(db->mysql);
            if (!saveBasePart())
                return false;
            if (getCategory() != NULL)
                if (!saveCustomValues())
                    return false;
            transaction->commit();
            return true;
        }
        
        // вариант с исключениями
        void Result::commit()
        {
            Transaction transaction(db->mysql);
            saveBasePart();
            if (getCategory() != NULL)
                saveCustomValues();
            transaction->commit();
        }
        Ответить
        • если уж на то пошло, то можно было бы начать с использования С++ интерфейса, а не С.
          Ответить
          • Это методы Result'а, наверное, а не глобалки.

            Ну кроме mysql_query само собой.
            Ответить
            • я говорю про мусклеву клиентскую либу. сравни:

              http://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html

              http://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-query.html

              чудаки в крестах однозначно сишным интерфейсом пользуются.
              Ответить
    • goto
      Ответить
      • > C++
        Ты может и не используешь исключения, некоторые могут и использовать...
        Ответить
      • C++ же, не си, какое нахуй goto?
        Ответить
        • `do { ... break; } while (0);` == синтаксический подсластитель для `goto`.
          Ответить
          • В си оно к месту. Но зачем всё это в крестах?
            Ответить
            • dummy, вероятно, намекает, что тарас просто констатировал эквивалентность
              Ответить
              • да.

                а почему борман думает что в крестах это не работает?
                Ответить
                • Он не утверждает, что это не работает.
                  Он хотел сказать, что ему там нет оправдания (кроме, разве что, копи-пасты сишного кода и кодогенерации).
                  Ответить
                  • а. это я не заметил что здесь очередной крестовый поход против goto?...
                    Ответить
                    • Крестовый подход.
                      Ответить
                      • P.S. Оффтоп - домен в .tk у меня таки упёрли, теперь его можно только платно зарегать ;(
                        Ответить
            • А почему нет, если тут это самое нормальное решение?
              Ответить
    • Всё-равно это не бряк на метку.
      Ответить

    Добавить комментарий