1. C# / Говнокод #9484

    +964

    1. 1
    2. 2
    3. 3
    4. 4
    private static int CompareWidgetsByOrder(Widget x, Widget y)
    {
          return x == null ? y == null ? 0 : 1 : y == null ? 0 : x.order > y.order ? -1 : x.order < y.order ? 1 : 0;
    }

    Вот до чего доводит стремление к компактности кода.

    Запостил: nomad99111, 19 Февраля 2012

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

    • я переживаю за приоритет тернарных операций
      Ответить
      • Код работает правильно, точно так же, как до "рефакторинга".
        Ответить
      • Вроде как у тернарного оператора высший приоритет.
        Ответить
    • А вот если расставить скобки и переносы, то стало бы вполне читабельно!
      Ответить
    • Нужен, как минимум, четверичный оператор.
      Ответить
      • Это типа как?
        Ответить
        • да (с)
          Ответить
        • А почему, может быть. Это как расписать таблицу операций примерно следующим образом:

          _ | X | Y
          X | A | B
          Y | C | D

          Применение оператора выглядело бы так:
          foo = A join B ? A : B : C : D;

          Т.о. если X операция X дает true, выполняется A, если X операция Y дает true, выполняется B, и так далее :)
          Ответить
        • Ну, он как троичный, только четверичный.
          Ответить
    • Лично я люблю тернарники и записал бы так:
      return  x == null
      	? y == null 
      	  ? 0 
      	  : 1 
      	: y == null 
      	  ? 0 
      	  : x.order > y.order 
      	    ? -1 
      	    : x.order < y.order 
      	      ? 1 
                    : 0
      ;
      Ответить
      • Вплоть до строчек с x.order разбор кода шел нормально, но дальше я уже потерялся и перестал понимать кто там кому папа.
        Да еще и в прямом Return - запаришься проверять как работает метод, особенно если и в точке вызова результат напрямую передается в другой метод.
        Лучше все-таки соблюдать умеренность.
        Ответить
        • Возможно, самый тупой способ будет самым понятным:
          if (x == null && y == null)
            return 0;
          if (x == null && y != null)
            return 1;
          if (x != null && y == null)
            return 0;
          return x.order > y.order ? 1 : 
            x.order < y.order ? -1 : 
            0;
          Ответить
        • > перестал понимать кто там кому папа
          If you don't have a DAD, you're a BASTARD.
          Ответить

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