1. ActionScript / Говнокод #5296

    −152

    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
    /**
    		 * Returns UserData object of the user with specific clientId from the friend list.
    		 * If there is no such clientId, throws an error.
    		 * @return <B>com.gixoo.videoRound.data.users.UserData</B>
    		 */
    		public function getUserDataByClientID(clientId : String) : UserData 
    		{
    			var result : UserData;
    			for (var i:uint; i < _people.length; i++) 
    			{
    				if (_people[i].userServerData.clientId == clientId) 
    				{
    					result = _people[i];
    					break;
    				}
    			}
    			if ( !result )
    			{
    				result = _people[i];	
    			}
    			return result;
    		}

    Тестирование показало, что ошибку эту никто не ловит... но зачем так сложно ее выбрасывать...

    Запостил: wvxvw, 16 Января 2011

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

    • Да, это, до того, как это происходит:
      private var _people:Vector.<UserData> = new <UserData>[];
      Ответить
    • а вот здесь
      if ( !result )
      {
      result = _people[i];
      }

      i что будет держать?
      Ответить
      • _people.length
        k.o.
        Ответить
        • значит, _people[i], т.е. _people[_people.length] уже не имеет смысла
          Ответить
          • Ну так сказано же: If there is no such clientId, throws an error.
            Ответить
            • меня замыкает ситуация, когда пишут код не для того, что бы он работал, а что бы он не работал.
              Хорошо, что это экшонскрипт со всеми проверками, а написать бы это на Си, и получаем не эксепшон, а трудноотлавливаемый баг.
              Ответить
              • Вот поэтому этот код и здесь. Шикарный ведь.

                P.S. И кто это вас постоянно минусует?
                Ответить
                • > Вот поэтому этот код и здесь. Шикарный ведь.
                  по невнимательности (коммент проигнорил) даже не сразу оценил грандиозность замыслов автора.

                  > P.S. И кто это вас постоянно минусует?
                  Доброжелатели, очевидно.
                  Ответить
                  • Если бы это была такая задумка, бросать исключение о выходе за пределы массива, следовало бы написать просто:
                    public function getUserDataByClientID(clientId : String) : UserData 
                    {
                            for (var i:uint;; i++) 
                                    if (_people[i].userServerData.clientId == clientId) 
                                            return _people[i];
                    }
                    Ответить
                    • не скомпилируется (если указан возвращаемый тип, то все codepaths (во, не знаю как по-русски) должны возвращать значение).
                      А вообще, в итоге переделалось в
                      return _people[clientId];
                      ну и
                      private var _people:Object/*UserData*/ = {};
                      Завтра буду выяснять, а нужна ли функция вообще (а то может оказаться, что и весь класс снести можно...)
                      Ответить
                      • Так за конец цикла выполнение никогда не попадает. Если компилятор отслеживает пути выполнения, то должен это понимать (и наоборот, ругаться, если бы за циклом что-то было).

                        Ну а переделка списка в ассоциативный массив -- это уже немножко другой уровень.

                        Автора кода поздравьте -- мы ждём ещё перлов от него.
                        Ответить
                        • просто добавить return _people[i]; и все работает = )
                          Ответить
                          • По правилам хорошего тона точка выхода из функции должна быть одна, и это должна быть последняя строчка в функции :) Куда уже там 2 раза return на две с половиной строчки? :) Я практически говорю, про конкретный компилятор (он по-сути в AS3 всего один - ASC), ну и его разновидности / надстройки MXMLC и т.п. Не скомпилирует. Он не на столько умный, чтобы понять, что такой цикл будет либо бесконечным, либо вернется что-то. Я не уверен, что тот же MSVC такое бы "одобрил"... javac тож вряд ли...
                            Ответить
                            • > По правилам хорошего тона точка выхода из функции должна быть одна, и это должна быть последняя строчка в функции :)

                              вот так рождается говнокод... когда вместо немедленного завершения мы будем тянуть к единому выходу.
                              Ответить
                            • > По правилам точка выхода из функции должна быть одна
                              пруф?
                              Ответить
                              • http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html
                                Открыть категорию Maintainability Rules, в ней самое первое правило, ну или если оно будет не первым, то вот его содержание:
                                [quote]A method should have only one exit point, and that should be the last statement in the method[/quote]
                                На самом деле кода не будет больше, и читать действительно удобнее. Я не всегда этого придерживаюсь, и не всегда это возможно, но в данном случает оно только к лучшему.
                                Ответить
                                • спасибо, доставило

                                  особенно кусок говна с надписью loading и градусник великолепен, прямо как в старых добрых девяностых

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

                                  Бездумное следование этим рекомендациям и приводит к такому говнокоду.
                                  Ответить
                                  • Не правда, если делать бездумно, то лучше уже следовать каким-то рекомендациям, чем "интуиции". Потому что в последнем случае получаем идиотизм перемноженый на идиотизм (т.е. количество идиотизма в коде вырастет експотенциально).
                                    Ответить
                              • Не знаю, как в приличных компиляторах, но, как мне кажется, при каждом return'е cbuilder (довольно старый) генерирует деструкторы для всех локальных переменных. Соответственно, ассемблерный код превращается в мешанину повторяющихся вызовов. Вопрос не исследован мной до конца.
                                Интересно будет посмотреть, что в таком случае делают другие компиляторы.
                                Ответить
    • Хороший, оригинальный говнокод.
      Ответить
    • Кроме всего вышесказаного, дальнейшее расследование показало, что clientId содержит то ли md5 то ли sha256, вобщем что-то, что призвано быть уникальным, что вообще сдeлало всю эту замечательную функцию бессмысленной :)
      Ответить
      • ну надо найти, она и ищет.
        а вообще сюда бы хороши карты(хеши)
        Ответить

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