1. Objective C / Говнокод #12177

    −98

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    #import <Foundation/Foundation.h>
     
    int main () {
        BOOL b1 = 71151208, b2 = 107155712;
        printf ("b1 is %s; b2 is %s.", (b1 ? "true" : "false"), (b2 ? "true" : "false"));
        return 0;
    }

    Ох, как же я эпично выстрелил себе в ногу.

    Запостил: byss, 22 Ноября 2012

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

    • Чтобы не мучались:
      http://ideone.com/cRHaK2

      b1 is true; b2 is false.

      /me пошёл откапывать собаку
      Ответить
    • А, прекрасно.
      107155712 - 1й байт равен нулю, и он обрезается при приведении типа к BOOL (он один байт)
      Ответить
      • http://ideone.com/OHpNOY
        Главное, это работает. Моя картина мира выстояла.
        Ответить
        • У меня в зависимости от интового значения дисейблились/энейблились кнопки, так что пришлось уныло написать
          self.button.enabled = (some_int_id != 0);

          вместо няшного
          self.button.enabled = some_int_id;

          .
          Ответить
          • Можно даже короче:
            http://ideone.com/ulMfCV
            Ответить
            • Ага, а потом - мы увидим на говнокоде
              self.button.enabled = !!some_int_id;
              Ответить
              • А чем !! говно? Это же классика сишки.
                Ответить
                • Всё-таки
                  self.button.enabled = (some_int_id != 0);

                  очевиднее. Для того, чтобы переварить !! надо включать мозг )
                  Ответить
                  • сам ты говно
                    !! - классика
                    один раз запомнил и пользуйся
                    Ответить
                    • И короче на ЦЕЛЫЙ символ. А со скобками, аж на три.
                      Ответить
                  • >Для того, чтобы переварить !! надо включать мозг )
                    Ты так говоришь, как будто это что-то плохое.
                    Ответить
                    • >Я гуест @ ебу гусей
                      Ответить
                    • Он считает, что включать мозг - это плохо. Не распинайся. Нечего метать бисер перед свиньёй. [цитирую идиому].
                      Ответить
                      • Я считаю, что писать код, осмысление которого требует влючать мозг, когда можно написать этот же алгоритм так, что включать мозг не надо - это неправильно.
                        Ответить
                  • Поддерживаю. Прямо написано то, как оно есть, без кулхацкерской поеботины.
                    Ответить
                    • Я бы если увидел в коде !!, убрал бы ибо в классической логике есть закон двойного отрицания.

                      Но керниган и ритчи видимо о нем не слышали.
                      Ответить
                      • Логика здесь появляется после первого !, который отрицает арифметику.
                        Ответить
                  • "В смысле, айди не равно нулю? Так и напиши!"
                    Согласен.

                    Я употребляю !! только для случаев типа:

                    BOOL Foo();
                    
                    ...
                    
                    bool b = !!Foo();
                    Ответить
                    • Ага, и нефиг ниндзя-кодингом заниматься
                      Ответить
                • Оператор подергивания?
                  Даже в конь-тексте жабьего скрипта это ужасная мерзость.
                  Ответить
                  • Вот вы все выдумщики. Самый понятный вариант - функция to_bool(int)
                    Ответить
      • > он обрезается
        Странный bool в этой вашей objective-c. Char в овечьей шкуре?

        P.S. Кстати в мускуле когда-то тоже запилили свой костыльный бул из чара, и неподумавши запихали в него результат чего-то типа memcmp, а потом, когда авторы glibc сделали небольшую оптимизацию (сравнение не по байтам, сразу по 4, чтобы быстрее), оно начало пропускать юзера под случайным паролем с вероятностью 1/256... Так что на багу int -> костыльный_бул вы попались не первым, ой не первым...
        Ответить
        • Мда, это еще на три порядка эпичнее. Хорошо у меня хоть просто кнопки дисэйблились, а не что-то критичное. Совершенно случайно догадался проверить последний байт.
          Ответить
        • > Странный bool в этой вашей objective-c. Char в овечьей шкуре?
          Именно, наследие Си. Причём там 3 типа, bool, BOOL и Boolean, и все 3 объявлены по разному.
          Ответить
          • Не хватает еще NSBool и boolean.
            Ответить
            • typedef signed char BOOL
              #define bool BOOL
              typedef unsigned char Boolean
              typedef int boolean_t

              4
              плюс, да, бонусом NSNumber и NSValue, которые тоже могут представлять Boolean
              Ответить
              • Нужно больше boolean'ов.

                typedef float FUZZYBOOL;
                Ответить
                • Да ладно... интегеров (одинаковых, совсем) там не меньше.
                  Ответить
          • Какой жуткий пиздец.
            В общем когда делаешь язык или диалект - то лучше когда-нибудь, да отказаться от старого наследия и поддерживать только то что органично вписывается в структуры.
            Пхп, кресты, жава - примеры обратной совместимости. В каждом куча граблей и в каждом остался мерзкий сишный switch.
            Вот питон есть 2-й, а 3-й - уже немного другой язык.
            Ответить
            • > когда-нибудь
              Только сразу. Потом уже поздно, ибо уже написана куча проектов и либ.

              > питон
              Ну есть третий питон - а где он? Прошло уже 4 года, а половина либ не портирована, в тех же линухах по дефолту до сих пор стоит второй, софт юзает второй...

              P.S. После поломки совместимости начинается еще больший бардак. Народ вместо того, чтобы перейти на новую версию начинает писать прослойки и ифдефы, поддерживающие и старое и новое... Так что хз еще, где пиздец жутче.
              Ответить
              • >Народ вместо того, чтобы перейти на новую версию начинает писать прослойки и ифдефы
                В конце концов много вещей переписывается с нуля.

                >Прошло уже 4 года, а половина либ не портирована
                Не считаю это большой проблемой, думаю лет через 10 многие скажут спасибо за отказ от этой обратной совместимости.
                Ведь язык избавится от многих устаревших решений и потому будет проще.
                Кто хочет - пишут на 2-ом. Зато практически весь новый код пишется под новую версию. Потому когда-нибудь наступит переломный момент.
                > когда-нибудь
                Я тоже думал над "сразу", но некоторые неудачные решения проявляются только после внедрения.
                Иногда необходимо убирать ошибки прошлых версий.
                Просто не нужно делать это слишком часто.
                Сомневаюсь что в ближайшие десятилетия будут внедрят 4-ю, несовместимую версию.
                Ответить
                • Тут дело еще в том, что питон не ява и не сишка. "Энтерпрайз" решений на нем не так уж много. Древнего мамонтового говна, в котором никто не хочет рыться, оставшегося в наследство из 80х в нем тоже нет. Так что у него есть неплохой шанс, и в ближайшие года 3-4, надеюсь, все полезное перетащут на третий, и окончательно перейдут на него... Язык то годный получился.

                  > Сомневаюсь что в ближайшие десятилетия будут внедрят 4-ю, несовместимую версию.
                  Ну да, это его убьет.

                  > Просто не нужно делать это слишком часто.
                  И слишком редко походу тоже. Иначе получится как с явой или крестами - поломка обратной совместимости вызовет море батхертов.

                  К примеру я продавал свою либу. Вышла ява 1.8, в которой все безупречно и удобно, но она не совместима с явой 1.7. И передо мной стоит выбор - или переходить на 1.8 полностью (и терять всех клиентов, которые юзают 1.7, и не могут перейти на новую (а таких в "энтерпрайзе" будет большинство)), или оставаться на 1.7 (и не получать новых клиентов, т.к. новые проекты будут на 1.8), или наслаждаться разработкой под обе версии (как минимум лет 5)...
                  Ответить
                • >> думаю лет через 10 многие скажут спасибо за отказ от этой обратной совместимости

                  Ну как, сказали?
                  Ответить
            • Obj-C создавался как расширение языка C (то есть, С-код является корректным Obj-C кодом в 100% случаев), задача у него такая была. Делалось это для того, чтобы иметь возможность использовать преимущества ООП и сохранить совместимость с огромной массой существовавших тогда библиотек (собственно и сейчас некоторые части фреймворка написаны на чистом C).

              Язык-то не на много положе этого вашего C++ - всего на пару лет.
              Ответить
              • > то есть, С-код является корректным Obj-C кодом в 100% случаев
                Говно мамонта типа вот такого тоже понимает?
                test(a, b) int a, int  b; {
                    return a+b;
                }
                Ответить
                • Я сам не знаю этого говна мамонта :) Сейчас проверю
                  Ответить
                • Запятая не к месту. Либо int a, b; либо int a; int b;
                  Ответить
                • Нет, не компилится. Под сями, кстати, тоже.
                  Ответить
                • сишка не понимает говно мамонта
                  http://ideone.com/1zC8Ht
                  Ответить
                  • Сишка понимает говно мамонта: http://ideone.com/Ya2VWa

                    Почему у меня работает?
                    Ответить
                    • а что означают эти инт а инт б в контексте данной функции, если они не используются?
                      Ответить
                      • А здесь почти как в древнем Фортране или в Алголе. Типы формальных параметров функции описываются не внутри скобочек, где они перечисляются, а после них.

                        Компилятор Кернигана и Ритчи после заголовка функции ожидает составной оператор (фигурные скобки) и всё, что описано до него, считает не локальными переменными, а описаниями параметров функции.

                        Для сравнения то же самое на Алголе-60 (за точность не ручаюсь):
                        Integer procedure test(a, b); Integer a; Integer  b;
                            begin
                                test := a+b;
                            end;
                        То же самое на Фортране-77 (тоже не ручаюсь за точность):
                        FUNCTION ITEST(a, b)
                        INTEGER a, b
                        ITEST = a+b
                        END FUNCTION
                        А вот для сравнения в ANSI/ISO Си:
                        int test(int a, int b) {
                            return a+b;
                        }
                        Ответить
    • Conversion from integer to bool is simple, they said.
      Only zero is false, they said.
      Ответить
    • а по мне, так логично истину мерять знаковым битом. и вообще, 0 есть ложь, а -1 истина.
      Ответить
      • > 0 есть ложь, а -1 истина

        Неужели я не один такой?
        Ответить
        • #if __has_feature(objc_bool)
          #define YES             __objc_yes
          #define NO              __objc_no
          #else
          #define YES             ((BOOL)1)
          #define NO              ((BOOL)0)
          #endif

          Я прямо разочаровался.
          Ответить
      • > знаковым битом
        > 0, -1
        А 1?
        > истину мерять
        Кулстори бро.
        Ответить
        • 1 - говно.
          На паре (0,-1) побитовые и логические операции представляют собой одно и тоже.
          Ответить
        • -1 представляеься в памяти как 0xFFFFFFFF
          То есть все биты - 1 Там получить ноль без логических и арифмитических операций даже при большом желании не получится.
          Ответить
    • Я не понял, в ObjectiveC приведение int к BOOL не сравнивает с нулём, а выдаёт чётность?! Это пиздец, товарищи.
      Ответить
      • Приводит по младшему биту же.
        Ответить
      • Байту. Константа – 4 байта, BOOL однобайтный.
        Ответить
        • А, оно приводит, сравнивая с нулём последние 8 бит? Всё равно пиздец.
          Ответить
      • Специально для дельфитараса иллюстрация дельфипроблемы под Delphi 7:
        http://stackoverflow.com/questions/8617581/how-to-call-enumsystemlocales-in-delphi

        Там же есть ссылка на майкрософтовского архитекта, который перечисляет сколько булевых типов они изобрели, пока делали Windows.
        Ответить

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