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

    −120

    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
    // Flash vars come in as strings. We need them as booleans.
    private function _convertToBoolean(value:*):Boolean {
    	switch(value) {
    		case "1":
    		case 1:
    		case "true":
    		case "yes":
    		case "on":
    		     return true;
    		case "0":
    		case 0:
    		case "false":
    		case "no":
    		case "off":
    		case "undefined":
    		default:
    			return false;
    		//default:
    			//return Boolean(value);
    	}
    }

    https://github.com/tmaiaroto/agile_uploader/blob/master/src/Main.as

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

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

    • Да, еще такой момент: если все-таки там прийдет true (ну если уж числа могут, то почему бы и булеану не быть?), то не выйдет каменный цветок.
      Ответить
      • Ай! Самое главное забыли. :)
        Ответить
      • ну, а сам бы ты как такое сделал? По-моему, в том же fwplayer так же
        Ответить
        • 1.
          Boolean(value);

          2. Но если по каким-то причинам очень хочется изобрести что-то новое и необычное:
          private function convertToBoolean(value:*):Boolean
          {
          	return ["1", "true", "yes", "on"].indexOf(String(value)) > -1;
          }

          Естесственно, массив закешировать, а не создавать по-новой. Пример он на то и пример, чтобы быть коротким. Тут еще плохо то, что неожиданно для людей, которые привыкли, что любое не пустое значение строки будет приведено к true, делается все наоборот. Ну и естесственно 7 лишних кейсов, как минимум.
          А этот самый плеер можно целиком сюда выкладывать. Просто скучно немного будет, но он в целом выдержан в духе и стиле подходящем под местные правила.
          Ответить
          • Ну вот кстати кастинг не пройдет же со стрингами "0" и "1" - оба вернут true, что касается "true", "false", то оба тоже вернут true, я подозреваю (нет возможности проверить).

            Второй вариант да, само собой, я именно ожидал увидеть что-то простое и легкое вроде первого, но ведь оно работать не будет :(
            Ответить
            • << что касается "true", "false", то оба тоже вернут true - да
              Ответить
              • ну, так что от перечисления избавиться не удасться. Ну, только способ надо выбрать поизящнее :)
                Ответить
            • Наоборот, не нужно этого делать - зачем вы придумывает свой никому не известный перевод из строки в Boolean?
              Да, по поводу "работать не будет" - так а код в примере вообще ахинею какую-то делает. Мой вариант - это сокращение этой ахинеи до одной строчки. А про полезность я отдельно написал, что метод новый и необычный.
              Ответить
              • Потому что иногда нужно (читай: хочется) явно передать false в флешварсах. А как это тогда сделать? Просто пустыми стрингами кормить? Ну, можно, конечно, но это некрасиво.
                Ответить
              • Почему никому неизвестный? Если продукт готовый, как тот же fwplayer, то люди вообще могут быть не в курсе как кастуются переменные. Для них логично, что если есть on, то есть off, что если есть "1", то есть "0" и т.д. Кроме того, для них пишется документация.
                Ответить
                • Ну а мне нравится буква Ю, потому что у любимой в подмосковном городке глаза белесо белые - это как-то меня оправдает, если я вдруг решу, что именно эта буква должна быть false? Сделано, как это не часто бывает с ECMAScript, по-человечески - не нужно, так и не передавай. Нет, нужно изобрести херню какую-то вместо...
                  Нормальный человек даже задумываться не будет о том, чтобы прочитать документацию о таком моменте. Это базисная вещь языка, которую абсолютно нет смысла переопределять. То, что тут сделано, это примерно то же самое, как переопределить отнимание, и заменить его прибавлением...
                  Ответить
                  • Ну, вот типичный ответ программиста, который не думает о том, что кроме программистов есть еще и потребители, который про стандарты экмаскрипта и знать ничего не знают. Которым показали в документации (или туториале), что можно передать параметр autoplay=true, они и думают, что можно значит и autoplay=false передать.
                    Ответить
                    • >> "1" и "0" дадут true, "true" и "false" дадут true
                      Так это и есть ожидаемый результат. А то, что тут слепили работает непредсказуемо. Для предполагаемо тупых пользователей существует документация по языку и классу Boolean в том числе.
                      Ответить
                      • Ох, в контексте as и любого другого языка программирования это выглядит логично да. И так и должно быть. Я с этим не спорил и даже не говорил об этом.

                        В контексте же строки браузера выглядит нелогично.

                        Сравни:
                        http://example.org/foo.swf?autoplay=true
                        http://example.org/foo.swf?autoplay=false

                        Что ожидаешь от каждого урла? И причем тут тупые пользователи? Они вообще не должны лезть в документацию по языку, на котором у них продукт написан. Они лезут в документацию по продукту. А там написано то, что написали вы. И это должно выглядеть логично.
                        Ответить
                        • Я бы и за то и за другое... вобщем, оставил бы после смены переделывать. :)
                          http://example.org/foo.swf?autoplay

                          И не нужно угадывать, а что будет если
                          http://example.org/foo.swf?autoplay=dontknow
                          Ответить
                          • Ну, первый вариант тоже не совсем верный, ведь есть параметры которые по умолчанию не false, а true, как тогда с ними быть? :) Явное указание ведь и хорошо тем, что когда много параметров, не нужно помнить умолчания.
                            Ответить
                            • Никто не мешает так называть параметры, чтобы они всегда были позитивными. Если по умолчанию autoplay, то назвать параметр stop. Делать наоборот, это все равно что:
                              if (condition){} else { code }
                              Ответить
                              • Можно, разумеется. Например, если по умолчанию не подразумевается autoplay, то будет

                                http://example.org/foo.swf?noautoplay

                                например. Но я все равно против этого варианта, т.к. нельзя всегда все указывать явно. Видимо, это во мне питонщик говорит.
                                Ответить
                                • И вообще, ваши претензии напоминают:
                                  Приходит больной к врачу:
                                  -- Врач, мне больно, когда я так делаю!
                                  (зажмурившись от отвращения) -- Больной, перестаньте так делать!
                                  Вы сами себе пытаететсь создать идиотскую проблему (а вас никто не заставляет), и потом придумываете такое же решение.
                                  Ответить
                                  • Нет, если уж на то пошло, то мои претензии диктуют здравый смысл, где true - true, а false - false и пользователю не нужно что-то лишнее запоминать.

                                    Проблема многих (сам страдаю зачастую) программистов в том, что они заперты в своем маленьком мирке и часто не выходят даже за пределы реалий одного языка, который они чаще всего (или в конкретной реализации) используют. Именно поэтому есть еще и developer relations, которые могут повлиять на такой вот стиль программистов и сделать пользование продуктом удобным.

                                    wvxvw, с тобой интересно говорить на разные темы, но конкретно в этой ветке я думаю, мы ничего нового друг для друга уже не откроем и мнение не изменим. За сим, предлагаю дискуссию свернуть ;)
                                    Ответить
                                • Да при чем тут Питон, или какой либо другой язык... Вы предлагаете говнорешение тривиальной проблемы. Предлагая только новые варианты, как себе жизнь усложнить. Никому даром не нужны API, в которых изначально заложена сотня багов (а хз, а может поддерживать опечатки пользователя? А что если пользователь напечатал ture вместо true? А почему 1 = true а 11 = false? А может локализовать? А потом бороться с китайским языком и способами напечатать один и тот же иероглиф с разных клавиатур?). То, как строка конвертируется в Boolean - не с потолка взято, за этим стоит какая-то логика. Если бы вы о ней задумались, то остальные вопросы отпали бы сами по себе.
                                  Ответить
                                • А в китайском нет вообще слова "нет", можно только отрицательную частицу вместе с глаголом - оп-па, и вообще облом, что делать-то будете?
                                  Ответить
                                  • Щито? А в пригороде Токио нет интернета.
                                    Ответить
                                  • Когда ветка доходит совсем до абсурда, ее надо прекращать. Замечу одно, если бы вы работали с пользователями, вы бы сделали так, как сказал я, потому что вас бы задолбали репорты. Или вас бы заставил это сделать кто-то из DR.
                                    Ответить
            • > "0" и "1" - оба вернут true, что касается "true", "false"
              это вам не похапе!
              Ответить
              • Я не знаю похапе. И я не говорил, что такое поведение меня расстраивает. Напротив, вполне логично, что любая строка ненулевой длины возвращает true при кастинге в Boolean.
                Ответить
    • Дирьнамическая типизация?
      Ответить
      • Тут именно программист постарался, типизация могла быть и статической.
        Ответить
    • какое приблизительное понимание истины и лжи
      Ответить
    • показать все, что скрытоvanished
      Ответить

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