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

    +80

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    if ( response == null || request == null ) {
          return;
        }
    
        if ( request.getHeader() != null
          && request.getHeader().getChannel() != null
          && request.getHeader().getChannel().getSubChannel() != null
          && request.getHeader().getChannel().getSubChannel().getSubChannel() != null
          && request.getHeader().getChannel().getSubChannel().getSubChannel().getName() != null
          && !request.getHeader()
            .getChannel()
            .getSubChannel()
            .getSubChannel()
            .getName()
            .equalsIgnoreCase( "XXX" ) ) {
          if ( response.getResponseObject() != null
            && response.getResponseObject().getReservation() != null
            && response.getResponseObject().getReservation().getRate() != null
            && response.getResponseObject().getReservation().getRate().getRoom() != null
            && response.getResponseObject()
              .getReservation()
              .getRate()
              .getRoom()
              .getBedType() != null ) {
            response.getResponseObject()
              .getReservation()
              .getRate()
              .getRoom()
              .setBedType( null );
          }
        }

    Индус. Спасибо что два if'a

    Запостил: madhead, 03 Июля 2013

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

    • Человек просто запарился исключения обрабатывать, вот и психанул...
      Ответить
      • Не представляете, насколько правы! В проекте весь код такой - с постоянными проверками. А по факту - из этого кода ничего и не выкинешь :(
        Ответить
      • Трудолюбивый человек.
        Мне бы было лень столько проверок писать, проще исключение обработать
        Ответить
    • проверки на нуллы - это хорошо. плохо, что каждый раз раз заново методы вызываются.
      а вдруг объект станет нуллом между проверками?
      Ответить
    • > .setBedType( null );
      Fatality!
      Ответить
      • Спокуха, там в другом месте проверка стоит
        Ответить
    • request.getHeader().getChannel().getSubC hannel().getSubChannel().getName()
      response.getResponseObject().getReservat ion().getRate().getRoom().setBedType(val ue)

      вот такие цепочки действительно ГК
      Ответить
      • А как надо?
        Ответить
        • В идеале не более одного вызова метода.

          Если имеем такие цепочки, то скорее всего:
          - архитектура не продумана
          - присутствует высокая связанность в системе
          - код тяжело сопровождать и рефакторить.

          П. С. Если кому интересно могу привести многобуквенный пример с иллюстрацией, почему это плохо.
          Ответить
          • Ну расскажи.
            Ответить
            • Есть бухгалтер из ЖКХ, которая выставляет счета за электроэнергию. У нее есть бабушка на побегушках, которая снимает показания счетчиков.

              Допустим, необходимо получить показания счетчиков на ул. Ленина, д. 1, кв. 1

              При вышеописанной архитектуре это будет выглядеть примерно так:
              бабушка
              .выйдиВоДвор
              .сядьНаТроллейбус
              .проедь2Остановки
              .перейдиДорогу
              .найдиДом.зайдиВНего
              .найдиСчетчик.перепишиПоказания
              .вернисьОбратно.скажиМне

              Другими словами, бухгалтер руководит тем, как бабушке достать необходимые данные. Бухгалтер зависит от этой конкретной бабушки с ее умениями и навыками.
              Ответить
              • Мне кажется, не показательный пример. Чем это отличается от

                бабка.выйдиВоДвор()
                бабка.сядьНаТроллейбус()
                бабка.проедьДоОстановки("ул. Ленина")
                бабка.перейдиДорогу()
                бабка.найдиДом()
                бабка.войдиВДом()
                бабка.перепишиПоказания()
                показания = бабка.нуЧтоТамНасмотрела()
                Ответить
            • Теперь немного переделаем архитектуру бухгалтерии. Дадим бабушке новый скил "дайПоказанияСчетчика(адрес)".

              Теперь работа бухгалтера сводится к:
              бабушка.раздобудьПоказанияСчетчика(адрес )

              Профит! Бухгалтеру теперь глубоко плевать как бабушка будет доставать эти показания. Для бухгалтера важны только показания, и она ничего не хочет знать о способе их получения. Теперь бухгалтер может работать практически с любой бабушкой (например, с бабушкой-телепатом). И пусть теперь бабушка сама решает как ей доставать показания.

              Как-то так.
              Ответить
              • быдлоБабка.раздобудьПоказания(адрес) {
                return показанияЕсть.аЕслиНайду?
                }
                Ответить
              • А что можно почитать о подобных архитектурных фокусах на русском?
                Ответить
                • что-нибудь конкретное назвать затрудняюсь. Как обычно: Джошуа Блох, Джоэл Спольски, паттерны и т. п.

                  В данном примере это просто нарушение инкапсуляции. Кто-то под инкапсуляцией понимает только то, что не надо делать public поля. Это не совсем верно. Если у вас на все private поля есть public геттер, то о инкапсуляции приходить не приходится. Вы просто завернули кишки в целофан и выставили их наружу.

                  Классический пример: добавление ребенка в коллекцию родителя. Наиболее частая реализация:
                  parent.getChildren().add(child)

                  Даже этот пример можно считать нарушением инкапсуляции, т. к. вы решаете, как родитель должен добавлять себе детей. Правильнее было бы:
                  parent.addChild(child)

                  Такое решение дает один весомый плюс: родитель полностью контролирует добавление ребенка.
                  Ответить
                  • > контролирует добавление ребенка
                    А вот ИРЛ получается не у всех.
                    Ответить
                    • И ИРЛ его не соберет сборщик мусора, если на него не ссылается родитель.
                      Ответить
          • По-умному это называется принцип Law of Demeter. Приходилось работать с подобным кодом, приятного мало.
            Ответить
      • А чем плоха такая цепочка?
        response.reservation.rate.room

        По сути - struct, а геттеры т.к. ява не может в свойства, а прямой доступ давать не надо.
        Ответить
    • Хе, вот именно поэтому мне и нравится Obj-C, который возвращает 0, если вызвать метод у nil.
      А то за условиями настоящего гк не видно.
      Ответить
      • В других языках под жава-платформу тоже есть такая фича.
        Ответить
    • правильно:
      null != ....
      Ответить
      • Вы так привыкли != так правильно.
        Вы случаем не разработчик jslint, который выбрасывает на эту конструкцию ошибку вместо предупреждения, причём не отключаемую?
        Ответить
        • Можно подробнее про этот забавный (я без иронии) случай.
          Ответить
      • А какая в жопу разница null != a или a != null? Это же не жабосравнение строк через equals(), в котором йода стайл имеет смысл. a = null и a == null жаба, емнип, все равно спутать не даст, выдав ошибку.
        Ответить
        • спутает, особенно если код пишется ночью.
          Ответить
          • == вместо =: https://ideone.com/2jpuMr
            = вместо ==: https://ideone.com/gHoHhC

            Вот только так можно запороть: https://ideone.com/m60J5N
            Но с true и false никто на == сравнивать никто не будет, поэтому пример явно надуманный.

            Итого: спутать == и = в жабе практически нереально, и йода стайл для == не нужен. А для != - тем более, вы что-ли боитесь ! потерять в нем? ;)

            P.S. Да и в сишке\крестах тоже лет 10 как не нужен, если читать ворнинги.
            Ответить

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