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

    −405

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    -(BOOL)isForEvenNumberPage
    {
        return self.pageNumber % 2 == 0;
    }
    
    -(BOOL)isForOddNumberPage
    {
        return [self isForEvenNumberPage] == NO;
    }

    Один очень крупный проект от заокеанского заказчика

    Запостил: stonerhawk, 11 Сентября 2014

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

    • Некогда не говори нет! Старайтесь чаще употреблять слово да. Позитивное мышление в программировании.
      Ответить
    • Можно даже себе представить:
      if([self isForEvenNumberPage] == NO && [self isForOddNumberPage] == YES)
      {
      NSLog(@"Diz is probably not even page number");
      {
      Ответить
      • Раз уж такая тема. Обьясните мне пожалуйста что значит аббревиатура NS в яблочном коде: NSLog, NSObject, NSWhatever
        Ответить
        • NeXTSTEP
          не все умеют в языки с пространствами имён в 2014 году
          Ответить
          • Неймспейсы не нужны. Только лишняя многословность
            Ответить
            • NSНеймспейсы CGНе NSНужны. UIТолько LFЛишняя NSМногословность.
              Ответить
              • Имею дело с языками с неймспейсами и без них. Мое личное мнение, что без них лучше. Можно, конечно, купить педаль и забиндить на нее ввод std::, но в пекло все это!

                В свифте, кстати, порезали лишние префиксы перед популярными типами.
                Ответить
                • Кругом одна категоричность.

                  Если пишешь приложение, от неймспейсов толку мало.
                  Если пишешь библиотеку, они жизненно необходимы.

                  Видимо, ты в основном пишешь независимые приложения, и собирать вместе кучу библиотек тебе не приходится.
                  Ответить
                  • > от неймспейсов толку мало
                    Но толк таки есть, когда много 3rd-party библиотек нацепляешь...
                    Ответить
                    • Я имею в виду, что код самого приложения особого смысла оборачивать в неймспейсы нету.
                      Ответить
                  • Да и с приложениями не айс. В эЛиспе без неймспейсов плохо, да и в ж.скрипте тоже плохо. В первом случае у функций имена становятся очень длинными, во втором вместо неймспейсов появляются дополнительные операции лукапа + ненужная возможность случайно что-нибудь поменять в имитируемом неймспейсе. Ну, или другой вариант: вызывать весь код, который требует эелементов из другого неймспейса в специальной функции, которая эти элементы туда добавит, что делает приложение не модульным, и заставляет придумывать извращенные схемы комбинаций компонент.
                    Ответить
                    • > в ж.скрипте тоже плохо
                      Хм, в AMD (require.js и его братья) неплохой модульности же добились (насколько это вообще возможно в жс). Неймспейс аля модуль заключен внутри функции, которая получает аргументами модули, которые ей требуются для работы, и возвращает то, что хочет опубликовать для других.
                      Ответить
                      • >неплохой модульности же добились (насколько это вообще возможно в жс)
                        А если функции нужны 2 либы, и в обоих заюзан например $?
                        На ум приходит только всякое уродство типа:
                        require['liba'], function(){
                           var libA$=$;
                           require['libb'], function(){
                           }
                        }
                        Ответить
                        • > А если функции нужны 2 либы, и в обоих заюзан например $
                          Да там вообще всё просто:
                          require(['liba', 'libb'], function (liba, libb) {
                              // ... use liba functions as liba.*
                              // ... use libb functions as libb.*
                          });
                          А для особо кривых либ пишутся обёрточки, которые прибирают за ними говно из глобалок, и возвращают его как положено.
                          Ответить
                          • С этим есть две проблемы:
                            - Можно избежать лексического привязывания к "импортированым" таким образом неймспейсам (пользуясь apply / this), при чем это может получиться случайно.
                            - Если у модуля есть побочные эффекты, тогда его не выгрузить, иначе при повторной загрузке его нужно инициализировать по-новой, и не факт, что побочный эффект будет таким же.

                            Например, есть у нас модуль, А, который сделал $.each = function () { ... }, а модуль Б сделал var each = $.each. Теперь от того, кто первый загрузится, мы получим разные результаты.
                            Ответить
                            • > выгрузить
                              Выгрузка модулей - это задачка на порядки сложнее их загрузки. Да и далеко не во всех задачах нужен этот hotswap. require.js даже не пытается решать эту проблему... (хотя в той же node.js горячий апдейт модулей мог бы оказаться полезным).

                              > Например, есть у нас модуль А, который...
                              Ну а зачем они начали так делать? Это же противоречит всем принципам, которые пытается навязать AMD.

                              Если переписать это в идиоматичном виде - модуль А создает объект, помещает в него each и прочие полезняшки, модуль B декларирует зависимость от A и получает этот объект в параметре $, после чего модуль B с чистой совестью юзает $.each(). Всё выполнится детерминированно и в правильном порядке (хотя при этом скрипты могут проходить закачку/парсинг параллельно).
                              Ответить
                            • Еще насчет выгрузки модуля - а так ли она нужна?

                              Если только ради hotswap'а - так проще приделать модулю две функции - инициализацию и реинициализацию (или какой-нибудь флаг). Инициализация вызывается при первой загрузке, и делает всё с нуля. Реинициализация вызывается при второй и последующих, и аккуратно апгрейдит внутренние структуры модуля. Выгрузка, как таковая, тут только навредит.

                              В принципе, тот же common lisp примерно так и поступает с его defvar (инициализируется только в первый раз) и defparameter (перетирается всегда).
                              Ответить
                              • P.S. Вот как раз из-за замены reload'а на unload + load мы теряем семантику операции, и получаем все неприятные последствия.
                                Ответить
                              • Почему они бы что-то такое сделали? - Очень просто, чтобы навредить другим модулям програмы. Не все програмы написаны так, что можно доверять коду из других модулей. Например, если приложение хостит код других разработчиков. В контексте ж.скрипа - банеры всякие.
                                Ответить
                        • > всякое уродство
                          Импорт всего-всего из libA в текущую область, имхо, далеко не самая лучшая идея. Это же аналог using namespace foo в крестах или from foo import * в питоне. Ничем хорошим любовь к таким конструкциям еще не заканчивалась...

                          P.S. А если какие-то функции вызываются настолько часто, что цена лукапа libA.foo будет непомерно большой - их можно выписать в локальные переменные "модуля", и спокойно юзать.
                          Ответить
                          • >import * в питоне. Ничем хорошим любовь к таким конструкциям еще не заканчивалась...
                            Это да.
                            Ответить
                    • > В эЛиспе без неймспейсов плохо
                      Если вы - разработчик emacs (или просто не лезите внутрь), то вас это не особо напрягает. Если пользоваться емаксом как основой для построения своих приложений - т.е. как библиотекой - то напрягает.

                      Пока мы пишем одну страничку на жс, неймспейсы нас не особо волнуют ("риально удобно, риально падсибя"). Когда нужно интегрироваться с кем-то, тут появляется необходимость.
                      Ответить
                    • Ну т.е. нэймспейсы как фича языка - мастхэв, особенно важна возможноть вводить их локальные алиасы, типа как в окамле
                      let module M = My.Super.Module in

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

                        А вот насчёт js wvxvw выше правильно пишет:
                        >вместо неймспейсов появляются дополнительные операции лукапа + ненужная возможность случайно что-нибудь поменять
                        Ответить
                        • Как будто в js самые ресурсоемкие операции - это лишнее обращение к хешмэпу, а не манипуляция dom
                          Ответить
                  • Внезапно, полезный и не заумный комментарий от кащshitцина
                    Ответить
                • > Мое личное мнение, что без них лучше.
                  точно, 5-дюймовые лопаты не нужны, свайп не нужен, эпл знает лучше, что мне нужно, oh wait...
                  Ответить
                  • Тебя же не принуждают. Хочешь бери, не хочешь – не бери. Твоя свобода. А раз уж взял, что тут роптать?
                    Ответить
                    • не только не роптать, но и заверять всех, что тебе так даже удобнее
                      перегрузка операторов и лямбды не нужны
                      неймспейсы не нужны
                      мультиметоды и модульность не нужны
                      Ответить
                      • >но и заверять всех, что тебе так даже удобнее
                        >перегрузка операторов и лямбды не нужны, неймспейсы не нужны, мультиметоды и модульность не нужны
                        И все эти годы сишечка была и остаётся популярнее крестов.
                        http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
                        И ШОК! Даже сиране обжептив обогнал плюсцы. Ни спасли ни лямбды, ни auto, ни другие плюшки из нового стандарта.

                        Прогнило что-то в крестогосударстве....
                        Ответить
                        • > Прогнило что-то в крестогосударстве....
                          Будем строить лазер?
                          Ответить
                        • Сомнительная статистика.
                          Я вот вижу, что Бубунта выкидывает Vala и много чего переписывает на крестах.

                          Go им, кстати, тоже полюбился. Но Logo, согласно этой статистике, опережает Go на 14 позиций. Причём в спину Go дышит PL/I. Ок.
                          Ответить
                          • Сишечка с жабой стабильно бьют кресты и в других рейтингах.
                            http://langpop.com/

                            >Я вот вижу, что Бубунта выкидывает Vala и много чего переписывает на крестах.
                            А я вот не вижу чтоб Линус выкидывал сишку и переписывал всё на крестах.
                            Ответить
                            • линус просто не освоил илитарный язык, ленив он больно /green

                              буду говорить за себя
                              на сишке писал только для говнодевайса из 90х, на котором ничего другого не заведется (правда там и сишка была не гцц ни разу)
                              и то там приходилось эмулировать ООП
                              отсутствие raii вынуждает избегать кучи и сложных типов, зачастую дрочка с do { } while (0) или goto ERROR
                              реализация сраного дерева или тем более хеш мапы уже челлендж
                              каждый день ковыряешь бетон лопатой, пока остальные льют кубометры из миксера

                              в общем, уже даже гцц на кресты переписывают, ибо мазохизм уже не в моде
                              Ответить
                              • А как же пирфоманс?
                                Ответить
                                • Ну в этом плане кресты могут быть точно не хуже сишки, при условии наличия прямых рук.
                                  Ответить
                                  • ООП требует больше времени на изучение, поэтому суммарное время исполнения программы и изучения программистом языка будет больше.
                                    Ответить
                                    • А т.к. время исполнения большинства программ, особенно оптимизированных, пренебрежимо мало* по сравнению со временем изучения языка - ООП говно.

                                      * если смотреть не wall clock, а реально потраченные такты
                                      Ответить
                                      • Ну да, в многозадачных системах ещё придётся из wall clock вычитать такты, съеденные ненужными процессами. Поэтому многозадачность — тоже говно.
                                        Ответить
                                        • А интерпретируемые языки, как правило просты в изучении и медленны. Тем самым они оптимальны в смысле критерия Инкануса Грея т.к. максимизируют отношение времени исполнения к времени изучения.
                                          Ответить
                                          • Для максимизации интегрального времени исполнения вовсе не обязательно использовать медленную среду. Можно взять и программу на божественной сишечке и запустить её 100500 раз. Значит, при проектировании нужно учитывать ожидаемое количество запусков.
                                            Ответить
                                      • > время исполнения большинства программ
                                        Ну, например, напиши себе медиаплеер на плюсах. Слушай год музыку. Профит.
                                        Или мы о разном?
                                        Ответить
                                      • Интересно, а вот кроме шуток: смогут ли кресты обогнать си за счёт большей технологичности?
                                        Например исключения с нулевой переголовой vs проверка retval после вызова каждой функции.
                                        Ответить
                                        • > за счёт большей технологичности
                                          Скорее за счёт шаблонов и инлайна.
                                          Ответить
                                          • >Скорее за счёт шаблонов и инлайна.
                                            А что с ними? Перенос шаблонами расчётов в компайл-тайм, в принципе равносилен кодогенерации.
                                            Инлайнить/анроллить компилятор сишки должны наравне с С++.
                                            Ответить
                                            • еще в сишке нет ссылок (инлайнить указатели чуть сложнее имхо), и мув семантики
                                              зато в ней вместо безопасных конструкторов будет тупо мемсет (и то, не всегда), что даст 1‰ выигрыша
                                              Ответить
                                              • >в ней вместо безопасных конструкторов будет тупо мемсет
                                                Кстати допустимость copy elision прописана прямо в стандарте, что поможет компилятору без сомнений выбрасывать копирующие конструкторы.
                                                Так что еще неизвестно кто кого тут.
                                                Ответить
                                                • memset/memcpy он тоже умеет выбрасывать...
                                                  Ответить
                                                  • >memset/memcpy он тоже умеет выбрасывать
                                                    Уметь, не означает решиться.
                                                    Стандарт добавляет решимости компилятору выбросить сайд-эффекты конструктора, что он отважно и делает, в отличии от memcpy где непонятно что допустимо выпилить, не повлияв на логику кода.
                                                    Ответить
                              • >ибо мазохизм уже не в моде
                                >каждый день ковыряешь бетон лопатой, пока остальные льют кубометры из миксера
                                >Сомнительная статистика.
                                У крестосударей ВОЗРАЖЕНИЕ очевидного статистического факта, что оказывается кресты с кучей "необходимых" фич никто особо не котирует.
                                А отрицание, как известно первая стадия излечения.

                                И вот еще забавное: кресты по ссылке выше обходят сишку только по срачепригодности:
                                Normalized Discussion Site Results
                                Normalized results from the discussion site data sets - these results are not included with the 'normalized results' above. It's interesting to note how languages like Haskell and Erlang are talked about a lot, despite scoring fairly low on the normalized popularity chart above. People are interested in them, but haven't begun to use them on a large scale yet.

                                Казалось бы причем тут Хаскель? Все много пиздят о его божественности, но никто на нём не пишет, ничего кроме мелких примеров.
                                Ответить
                                • ладно, сходил по твоей ссылке
                                  рейтинг Craigslist очень показателен, потрясающая корреляция с реальностью
                                  obj-c в лидерах по гитхабу - сам то в это веришь? уже смешно

                                  ну и наконец, ладно опенсурс, я не знаю ни одной местной коммерческой конторы, которая бы писала или искала на pure c программера, начиная или продолжая какие-то свои сишные проекты

                                  и abbyy, и kaspersky, и acronis - это крупные московские игроки, постоянно присутствующие на рынке труда - не ищут С, по тем же причинам, что я озвучил выше
                                  про яндекс тут есть кому рассказать и без меня

                                  если же говорить про мой нынешний отдел, то у меня всего один крестопрограммист (это гораздо меньше, чем js-петушков и жаваёбов)

                                  если бы я его заставил перейти на сишку, сроки пришлось бы умножить на 5, большую часть времени тратить на валгринд, при этом попрощаться с кросс-платформенностью и, скорее всего, даже многопоточностью
                                  Ответить
                                  • >рейтинг Craigslist очень показателен, потрясающая корреляция с реальностью
                                    Не скажу что рейтинги абсолютно объективны, и если бы только в одном-джвух сишка лидировала - можно было бы поспорить.

                                    Но ведь тенденция налицо. Три языка (C, JS, Java) с недостатком сверхважных фич (перегрузка операторов, лямбды, неймспейсы,мультиметоды и модульность) стабильно обходят кресты.

                                    Самый объективный на мой взгляд Ohloh.
                                    Ответить
                                    • Кстати, а в ж.скрипте-то, в непринятой четвертой версии неймспесы-то были!
                                      Ответить
                                    • > C, JS, Java
                                      не вижу в рейтингах кобола, и это вовсе не шутка
                                      js и java имеют другие преимущества, ради которых их терпят
                                      на крестах браузерное приложение не напишешь, да и bInterprise cresto beans никто так и не наваял, у них другой удел

                                      сейчас на js можно 3д-тарасоигры делать в браузере и другие клёвые штуки, за ним будущее, и спрос на js будет только расти
                                      а жабка - все эти ваши ынтепрайзные наработки за 20 лет дают малыми силами делать многое ценой конского потребления цпу и особенно рам

                                      на крестах делаем то, где у жабы кишка тонка
                                      периодически вставляем в глиняного колосса титановые суставы, либо делаем отдельные высокопрочные изделия
                                      Ответить
                                      • > можно 3д-тарасоигры делать в браузере
                                        Я год назад отмечал и обнаружил играбельность даже на сравнительно старом железе. Единственно - плохая производительность по сравнению с нативными.
                                        Кто знает, куда оно приведёт.
                                        Ответить
                                      • > на крестах браузерное приложение не напишешь

                                        NPAPI. Да, придётся заставить юзера запустить инсталлятор. Да, некроссплатформенно, так что придётся выпускать несколько версий.

                                        Альтернативы:
                                        1. ActiveX в IE, которые устанавливаются одним кликом.
                                        2. Питушня для .NET.
                                        3. Гипербинарный Интернет Царя. Пока в разработке.
                                        Ответить
                                        • нах нах
                                          пока что нативного html5 хватает
                                          со всеми его ограниченностями
                                          Ответить
                                        • > Гипербинарный Интернет Царя. Пока в разработке.
                                          Звучит крайне многообещающе. Начинаю нетерпеливое ожидание в джесятки лет.
                                          Ответить
                          • Почему во всех этих рейтингах есть какой-то загадочный язык "Лисп". Неужели это они про тот самый Лисп, который написал МакКарти?
                            Ответить
                            • Про тот который изучают в универах. Все равно он больше нигде не нужен.
                              Ответить
                              • В универах обычно Схему учат, но в рейтингах там Схема была отдельно.
                                Ответить
            • О да, у Обьектного СИ просто охрененно лаконичный и краткий синтаксис. (сарказм)
              Ответить
              • Ну да. Вместо всяких там длинных function, def и т.п. надо писать просто + и -.
                Ответить
                • Да разве в +/- дело?
                  + (void)setUserData:(BOOL)broadcasting
                  fullName:(BOOL)display
                  enableChat:(BOOL)chat
                  latitude:(CGFloat)lat
                  longitude:(CGFloat)lon interests:(NSArray*)array
                  successBlock:(void(^)(void))success
                  authFailedBlock:(void(^)(void))authFaile d
                  failureBlock:(void(^)(NSError *error))failure;
                  Ответить
                  • Что, можно совсем без плюсиков? Значит ещё более лаконичный, чем думал Борманд.
                    Ответить
                    • Тут описана одна функция. И таки с плюсиком.
                      Ответить
                  • - (void) f:(int)i :(int) j
                    {
                        [self f:1:2];
                    }

                    Можно и так. Но зачем? Если такие функции читаются, как поэзия. И подобно поэзии их нужно правильно читать, с выражением и жестикуляцией, а не бегло пробегая глазами.
                    Ответить
                    • Codestyle против!
                      Ответить
                    • Пока Василий читал код с выражением, он, во-первых, забыл, а вчём же там суть, а во-вторых оказалось, что уже не надо никакие баги в нём фиксать, ибо пока Василий читал с выражением, он уже вышел на пенсию...
                      Ответить
              • Синтаксис краткий как раз таки, идентификаторы длинные, но это уже на усмотрение кодера. В XCode охрененно удобное автодополнение, так что набирается все на раз два. Читать потом не всегда удобно эти тирады, это да :)
                Ответить
                • А зачем читать, если за програму уже заплатили?
                  Ответить
                • >> удобное автодополнение
                  Благодаря котором так удобно перепутать скажем UIControlState и UIControlEvent.
                  Ответить
          • Существует ещё браузерный движок, в котором NS означает совсем другое.
            Ответить
            • Еще есть такой девайс как компас.
              Ответить
              • Но при указании направлений буквы N и S не встречаются подряд: есть NE, SE, SW, NW, но нет NS.

                Хотя в Краснодарском крае и не такое бывает: https://ru.wikipedia.org/w?curid=3729184
                Ответить
    • Никакого говнокода, обычная отказоустойчивость.
      Ответить
    • Зато без бага... Хотя, увидеть отрицательный номер страницы было бы как-то неожиданно :D
      Ответить
    • Хорошо, что Оккам умер...
      Ответить
      • Нет, плохо, ведь именно поэтому афтар избежал его бритвы и смог ;)
        Ответить

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