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

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    final Optional<Customer> customer = Optional.ofNullable(customerId)
        .map(custId -> customerService.getById(custId)
                .map(cust -> Optional.of(cust))
                .orElseThrow(() -> new NoSuchCustomerException(custId)))
        .orElse(Optional.empty());

    Попытка функционального программирования, когда в язык добавили монаду Optional, но не добавили монаду Try.

    Запостил: wissenstein, 07 Сентября 2018

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

    • customerService.getById(custId) возвращает Optional<Customer>, а на самом деле нужно что-то, похожее на Try<Customer, NoSuchCustomerException>
      Ответить
      • А зачем лишний orElse? Что-то типа такого нельзя?
        final Customer customer = customerService.getById(custId)
            .map(cust -> cust)
            .orElseThrow(new NoSuchCustomerException(custId));
        Ведь монада Try либо возвращает Customer, либо кидает исключение, никогда не empty?
        Ответить
        • зачем map id?
          Ответить
          • Объясняй как надо, я не совсем понимаю, что тут написано. Только в общих чертах. Сразу на getById вызвать orElseThrow можно?
            Ответить
            • final Customer customer = customerService.getById(customerId)
                  .orElseThrow(new NoSuchCustomerException(customerId));
              map(x → x) должен быть noop
              Ответить
              • > map(x → x) должен быть noop
                Что что значит? Кроме того, что я не знаю Java.


                получается монада try нинужна.

                P.S. Понял, что вернёшь из map, на том и вызовешь .orElseThrow, у Customer его вполне себе не должно быть.
                Ответить
        • Нужно, чтобы если customerId == null, то вернуть None, а иначе достать customer из базы данных и вернуть Some(customer), но если в базе данных его нет, то сообщить, что customerId неправильный.
          То есть по-javному в первом случае вернуть Optional.empty(), а во втором Optional.of(customer). Эта опциональ разбирается дальше по другим специальным правилам.
          Ответить
          • Тогда как-то так надо
            final Optional<Customer> customer = Optional.ofNullable(nullableCustomerId)
                .map(customerId -> customerService.getById(customerId)
                                       .orElseThrow(() -> new NoSuchCustomerException(customerId)));
            Вот эти операции ничего полезного не делают:
            .map(cust -> Optional.of(cust)) // если не пустой, заверни в ещё одну коробку. WUT?
            .orElse(Optional.empty()) // Если коробка пустая, замени её другой пустой пустой коробкой. Зачем? Чтобы типы сошлись после добавления предыдущей лишней коробки?
            Ответить
            • Дальше нужна коробка с возможным customer-ом. Если коробка пуста, просто продаём услугу анонимусу, если не пуста, смотрим, действует ли для него специальная цена, подать ли дополнительно чай на подносе и так далее, и учитываем продажу в списке customer-а.
              Ответить
            • Разобрался я наконец, как ту коробку получить: http://govnokod.ru/24731#comment428846
              Ответить
              • И это именно то, что ты написал. А я невнимательно читал первые строки в твоём комментарии, гг.
                Прошу прощения. :)
                Ответить
              • Это в точности то, что я тебе 5 часов назад написал, только переменные по-другому называются и отступы по-другому расставлены.
                Ответить
                • Эгзактли! (плюсик на том комментарии — это от меня :) )
                  Ответить
        • Я таки, кажется, разобрался, что там лишнее. Вот это должно работать точно так же, но выглядит значительно лучше:
          final Optional<Customer> customer = Optional.ofNullable(customerId)
                  .map(custId -> customerService
                          .getById(custId)
                          .orElseThrow(() -> new NoSuchCustomerException(custId)))
          Ответить
          • Я смотрю "Java" с введением лямбд превращается в ебучий экмаскрипт 2016. Может они ещё перегрузку операторов введут?
            Ответить
            • Да вообще в функциональщине красиво смотрится в основном только матан.
              Ответить
          • Впрочем, то же самое написал roman-kashitsyn, а я заметил только щяз: http://govnokod.ru/24731#comment428814
            O:)
            Ответить
    • Какой багор )))

      Переведи на "PHP"

      Прыщебляди соснули

      Поэтому я за "PHP"

      Что ещё забыл?
      Ответить
      • Это уже должно быть какими-то стикерами или типа того.
        Ответить
      • :)
        Ответить
      • 1. csrf verification error
        Ответить
        • - Лакни мой яйца (шефу можно слать)
          - Нашёл на помойке
          - 1000 строк в день (прости, Дефекейт, но это реально кандидат на роль мема!)
          - То ли дело С++
          - Где здесь С++?
          - Анскилябра заедушная
          - Тарасоформатирование
          - ты файка борманда (это не утверждение сейчас)
          - поясните мысль

          и конечно же
          "ты питух животное"
          Ответить
          • > Нашёл на помойке

            "Богатый наверное" забыл
            Ответить
          • Где здесь C++ было очень давно:
            $formTitles = array(
                        'Я, <b>' . htmlspecialchars($user->getLogin()) . '</b>, находясь в здравом уме и твердой памяти, торжественно заявляю:',
                        'Помни, <b>' . htmlspecialchars($user->getLogin()) . '</b>, за тобой могут следить!',
                        'Семь раз отмерь — один отрежь, <b>' . htmlspecialchars($user->getLogin()) . '</b>!',
                        'Где здесь C++, <b>' . htmlspecialchars($user->getLogin()) . '</b>?!',
                    );
            Ответить
          • Все классические вореции забыл:
            "дзенский мастер Питушня", "психоза", "зожатие", "животное питух", "Лурик, я не число", тысячи их.
            Ответить
            • > "животное питух"
              - не забыл

              > "Лурик, я не число"
              - ржака. А я такого даже и не помню
              Ответить
              • У 1024-- всё записано:
                https://github.com/1024--/voretions/blob/master/src/md/vorec-hist-2014-09-16.md

                Кстати, был говнокод «Мамо, чому я Number?», в котором обсуждали проблемы типизации. Никто не вспомнит ссылку?
                Ответить
                • Кстати, ведь "карманный лев" тоже его авторства
                  Ответить
                  • Карманного льва форсил kegdan. Даже стихи про него писа́л. А кто первоначальный автор, не помню.
                    Ответить
            • В догонку:
              - Царский анролл
              - J
              - , проверь
              - Александреску
              Ответить
              • - %language% не нужен
                Ответить
              • - напитон
                Ответить
              • Рулонная магия.
                Ответить
              • > ", проверь"
                - фубля. Да и не на ГК это говно появилось и форсилось
                Ответить
              • Анал Тьюринг.
                Ответить
              • > J
                У меня даже вешалки дома такой формы.
                Ответить
                • Зачем тебе вешалки? Ты всегда в одном и том же ходишь.
                  Ответить
                  • Achtung! Кашицын следит за мной!
                    Ответить
                  • А гостей как он будет принимать?
                    Ответить
                    • Смотря какие это будут гости. Если анальные - достаточно пошире распахнуть врата своего алтаря, если оральные - открыть доступ к портам ввода-вывода.
                      Но, ИМХО, входить в орал - всё равно, что ходить в гости по утрам.
                      Ответить
                • А у меня не только вешалки такой формы.
                  Ответить
                • > У меня даже вешалки дома такой формы.

                  У тебя вроде как посох должен быть такой формы.
                  https://ae01.alicdn.com/kf/HTB1NDyPLXXXXXXZXFXXq6xXFXXXZ/12-cm-Mistrz-Yoda-Star-Wars-Jedi-Rycerz-Figurka-Kolekcja-zabawki-na-bo-e-narodzenie-prezent.jpg_640x640.jpg
                  Ответить
            • Вореции — отдельная тема:
              https://github.com/1024--/voretions
              Ответить
          • Существует ли программа для тарасоформатирования? Ну или хотя бы кто-нибудь пытался написать?
            Ответить
    • Фотка автора внушает уважение.
      Ответить
      • У меня пикча маленькая и из пикселей вырисовывается образ Турчинского
        Ответить
        • Так ведь Gravatar позволяет увеличить. Меняешь значение параметра size на 2048 и разглядываешь.

          Офтопик. Наткнулся на такую задачку:
          https://github.com/wissenstein/berlin-clock
          И вспомнил про извращение в таком же духе — часы с бинарной индикацией:
          http://www.classifieds24.ru/images/2775/2774093/large_2.jpg
          Красные точки означают часы, каждая жёлтая точка — 5 минут, зелёные точки — единицы минут.
          Ответить
    • Как в этом влучае поможет монада Try?
      Ответить
      • На псевдокоде то, чего я хочу, выглядело бы примерно так:
        final Optional<Try<Customer, NoSuchCustomerException>> customerBox = Optional.ofNullable(customerId)
                .map(custId -> customerService.getById(custId))  // результат: Try.success(customer) или Try.failure(new NoSuchCusromerException(custId))
                .orElse(Optional.empty());
        Ответить
        • и что-то мне подсказывает, что orElse в этом случае не нужен.
          final Optional<Try<Customer, NoSuchCustomerException>> customerBox = Optional.ofNullable(customerId)
                  .map(custId -> customerService.getById(custId))  // результат вызова getById: Try.success(customer) или Try.failure(new NoSuchCusromerException(custId))
          Ответить
          • Кстати, в жабе можно писать
            Optional.ofNullable(customerId).map(customerService::getById)

            > Optional<Try<Customer, NoSuchCustomerException>>

            У такого подхода есть определённые недостатки:
            • Создаётся ложное чувство безопасности, customerService всё ещё можно плюнуть каким-нибудь SqlException-ом в лицо в самый неподходящий момент.
            • Много синтактического мусора и длинные типы.
            • Работать с монадами, завёрнутыми в монады — сомнительное удовольствие, а человеческих трансформеров монад в жабе не сделаешь.
            Ответить

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