Субъективный Си / Говнокод #16680 Ссылка на оригинал

0

  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 stonerhawk, (Updated )

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

  • Некогда не говори нет! Старайтесь чаще употреблять слово да. Позитивное мышление в программировании.
    Ответить
  • Можно даже себе представить:
    if([self isForEvenNumberPage] == NO && [self isForOddNumberPage] == YES)
    {
    NSLog(@"Diz is probably not even page number");
    {
    Ответить
    • Раз уж такая тема. Обьясните мне пожалуйста что значит аббревиатура NS в яблочном коде: NSLog, NSObject, NSWhatever
      Ответить
        • Неймспейсы не нужны. Только лишняя многословность
          Ответить
          • 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 он тоже умеет выбрасывать
                                                  Уметь, не означает решиться.
                                                  Стандарт добавляет решимости компилятору выбросить сайд-эффекты конструктора, что он отважно и делает, в отличии от 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. Гипербинарный Интернет Царя. Пока в разработке.
                                      Ответить
                                      • > Гипербинарный Интернет Царя. Пока в разработке.
                                        Звучит крайне многообещающе. Начинаю нетерпеливое ожидание в джесятки лет.
                                        Ответить
                        • Почему во всех этих рейтингах есть какой-то загадочный язык "Лисп". Неужели это они про тот самый Лисп, который написал МакКарти?
                          Ответить
                          • Про тот который изучают в универах. Все равно он больше нигде не нужен.
                            Ответить
                            • В универах обычно Схему учат, но в рейтингах там Схема была отдельно.
                              Ответить
          • О да, у Обьектного СИ просто охрененно лаконичный и краткий синтаксис. (сарказм)
            Ответить
            • Ну да. Вместо всяких там длинных 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];
                  }

                  Можно и так. Но зачем? Если такие функции читаются, как поэзия. И подобно поэзии их нужно правильно читать, с выражением и жестикуляцией, а не бегло пробегая глазами.
                  Ответить
                  • Пока Василий читал код с выражением, он, во-первых, забыл, а вчём же там суть, а во-вторых оказалось, что уже не надо никакие баги в нём фиксать, ибо пока Василий читал с выражением, он уже вышел на пенсию...
                    Ответить
            • Синтаксис краткий как раз таки, идентификаторы длинные, но это уже на усмотрение кодера. В XCode охрененно удобное автодополнение, так что набирается все на раз два. Читать потом не всегда удобно эти тирады, это да 🙂
              Ответить
        • Существует ещё браузерный движок, в котором NS означает совсем другое.
          Ответить
  • Никакого говнокода, обычная отказоустойчивость.
    Ответить
  • Зато без бага... Хотя, увидеть отрицательный номер страницы было бы как-то неожиданно 😀
    Ответить
    • Нет, плохо, ведь именно поэтому афтар избежал его бритвы и смог 😉
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8