1. SQL / Говнокод #19649

    −48

    1. 1
    if  res > 0 or res < 0 then  raise   err_code_2; end if;

    PL/SQL, кусок хранимой процедуры в БД очень крупного оператора связи.

    Запостил: Shadowbearer, 17 Марта 2016

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

    • if (nvl(res, 0) = 0) - ну теперь то совсем другое дело

      вообще говном вряд ли может считаться то, что исправляется переделкой трети строки
      так, куриный помёт

      вот если бы ты показал кусок хранимой процедуры, которым крупный оператор связи ворует деньги со счетов абонентов - тогда конечно
      Ответить
      • if res <> 0 then raise err_code_2; end if;

        Код, который крадет деньги со счетов - это хороший, годный код. Здесь ему не место.
        Ответить
        • Ваша проверка работает не 100% одинаково с проверкой в первом после. При null значении у Вас будет исключение, в первом посте исключения не будет.
          Ответить
    • скорее всего раньше было условие res > 0, потом поменялась бизнес-логика и в код дописали второе условие особо не заморачиваясь
      Ответить
    • "налево пойдёшь - коня потеряшь, направо пойдешь - жизнь."
      Ответить
    • как ни крутись, а без жопы не оботись
      Ответить
    • res > 0 or res < 0
      res <> 0
      две разные вещи
      Ответить
      • Орлы?
        Ответить
      • На каком множестве чисел это разные вещи?
        Ответить
        • На неупорядоченном. Ваш кэп.

          В неупорядоченных множествах оператор «равно» существует, а операторов «больше» и «меньше» нет. Пример: комплексные числа.
          Ответить
          • То есть автор кода использованием «больше» и «меньше» решил явно показать, что он комплексные числа точно не использует?
            Ответить
          • а на множестве кортежей операции больше или меньше определены не для всех пар элементов
            например {1,1}<{2,2}
            но {1,2} и {2,1} несравнимы.

            Математика - веселая штука
            Ответить
            • То есть if res > {0,0} or res < {0,0} будет работать только в случае, когда res и {0,0} сравнимы, а в остальных случаях должно кидать исключение?
              Ответить
              • как реализуешь. Я про математические котрежи. Но думаю исключения лучше чем
                a<b false
                a>b false
                a==b false
                Ответить
            • > несравнимы
              А ты их сравнивай лексикографически.

              Вот с множествами будет сложнее.
              Ответить
              • Можно и через random сравнить, если сильно хочется
                Ответить
                • Зачем random? Мыслим иерархически. Пусть наш объект - множество подобъектов ({1,2} - это 1 и 2).
                  array<number> to_sequence(obj) {
                    if(obj is number) return [obj];
                    if(obj is array) {
                      if(ordered(obj)) return concat(map(to_sequence, obj));
                      return concat(map(to_sequence, sort(obj)));
                    }
                    
                    // осталась неделимая питушня, которая не число
                    return [to_number(information(obj))];
                  }
                  
                  {lt|eq|gt} compare(a, b) {
                    if(a is number && b is number) {
                      if(a < b) return lt;
                      if(a > b) return gt;
                      return eq;
                    }
                  
                    A = to_sequence(a);
                    B = to_sequence(b);
                    
                    if(len(A) != len(B)) return compare(len(A), len(B));
                    
                    for(i=0; i<len(A); ++i)
                      if(A[i] != B[i])
                        return compare(A[i], B[i]);
                    
                    return eq;
                  }
                  Ответить
                  • Я о том, что само по себе упорядочивание кортежей - задача нетривиальная. Например в задаче поиска оптимального решения.
                    У нас имеется множество кортежей, характеризующего различные варианты решений, и нам необходимо найти оптимальное. Логично, что тут лексикографическая сортировка ничего хорошего не даст, нужны методики оценивания, эксперты и все такое.
                    Множество Парето, например, немыслимо без понятия несравнимости кортежей. При его поиске мы дробим объекты на классы попарно сравнимых объектом, и из каждого множества выбираем доминирующий вариант.

                    Во всяком случае в моей практике математические кортежи всегда так или иначе сводятся к задаче многокритериальной оптимизации
                    Ответить
    • Что не так с кодом?

      Насколько я вижу, при наличии условия число is not null и отличается от нуля вызывается exception. Что не так...?
      Ответить

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