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

    −116

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    - (id) init
    {
        self = [super init];
        if (self)
        {
            // выкинул лишний код
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:nil object:nil];
        }
        return self;    
    }
    
    - (void)receiveNotification:(NSNotification*)notification
    {
        if ([[notification name] isEqualToString:UpdateSubscribeState])
        {
            [self hideProgress];        
            NSMutableDictionary *dict = [notification object];
            if ([dict objectForKey:@"userId"] != nil && [[dict objectForKey:@"userId"] intValue] == 0 && [subscriptionManager getSubscriptionState])
            {
                [self performSelector:@selector(showAccountView) withObject:nil afterDelay:0.05f];
                return;
            }        
            if (isSubscription == [subscriptionManager getSubscriptionState])
            {
                [self updateSubscriptionView:[notification object]];
                return;
            }
            if ([subscriptionManager getRequestState] == RequestBuy || [subscriptionManager getRequestState] == RequestRestore)
            {
                [self performSelector:@selector(reloadView) withObject:nil afterDelay:0.05f];
            }
            else
            {
                [self updateSubscriptionView:[notification object]];
            }
        }
        else if ([[notification name] isEqualToString:GetError])
        {
            [self hideProgress];
            if ([notification object] != nil)
            {
                [errorMessages setMessageData:[[notification object] objectForKey:@"title"] text:[[notification object] objectForKey:@"message"] tag:0];
                [errorMessages showMessage];
            }
        }
    }
    
    -(void) reloadView
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:HideSubscribeView object:nil userInfo:nil];
        [self performSelector:@selector(redrawView:) withObject:nil afterDelay:0.35f];
    }
    
    -(void) redrawView:(id) selector
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:ShowSubscribeView object:nil userInfo:nil];
    }

    Это в проекте встретилось несколько разрушительных сил:
    1. Извращения архитектора (меня).
    2. Непонимание задумки архитектора автором (другой человек).
    3. Приверженность старым методам связи компонентов.
    4. Де-факто лид (я) не ревьюил код.
    5. Адско кастомный дизайн, скормленный несработавшейся и неотлаженной на тот момент команде.

    Запостил: QuickNick, 25 Марта 2013

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

    • 6. Наследие PureMVC (Который не нужен. В смысле вообще.)
      Ответить
      • PureMVC там ни при чем.
        Ответить
        • Очень даже причём. Весь гк описывется десятком строчек.
          Идём сюда, и смотрим описание
          - (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

          https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html
          Обращаем внимание на 3й параметр.

          Идём в гк и видим в receiveNotification if по [[notification name] (причём в коде я встречал куски и с 5+ if'ами).
          Если кто не понял, надо было всего лишь подписываться на конкретные уведомления и для каждого из них создавать свою функцию. А сейчас в неё сыпятся тонны сообщений из всей системы. И такого счастья в проекте наверняка навалом. Такую хрень даже ко мне в проект (в котором на любимый аффрар не участвовал) притащили. А всё почему? А потому что в PureMVC можно подписываться только на всё сразу.
          Ответить
          • То есть, пункт 3.
            Ответить
          • > Если кто не понял, надо было всего лишь подписываться на конкретные уведомления и для каждого из них создавать свою функцию.

            Эти нотификейшены - прекрасный способ прострелить себе ногу. Делегаты/наблюдатели, объявленные через протоколы, рулят.
            Ответить
            • Если что, это и был наблюдатель в терминологии Obj-C. Делегаты -это штатный и распространённый приём. А рулят - блоки. Но вы их не используете по религиозным причинам.
              Ответить
              • Почему же, у нас уже пошло причащение к API, которое мы не использовали.
                Ответить
                • Кстати, вы ещё еб... поддерживаете 3.1.3 на айфоне? Тут народ уже думает от поддержки 5.х отказываться, если что.
                  Ответить
                  • У нас сейчас нижний предел 4.3.
                    Но пробиваем подъем до 5.0.
                    Ответить
                    • КАААК? КААААК вам это удалось? Оо
                      Ответить
                      • К UI начали такие требования выкатывать, что либо нужно переходить на 5.0, либо веселиться с кастомными извратами.
                        Ответить
            • В любом случае, PureMVC причём. Именно он сподвиг на этот сорт говна. И если по другие языки, возможно, он отличный фреймворк, то под Obj-C он не нужен, так как является сборником велосипедов, ибо в фреймворке всё и так реализовано. А про локальную модификацию PureMVC, написанную кое-кем, я вообще промолчу.
              Ответить
    • я так рад, что мой код никто не видит, так бы он тут был бы на первом месте =)
      Ответить

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