1. Java / Говнокод #1745

    +71.1

    1. 1
    if (getHook() != null ? !getHook().equals(pmCounty.getHook()) : pmCounty.getHook() != null) return false;

    Код западной enterprise системы для риэлторов. Написан русскими.

    Запостил: vladimir.loshchin, 02 Сентября 2009

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

    • ммм, что здесь не так?
      Ответить
    • вы бы не минусы ставили, а объясняли, почему это считается говнокодом и почему так писать нельзя. тогда, глядишь, и перестали бы писать некрасиво.
      Ответить
      • >почему так писать нельзя
        Пожалуйста опиши в нескольких словах, что этот код делает.
        Ответить
    • Слишком сложный код - не читаем при беглом просмотре.
      Ответить
      • а этот читабельнее?
        if ((getHook() != null && !getHook().equals(pmCounty.getHook())) || (getHook() == null && pmCounty.getHook() != null)) return false;
        Ответить
        • Hook h1 = getHook();
          if (h1 == null)
          return false;

          Hook h2 = pmCounty.getHook();
          if (h2 == null)
          return false;

          return h1.equals(h2);
          Ответить
          • if (!h1.equals(h2))
            return false;

            что-то запутался, помогите!
            Ответить
          • совершенно не эквивалентный код
            если уж на то пошло:

            Hook h1 = getHook();
            Hook h2 = pmCounty.getHook();
            if (h1 == null) {
              if (h2 != null)
                return false;
            } else {
            if (!h1.equals(h2))
            return false;
            }

            так может вообще откажемся от тернарного оператора, булевых операций и т. д.?
            Ответить
            • да, но что все ето значит?
              я тупой и для меня ето выглядит как глючный тест на еквиальность хуков.
              Ответить
              • так и есть, это тест на неравенство хуков и теоретически должно писаться так:
                getHook() != pmCounty.getHook()
                или хотя бы так:
                !Hook.equals(getHook(), pmCounty.getHook())
                и это возможно в C#, но не в Java
                Ответить
                • ну так пиши, кто же мешает?

                  public static <T> boolean equals(T value1, T value2) {
                  return value1 != null ? value1.equals(value2) : value2 == null;
                  }

                  !Nvl.equals(getHook(), pmCounty.getHook())

                  работает для любых типов

                  а кидаться платформу менять только потому, что там есть пара кусочков синтаксического сахара это клиника
                  Ответить
            • Вообще от тренарного стоит отказатся в угоду читабильности, если параметры оператора слишком длинные. Если они коротки - можно воспользоваться.
              Ответить
    • Хм, я в своё время участвовал в написании подобной системы (под описанные выше критерии попадает), но торжественно заявляю: такого говна в нашем коде не было. :)
      Ответить
    • Главная проблема такого кода проявляется во время отладки )
      Когда пошагово проходишь подобный код, и он работает не так, как ожидается, хочется кому-нибудь оторвать руки =)
      Ведь так просто разбить его на несколько простых участков, чтобы и читалось легко, и дебаггилось нормально!
      Ответить

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