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

    +1

    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
    when {
                    (defaultCurrency != null) -> {
                        when {
                            (currenciesList == null) -> {
                                currenciesList = mutableListOf(defaultCurrency)
                            }
                            (currenciesList?.isEmpty() == true) -> {
                                currenciesList?.add(defaultCurrency)
                            }
                            else -> {
                                if (currenciesList?.contains(defaultCurrency) == false) {
                                    defaultCurrency = currenciesList?.first()
                                }
                            }
                        }
                    }
                    else -> {
                        when {
                            ((currenciesList == null) || (currenciesList?.isEmpty() == true)) -> {
                                throw IllegalArgumentException("Default currency and list of currencies from terminal configuration are empty")
                            }
                            else -> {
                                defaultCurrency = currenciesList?.first()
                            }
                        }
                    }
                }

    Интерн сражается со скобочками.

    Запостил: peanutwolf, 01 Февраля 2019

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

    • Что-то я не припомню слова «when» в «Java». Это «Кокококотлин»?
      Ответить
      • >?.first()
        Что-то сишарпное.
        Ответить
        • http://kotlinlang.org/docs/reference/null-safety.html

          In Kotlin, the type system distinguishes between references that can hold null (nullable references) and those that can not (non-null references). For example, a regular variable of type String can not hold null:
          var a: String = "abc"
          a = null // compilation error


          To allow nulls, we can declare a variable as nullable string, written String?:
          var b: String? = "abc"
          b = null // ok
          print(b)


          Safe Calls

          Your second option is the safe call operator, written ?.:
          val a = "Kotlin"
          val b: String? = null
          println(b?.length)
          println(a?.length)


          This returns b.length if b is not null, and null otherwise. The type of this expression is Int?.


          Я же говорил, «Кокококотлин».
          Ответить
          • P.S. И чтобы не было скучно, есть ещё так называемый «Elvis operator»:
            a ?: b
            возвращает a, если оно не null, иначе возвращает b.

            Ещё есть оператор as?, который возвращает null, если ничего не получилось.

            И оператор !!, который кидает исключение, если выражение слева от него равно null.
            Ответить
            • А теперь посмотрим, как сделали в «Сисярпе»:
              https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/nullable-types/

              • Синтаксис T? является сокращением Nullable<T>. Эти две формы записи являются взаимозаменяемыми.

              • Используйте оператор объединения со значением NULL, ??, чтобы присвоить значение базовому типу на основе значения типа, допускающего значение NULL:
              int? x = null; int y = x ?? -1;


              Короче, совпадает только знак вопроса после имени типа. Всё остальное сделали по-разному.
              Ответить
          • А есть safe call оператор "?()"? А safe index "?[]"?
            Ответить
    • if (currenciesList == null || currenciesList.isEmpty()) {
          if (defaultCurrency == null)
              throw IllegalArgumentException(...)
          currenciesList = mutableListOf(defaultCurrency)
      } else {
          defaultCurrency = currenciesList.first()
      }
      Как-то так?
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Ошибка компиляции
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • currenciesList?.takeIf{ it.isEmpty() }?.apply{
            //Your code for nonNull empty list
            }
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Ты что! Тебя же за это заклюют! Скажут, что это как в сишке или в ещё каком-нибудь языке для калькуляторов 70-х годов. Надо, чтобы выглядело современно: с лямбдами, с шаблонами...
                Ответить
                • Ох уж эти императивные ретрограды...
                  Хорошая вещь же - fluent interfaces. Луговский одобряет.
                  https://en.wikipedia.org/wiki/Fluent_interface
                  https://martinfowler.com/bliki/FluentInterface.html
                  Ответить
                  • Именно поэтому я за «D»: благодаря «Uniform Function Call Syntax» там вообще не нужно создавать никаких классов, чтобы использовать «fluent interface». Код "Hello, world!\n".printf() там тупо вызовет printf("Hello, world!\n").
                    Ответить
                    • Сколько было попыток заменить C++, и ни одна не проканала.
                      Ответить
                      • Именно поэтому я за «C++».
                        Ответить
                        • Ещё в 2004-м году предлагали такое добавить в «C++»:
                          http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1585.pdf

                          Отклонили, потому что испугались, что это приведёт к путанице.
                          Ответить
                      • Сколько было попыток заменить «PHP», и ни одна из них не проканала.
                        Ответить
                    • Эх, нам бы такое в javascript. Есть конечно велосипеды в wannabe-стандартных библиотеках вроде lodash и underscore:
                      _.chain([1,2,3])
                        .map(x => x+1)
                        .chunk(1)
                        .groupBy(x => _.head(x) % 2)
                      //other shit
                        .value()

                      но как только нужна функция, которой в них нет, начинается цирк с прототипами-миксинами или, упаси боже, с compose и partial.
                      Ответить
                      • Именно поэтому я за «jquery».
                        Ответить
                      • >Эх, нам бы такое в javascript.
                        Держи.
                        String.prototype.kokoko=function(){console.log(""+this)); return this;}
                        
                        "pituh".kokoko().concat(" is smart").kokoko();
                        Ответить
                        • Спасибо! Полезная вещь!
                          "Du".kokoko().concat(" hast").kokoko().concat(" mich").kokoko().concat(" gefragt.").kokoko();
                          Ответить
          • Видимо вот так будет работать: if (currenciesList?.isEmpty() ?: false)
            Ответить
            • Тут больше подойдёт if (currenciesList?.isEmpty() ?: true).
              Нам же нужно вернуть true в двух случаях:
              1. currenciesList == null
              2. currenciesList.isEmpty()
              Ответить
            • показать все, что скрытоvanished
              Ответить
              • Это из-за тебя Элвис умир!
                Ответить
              • показать все, что скрытоvanished
                Ответить
                • currenciesList?.isEmpty() вернёт либо true, либо false, либо null. Эт наверно чтоб null в false превратить, хотя Котлин наверное всё равно null считает ложью.
                  Ответить
                  • Вот кстати не люблю эту питушню с состояниями/характеристиками.

                    Постоянно приходится думать на пустом месте. Ну то есть тут ни проектирования, ни алгоритмов нет, только пердолинг и отладка.

                    Главный пример - питушня с битами у крестовых потоков. Их там четыре, и без бутылки во всех кобенациях не разберёшься.

                    Хуже только проверка характеристик в своём коде. Сначала это true/false, потом какой-нибудь enum или набор флагов. Оказывается, что характеристики полностью ни независимы, ни зависимы - хотя, значения декартово перемножаются, но не совсем. Какие-нибудь гендеры, например.
                    Сначала в коде появляются сложные условия, специфицирующие определённое подмножество объектов, например, мужчина-гей, в прошлом бывший женщиной.
                    Потом рождаются хелперы на частые частные случаи, чтобы не ошибиться в записи условия.
                    Потом оказывается, что надо ввести ещё несколько состояний, и весь код придётся перечитать. Стоит проверить все условия "male" и вставить в часть из них "f2m", в часть - "m2f", где-то оставить как было. Например, в мужской туалет можно пускать (male || f2m), а к психологу в мужские группы по разбору проблем из детства - (male || m2f), в клуб угнетателей - только male. Особо тщательно придётся проверять условия вида "все остальные". Ведь теперь "!male" - нифига не бабы, теперь это 50 оставшихся гендеров.
                    И заранее можно только не допускать условия вида "все остальные".

                    Но всё равно, всё так же придётся пересматривать все условия на подмножества. И ничего не поделаешь: если б знали все эти категории и подмножества - сразу бы спроектировали программу с учётом них, а так любая новая категория - непредсказуемая для программиста питушня.
                    Ответить
                    • Адово плюсую. Особенно выбешивает рассинхронизация состояний, хуже которой только черви-пидоры.
                      Буквально ня днях столкнулся: один кусок думал, что модуль может находиться либо в состоянии A, либо в B — и, естественно, делал проверку «state != A». А другой кусок взял да перевёл состояние в C — и всё, пиздец.
                      Ответить
                      • Пиши на йезыках с exhaustive switch
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Зато в «Питоне» есть «for ... else», «while ... else» и «try ... else». Именно поэтому я за «Питон».
                            Ответить
                            • Питон не ебет тебе мозги тем, что ты что-то не проверил.
                              Он просто отработает с ошибкой, когда эта веточка случится.

                              А случится она через 3 месяца на продакшене у клиента. И это правильно! К чему заранее решать проблемы?
                              Ответить
                              • Экокококономия! Будем решать только те проблемы, которые реально случаются, а не надуманные.

                                Главное, в установке «Therac» не использовать языки типа «Питона».
                                Ответить
                                • это когда один программист вызвал malloc с неправильными параметрами, а потом человек умер?
                                  Ответить
                              • показать все, что скрытоvanished
                                Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • Да, по названию запомнить сложно: else срабатывает, если не было вызова break, т. е. если цикл завершился нормальным образом.

                                Кстати, в «PHP» до версии 5.4 можно было вызывать break с переменным аргументом:
                                http://php.net/manual/ru/control-structures.break.php

                                Именно поэтому я за «PHP».
                                Ответить
                      • > один кусок думал, что модуль может находиться либо в состоянии A, либо в B
                        >А другой кусок взял да перевёл состояние в C

                        Finite State Machine?

                        А вот черви-пидоры — ДЕЙСТВИТЕЛЬНО огромная проблема.
                        По злоебучести примерно соответствующая уровню гномов-хуекрадов.
                        Ответить
                    • А потом приходит UB и в переменной оказывается "не true и не false"... От чего даже банальные && начинает пидорасить.
                      Ответить
                    • Какая-то надуманная проблема, если честно. Зачем хуярить f2m всякие, если можно сделать стек состояний?
                      Ответить
                      • > стек состояний
                        Ну это всех проблем не решает... Вдруг эта котодевка-с-хуем изначально такой родилась?

                        Имхо, тут нужна обёртка с кучей bool'овских методов. И все проверки должны идти только через неё. Тогда всё это говно хотя бы не будет размазано тонким слоем по всему коду. В одном месте можно будет поменять на стек или что-то ещё.
                        Ответить
                        • Пойдём по пути композиции и ассоциации. Вынесем гендер в enum, а для понимания анатомических нюансов сделаем метод getDick(), который возвращает или инстанс хуя, или null
                          Ответить
                        • Что-то мне кажется, что эта штука только чуть-чуть облегчит страдания программиста.

                          Были, скажем, папка для исполняемых файлов и папка для неисполняемых файлов. А потом ввели папку для временных файлов.
                          Два хелпера "это исполняемый", "это не исполняемый" помогут только инкапсулировать способ представления состояния (число/стек/подгрузка из интернетов), а в коде всё равно придётся исправлять на "это временный" случайные проверки.
                          Сделать много хелперов не получится: либо запутаешься в их количестве, либо какую-то характеристику из будущего не уловишь. Можно создать по одному хелперу на одну проверку (именовать по номерам строк кода), но введение нового состояния может расщепить проверки в местах, где одна проверка работала для более одного файла.
                          Ответить
                      • Я же писал, что они ни независимы, ни зависимы. Стек или кортеж уместны для случая, когда работает декартово произведение множеств. Каждый элемент стека/кортежа всё равно рано или поздно примет несколько новых состояний.

                        * мужик
                        * мужик-бисексуал
                        * мужик-бисексуал, бывший мужиком-натуралом
                        * мужик-транссексуал-бисексуал, бывший бабой-лесбиянкой, а ещё раньше - полигамной бабой-любительницей транссексуалов m2shemale

                        1 .Стеком можно эффективно описать становление транссексуала, но оттенки его ориентации придётся вводить как отдельные состояния.

                        2. Опять же, от переписывания кода проверки условий стек не спасёт. Как ни крути, в традиционном туалете будет важно последнее состояние, а у психолога - первое, второе, ... или все вместе взятые. Ещё и векторную питушню придётся сравнивать. Царского пирфоманса не дождёшься. Или у тебя int гендеров, битовые маски и свичи, или цикл по итераторам std::list :)
                        Ответить
                        • Есть куча вариантов решения этой проблемы разной степени элегантности, вопрос в ТЗ.
                          Ответить
                          • Если есть ТЗ, подписанные документы и сроки сдачи проекта, программа написана с нуля, то проблемы вообще нет. Хреначим указанные в ТЗ состояния, сдаём проект и прощаемся с заказчиком.

                            В реальном же случае (или когда программа своя, и нельзя послать заказчика за изменение ТЗ) со временем обнаружатся новые состояния, которых в изначальном ТЗ не было.
                            Ответить
                    • показать все, что скрытоvanished
                      Ответить
    • Пришлось переписать..

      val currenciesList = arguments?.getStringArray(EXTRA_CURRENCI ES_LIST)?.toMutableList()
      ?: mutableListOf()

      val defaultCurrency = arguments?.getSerializable(EXTRA_CURRENC Y) as? String
      ?: currenciesList.firstOrNull()
      ?: throw IllegalArgumentException(
      "Default currency and currencies list are empty"
      )
      if (currenciesList.contains(defaultCurrency ).not())
      currenciesList.add(defaultCurrency)
      Ответить
    • "Kotlin" довольно молодой езыг, я вот например до сих пор не знаю, как звать погромистов на "Kotlin". Котлинеры? Котлинисты? Котлинерята? Котлинята? Котлинеристы? Котлята? Котлеты? Котлы?
      Ответить

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