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

    −415

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #pragma mark - class methods
    + (CGFloat)cellHeightForCategory:(PostCategory *)category subscribed:(BOOL)subscribed
    {
        static CategoryTableViewCell *cell = nil;
        if(!cell) {
            cell = [[[UINib nibWithNibName:NSStringFromClass([self class]) bundle:[NSBundle mainBundle]] instantiateWithOwner:nil options:nil] firstObject];
        }
        [cell setupCellForCategory:category subscribed:subscribed];
        [cell layoutIfNeeded];
        return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingExpandedSize].height;
    }

    Задаёмся мы тут вопросом, почему это таблица загрузке данных зависает на 5 секунд...

    Запостил: krypt, 17 Апреля 2015

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

    • Так, был не прав. nibWithNibName вызывается однажды.
      Но статик внутри функции - определённо новое слово в говнокоде.
      Ответить
      • Чем это локальный static плох? Он же не виден там, где его видно быть не должно и это отлично.
        Ответить
        • Чем плох? - многопоточность. Например, if (!cell) перевел выполнение вовнутрь блока и отдал управление другому потоку, который вызвал эту же функцию, и тоже перешел в этот блок. После того, как второй поток отдал управление первому, первый все еще находится внутри блока, предполагая, что cell = hil, но на самом деле это уже не так и в зависимости от того, что эта длинная строчка делает / есть ли у нее побочные эффекты может получиться лажа.
          Ответить
          • Этот метод по-любому вызывается только из UI треда. А если нет - у него гораздо большие проблемы с многопоточностью, чем этот несчастный статик.
            Ответить
            • Теоретически, это можно сделать из фонового потока, пока элемент не присоединён к дереву визуальных элементов.
              В любом случае, я static внутри метода вообще впервые за 6 лет работы увидел. Вот этим он в первую очередь и плох.
              Ответить
            • Ну я говорил вобщем про статики без синхронизации. Я не знаю Обжекитв-С на столько, чтобы сказать можно ли это вызывать только из определенного места.

              Другой момент: в методе класса объявлять статические переменные... это прямо такой ООП что совсем не ООП. Ладно еще это просто функция была, а так, по крайней мере в теории, ожидается, что метод будет работать с классом к которому он принадлежит. Но это опять же общая проблема всего статического. У меня есть устойчивое впечатление, что модификатор "статик" был специально придуман для людей которым было тяжело переучиться с процедурного стиля на ООП, в смысле "поблажка" позволяющая быстро наговнокодить привычным способом вместо того, чтобы разобраться с проблемой и решить ее лучшим способом.
              Ответить
              • Ну да. Единственный плюс статика по сравнению с глобалками - немного легче найти все места, где его юзают (если он, конечно, не public). В остальном - самая обычная глобалка со всеми её проблемами.
                Ответить

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