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

    −100

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    -(void)savePictureWithId:(NSString*)pictureId{                       // pictureId - строка типа @"4629"
        Picture * picture = [pictures objectForKey:pictureId];           // pictures - словарик, хранит какие то (не все) доступные объекты Picture
        if(picture == nil)
            return;
        NSString * identif = picture.id;                                 // id найденного объекта, который всегда содержит строку совпадающую с параметром pictureId
        if((picture.viewed == NO) &&
           (NO == [viewedPicIdsPack containsObject:identif]))            // viewedPicIdsPack - специальный NSMutableArray для хранения Picture, причем которые не "viewed"
        {
            [viewedPicIdsPack addObject:identif];                        // Про NSMutableSet не знаем, судя по проверке
        }
    }                                                                    // При чем здесь "savePicture"?

    К этой функции прилагается еще 5 кг спагетти-кода работы с этой кучей NSMutableArray на все случаи жизни (в функции еще не все такие контейнеры засветились)
    Писал человек с 3+ года опыта коммерческой разработки.

    Запостил: NAlexN, 19 Декабря 2013

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

    • Нормальная функция кеширования. Есть некоторые вопросы, но вне контекста не фатальны. Чем она вас не устроила?

      А спагеттикод - это нормальное состояние Objective-C
      Вспомните хотя бы объявление shouldAutorotateToInterfaceOrientation, за появление которого фрагмент кода тут автоматом заплюсовывается, не смотря на остальное содержимое.
      Ответить
      • Мы как то по-разному понимаем выражение "спагетти код", ибо реализация shouldAutorotateToInterfaceOrientation обычно пишется в одну строчку и никак не запутывает читателя кода.

        А функция кеширования эта - не нормальная, картинки и так уже закешированы в другом контейнере в этом же классе.
        Да, возможно по приведенному куску кода тяжело оцененить масштабы пи**ца, творящегося во всем модуле.
        У класса Picture куча состояний, и в зависимости от состояния их добавляют в разные контейнеры, причем при смене состояния картинку надо удалить из одного контейнера и возможно добавить в другой - это ужасно, отследить все места, где это происходит очень тяжело, малейшая попытка что то отрефакторить привносит мигающие баги, потому что все это очень криво завязано на работу с сетью и показом в UITableView, малейшая промашка - и картинки по нужному indexPath уже нету.
        Просто поверье, я работал на других проектах, частично написанных не мной, избежать спагегги кода на Objective-C вполне реально, и более того это зависит не от языка, а от прямо(криво)рукости программиста
        Ответить
        • > ибо реализация shouldAutorotateToInterfaceOrientation обычно пишется в одну строчку
          Видимо у нас совершенно разные понятия о спагетти-коде...
          Вот классическая реализация, не добавить, не отнять (хотя некоторые умудряются)
          -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
          {
              return UIInterfaceOrientationIsLandscape(interfaceOrientation);
          }

          По-моему, отличное спагетти. А то, что в примере - даже за 80 символов по ширине не вылезло :)

          > А функция кеширования эта - не нормальная, картинки и так уже закешированы в другом контейнере в этом же классе.
          Может быть там у вас картинки в память загружены, а сложенные в этот массив ещё и на диск запишутся?
          Ответить
          • Ну да, как я и предполагал.
            Ссылки, к сожалению, сайт не разрешает
            http://ru.wikipedia.org/wiki/Спагетти-код
            Ответить
    • упс, не туда
      Ответить

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