1. C# / Говнокод #4390

    +125

    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
    int code = 300;
    
                if (
                    ex is Exceptions.ApiErrorNotFoundException ||
                    ex is Exceptions.CardAuthHistoryNotFoundException ||
                    ex is Exceptions.CardNotFoundException ||
                    ex is Exceptions.CardStateNotFoundException ||
                    ex is Exceptions.CurrencyNotFoundException ||
                    ex is EmailTemplateNotFoundException ||
                    ex is Exceptions.ExchangeRateNotFoundException ||
                    ex is Exceptions.InfoBlockNotFoundException ||
                    ex is InvoiceNotFoundException ||
                    ex is Exceptions.InvoiceStateNotFoundException ||
                    ex is Exceptions.ManagerNotFoundException ||
                    ex is Exceptions.PasswordRecoveryNotFoundException ||
                    ex is Exceptions.PayCommissionNotFoundException ||
                    ex is Exceptions.PaymentStateNotFoundException ||
                    ex is Exceptions.PaymentTypeNotFoundException ||
                    ex is Exceptions.PaySystemNotFoundException ||
                    ex is Exceptions.PersonNotFoundException ||
                    ex is Exceptions.SecretWordNotFoundException ||
                    ex is ShopNotFoundException ||
                    ex is SiteNotFoundException ||
                    ex is Exceptions.SysSettingsNotFoundException ||
                    ex is Exceptions.SysWalletNotFoundException ||
                    ex is Exceptions.TariffNotFoundException ||
                    ex is Exceptions.UserNotFoundException ||
                    ex is Exceptions.UserParamsNotFoundException ||
                    ex is Exceptions.WorldCurrencyNotFoundException ||
                    ex is Exceptions.WorldExchangeRateNotFoundException
                    )
                {
                    code = 504;
                }

    Запостил: mozg_raka, 18 Октября 2010

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

    • о. вопрос в тему: а как правильно?

      мне может самому придется нечто подобное (на С++) наговнокодить скоро....
      Ответить
      • Тоже интересно стало. Вот такое получилось с массивом:
        private void button1_Click(object sender, EventArgs e) {
          Type[] Types = { typeof(Form1), typeof(double), typeof(string) };
          foreach (Type t in Types)
            if (this.GetType() == t)
              Text = t.ToString();
        }
        Ответить
        • логично. я как то уже и позабыл что RTTI и на эксепшены распространяется.
          Ответить
        • break забыл, кстати.
          Ответить
        • Я GetType редко использую, предпочитаю "is", т.к. если этот this наследник от Form1 (например), то "if" не сработает. Однако если наследников надо отбрасывать, то все будет работать ))

          А теперь про говнокод. Насколько я понимаю, тип double и тип string никогда не вызовут никакого события, тем более ButtonClick, поэтому из массива их исключаем. Остается один элемент, а зачем тогда массив?
          Ответить
          • > предпочитаю "is"
            Согласен. А как это изобразить в коде?

            >тип double и тип string никогда не вызовут никакого события
            Не обращаем внимания, это для объёма :)
            Ответить
            • Согласен, тут "is" не поставишь. У меня для этих целей есть вот такая процедурка, работает на ура ))

              public static bool TypeInherit(Type T, Type Parent)
              {
              while (true)
              {
              if (T == Parent) return true;
              if (T == typeof(object)) return false;
              T = T.BaseType;
              }
              }
              Ответить
              • Ебаный пиздец. Ну не знаешь ты шарпов - нахуя городить то?

                T.Equals(Parent) || T.IsSubclassOf(Parent)
                Ответить
                • Я предложил решение, ты предложил лучше, согласен, чего материться то?
                  Помечу для себя, что ты знаток шарпов!
                  Ответить
                  • Прежде чем предлагать решение, неплохо было бы пошерстить документаицю и интернет в поисках готового. Вдруг, оно уже есть.

                    Я очень не люблю людей, которые не умеют пользоваться поиском по документации.
                    Ответить
                • Вы таки поосторожнее с выражениями.
                  Обычно лучше работает Type.IsAssignableFrom
                  ибо оно поддерживает и интерфейсы то же.
                  Ответить
      • Считается правильно перечислять типы в списке, а потом делать Any(t => ex is t)
        Ответить
      • А конкретно в этом случае нужно было сделать специальный класс ServerItemNotFoundException и наследовать все эти от него.

        Тогда достаточно было бы сделать одну проверку по родителю.
        Ответить
        • Тогда достаточно было бы написать

          try { } catch (ServerItemNotFoundException ex) { ... }
          Ответить
        • ну это как бы навярняка не единственное место в коде где подобное надо делать.

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

            В конце концов, исключения могут реализовывать интерфейсы. Делайте IServerItemNotFound {} - получаете интерфейс-маркер. По маркерам можно черта лысого отследить.
            Ответить
            • на каждую потенциальную дырку в коде пустой интерфейс добавлять в кучи классов - это как бы даже и с точки зрения проектирования говно. и это как можно с легкостью весь процесс проектирования под откос пустить.

              тем более что изменения иерархии наследования на средних/крупных проектах в поздних фазах разработки просто запрещено - как раз тогда когда такие проблемы и всплывают.

              то что нечто тривиальное типа "if (rc == ECODE1 || rc == ECODE2)" не имеет тривиального аналога в эксепшенах IMO есть большое говно на уровне самих языков. очевидно становится в оссобенности тогда когда ошибки нужно реально обрабатывать, а не просто какой тупой мессадж бокс на экран выплевывать.
              Ответить
    • Ну можно было там "else code = 300;" вместо первой строчки добавить конечно...
      А так это говнохлам. Иногда такого нагромождения в коде не избежать ((
      Или кто знает как?
      Ответить
    • я бы интерфейсами воспользовался. перечислять всю эту хрень хоть так, хоть в массиве - сизифов труд. всегда чего-нить забудешь.
      вообще от таких конструкций всегда веет поносом отчаянием - дедлайн уж близко, а оно нифига
      Ответить

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