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

    −180.6

    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
    package org.casalib.util {
        
        /**
            Utilities for constructing and working with Classes.
            
            @author Aaron Clinger
            @version 02/13/10
        */
        public class ClassUtil {
            
            /**
                Dynamically constructs a Class.
                
                @param type: The Class to create.
                @param arguments: Up to ten arguments to the constructor.
                @return Returns the dynamically created instance of the Class specified by <code>type</code> parameter.
                @throws Error if you pass more arguments than this method accepts (accepts ten or less).
                @example
                    <code>
                        var bData:* = ClassUtil.construct(BitmapData, 200, 200);
                        
                        trace(bData is BitmapData, bData.width);
                    </code>
            */
            public static function construct(type:Class, ...arguments):* {
                if (arguments.length > 10)
                    throw new Error('You have passed more arguments than the "construct" method accepts (accepts ten or less).');
                
                switch (arguments.length) {
                        case 0 :
                            return new type();
                        case 1 :
                            return new type(arguments[0]);
                        case 2 :
                            return new type(arguments[0], arguments[1]);
                        case 3 :
                            return new type(arguments[0], arguments[1], arguments[2]);
                        case 4 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3]);
                        case 5 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
                        case 6 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
                        case 7 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
                        case 8 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
                        case 9 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]);
                        case 10 :
                            return new type(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]);
                }
            }
        }
    }

    Запостил: Lavir_the_Whiolet, 19 Апреля 2010

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

    • Жееесть)) Интересно, кстати, зачем вообще было такой класс городить?)
      Ответить
      • У Клингера вполне оправдано использование такого подхода:
        /**
        Instatiates an externally loaded class.

        @param className: The full name of the class you wish to instantiate from the loaded SWF.
        @param arguments: The optional parameters to be passed to the class constructor.
        @return A reference to the newly instantiated class.
        @throws Error if method is called before the SWF has loaded.
        */
        public function createClassByName(className:String, arguments:Array = null):* {
        arguments ||= new Array();
        arguments.unshift(this.getClassByName(cl assName));

        return ClassUtil.construct.apply(null, arguments);
        }

        Другим способом инстанциировать класс из подгруженной swf'ки не получится.
        Ответить
    • Забавно, конечно, но как ещё реализовать вызов конструктора неизвестного класса с неизвестным заранее количеством параметров?
      Ответить
      • eval ?
        Ответить
        • Sorry, немного не понял... Как?
          И отличается ли поведение eval в AS3 от AS2? Я "тройку" слабо знаю.
          Ответить
    • показать все, что скрыто>case 9 : return new
      С++.
      Ответить
    • Обратите внимание сюды:

      Dynamically constructs a Class.

      @param type: The Class to create.
      Ответить
    • Кстати, да, как вызвать функцию с неизвестным заранее кол-вом параметров? Мне на ум приходит только это:
      mov ecx, i
      lea eax, arguments
      @:
      push eax
      add eax, 4
      dec ecx
      jb @
      push i
      call type
      Ответить
      • Речь идёт не о нативном коде, а об ActionScript 3.
        Ответить
      • Функции с неизвестным количеством параметров - must die.

        Лучше бы они пример с перла брали где на вход функции приходит абстрактный список и к класам можно по именам обращатся. и у конструктора стандартное имя...

        Тем более в асме тебе еще надо самому считывать размер параметров.

        ЗЫ в С call convention, параметры просто ложатся на стек: ну вызывающая то сторона всегда знает количество параметров которое она передает. Она же - вызывающая функция - и освобождает стек. Если не угадал с параметрами - крути рулетку как поведет себя вызываемая функция: либо крэш, либо мемори коррапшн, етц.
        ЗЗЫ паскалева call covention не поддерживает произвольное кол-во параметров, потому как вызываемая функция отвечает за чистку стека.
        Ответить
        • ололо, WriteLN, ReadLN, etc...
          Ответить
          • два с минусом вам по пасцалю.

            WriteLN & ReadLN не есть функции в Паскале, они есть часть синтакса языка.
            Ответить
        • В дельфиновом паскале можно так:
          procedure Poly(P: array of TPoint);
          ...
          Poly([P1, P2, P3]);

          То есть можно передавать любое число параметров (при этом размер массива в данном случае передастся через edx и будет доступен внутри процедуры Poly как Length(P)), но опять же, число параметров должно быть известно на этапе компиляции.
          Ответить
          • Будто бы есть языки, в которых число параметров не известно на этапе компиляции, там где эта самая компиляция есть.
            Если число парметров не известно на этапе компиляции, то List вам в помощь, например.
            Ответить
            • > Будто бы есть языки, в которых число параметров не известно на этапе компиляции, там где эта самая компиляция есть

              Первые редакции C, к примеру. Такое поведение поддерживается до сих пор. Если в объявлении функции не перечислены параметры, компилятор не знает, сколько их должно быть.
              Ответить
              • Да, в объявлении функции количество аргументов не известно, но оно известно при вызове. Всегда можно передать это количество отдельным неявным параметром. В C этого сделано не было, но C и не является совершенным языком (скорее, наоборот).
                Ответить
    • jnz, блин
      Ответить
    • А всё ж по существу...
      Создать инстанс класса по имени класса можно. Вышеописанным методом в AS3 или конструкцией вида:

      var classConstructor:Function = eval('MyClassName');
      var myClassInstance = new classConstructor();

      А вот как конструктору передать неизвестное заранее количество аргументов, если он не поддерживает arguments?
      Насколько я понимаю, никак. Потому, что аргументы, передающиеся функции/методу, являются не конструкциями байткода, а пре-компилятивным хардкодом.

      С удовольствием ошибусь в мнении.
      Ответить
    • Еще раз. Обратите внимание, что товарищ инстанциирует класс, а не объект этого класса! Согласно доке.
      Ответить
      • Ошибка в комментарии или документации малоприоритетна. По запарке ещё и не такого понаписываешь.
        Но в релизе, конечно, необходимо вычитывать и править. Тут соглашусь.

        Я думал, что основная претензия была к "case 0..10", чего и удивлялся, т.к. адекватной замены в упор не вижу. Выглядит всё равно диковато... :D
        Ответить
    • forEach по аргументам, и как выше предлагали, создать строку, которую потом eval
      Ответить
      • //-----AS2, FP8:
        trace(new Array(eval('1,2,3')));

        Пишет "undefined", само собой. Причины есть в справке Macromedia/Adobe.

        В AS3 eval вообще нет, как выяснилось.

        Для AS3 есть "костыль" через "Tamarin": http://danielmclaren.net/2008/09/21/eval-in-as3-tips-for-executing-dynamic-actionscript
        но он ещё угробищнее, чем решение Клингера.
        Ответить
        • Эх, жаль, здесь нельзя сам язык запостить как говнокод...
          Ответить
          • AS не так уж и плох, как кажется. Конечно, в нём есть недоработки проектирования, но в целом он управляем и логичен. Отдельный плюс - хорошая централизованная справка.
            На мой взгляд AS - единственный жизнеспособный client-side язык для веба.

            А вот в чём действительно ужас - так это в стандартных компонентах от Macromedia (Flash MX и далее). Уровень "индусизма" зашкаливает. Серьёзные баги в каждом компоненте. Код оттуда так и просится на этот сайт, только исходники закрыты и декомпиляция запрещена. :(

            Кстати, сам язык не запостишь, но отдельные характерные для него конструкции - почему бы и нет?
            Ответить
            • Да, есть плюшки в виде get-set-методов, но и "индусизма" тоже хватает: например, пакагесы и IM-порты; или this, который внутри вложенных функций является непонятно чем.

              А Flex SDK не закрыт. И уровень "индусизма" там ничуть не меньше. Так что вперед! >:)
              Ответить
              • А зачем вам вложеные функции? Совсем другая идеология языка, это ж не Хаскел... А язык такой потому что хотели сделать одинаково для жабаскрипта и для АС, но не получилось. Теперь в АС мучение со всяким говном, которое пришлось тянуть из жабаскрипта, а с другой стороны и не бростить его уже просто так... совместимость и все такое...
                А по поводу примера - в рамках АС3 другого выхода нет, не смотря на то, что до функции конструктора в принципе можно добрарься, вызвать ее через call() / apply() не получится, ВМ не даст.

                А чем вам импорты и пакеджи не угодили? Вполне себе нормальная практика высокоуровневых языков.
                Ответить
                • > А зачем вам вложеные функции?

                  Нужны. Точка.

                  > А язык такой потому что хотели сделать одинаково для жабаскрипта и для АС, но не получилось.

                  А мне показалось, что просто слизали побольше модных фич с распиаренных языков... Причем местами совершенно не задумываясь, зачем они нужны и нужны ли вообще.

                  > А по поводу примера - в рамках АС3 другого выхода нет, не смотря на то, что до функции конструктора в принципе можно добрарься, вызвать ее через call() / apply() не получится, ВМ не даст.

                  Вот к чему приводит тупое копирование фич из других языков.

                  > А чем вам импорты и пакеджи не угодили? Вполне себе нормальная практика высокоуровневых языков.

                  А вот тут я зафейспальмил. Дико. Так зафейспальмил, что аж уснул, и вот утром решил ответить.

                  Это нормальная практика для современных высокоуровневых языков, но ненормальная практика для языков программирования вообще. Скажите честно, коллеги, кто-нибудь из вас вообще хоть раз правил их сам? А если и правил, то не материл ли IDE, которая can not organize imports?

                  IM-порты появились в Java и то только потому, что ее создатели поленились написать автоматическую искалку модулей (как и реализовать множественное наследование, кстати). А другие, вместо того, чтобы применить хоть немного мозга, подумали, что это круто - заставлять программиста самого указывать, какие он использует модули - это же в крутой Java сделано; и стали тупо копировать это в свои языки.

                  В языках, при проектировании которых был применен мозг, а не Ctrl+C-Ctrl+V (например, Eiffel), никаких пакагесов и тем более IM-портов нет.

                  Пакагесы с IM-портами - это чистый бойлерплейт. Чище C-шных #include-ов.
                  Ответить
                  • А в функции можно объявить локальный класс?
                    Ответить
                  • Скажем так, возможно импорты и не нужны, хотя я все равно не понимаю, чем они мешают. Если это помогает компилятору быстрее работать - так я только за :) А вообще, это на столько не значительный момент, что как бы вообще не понятно откуда столько возмущения. И это, какой редактор их сам не добавляет? Ну, как бы я не знаю, по-моему совсем незначительный момент, мне как-то вообще все равно есть они или нет.

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

                    По поводу копирования фич из распиареных языков - тоже как-то сомнительно, а можно пример? Как по мне, лучше бы действитело копировали :)

                    Чего, на мой взгляд, паталогически не хватает - массивов и примитивных типов данных (т.е. обычных индексированых массивов, т.как ECMA Array это не массив, а более сложная коллекция, ну и Byte, Char, Long и т.п.). Генерики тоже бы очень не помешали... Ну и больше возможностей компилятора - инлайн, шаблоны...
                    Ответить
                    • > Скажем так, возможно импорты и не нужны, хотя я все равно не понимаю, чем они мешают.

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

                      > они там как на корове седло.
                      Ответить
                      • > Скажем так, возможно импорты и не нужны, хотя я все равно не понимаю, чем они мешают.

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

                        > вложенные функции там как на корове седло.

                        ...потому что спроектированы индусами. Хорошие вложенные функции использовать удобно и приятно, see Ruby или Scala.

                        > так компиляции можно будет годами ждать.

                        Уже. Индусы can not into optimization. Синтаксис C++ куда сложнее, а компилируется в разы быстрее.

                        > По поводу копирования фич из распиареных языков - тоже как-то сомнительно, а можно пример?

                        Пакагесы - из Java. get-set - из C#, похоже. Причем слизано через зад. Синтаксис - тоже из Java. Недо-ООП с интерфейсами и без множественного наследования - из Java. Да даже ASDoc с Javadoc-а слизан. И недопилен, да.

                        А теперь взгляните на Eiffel.
                        Ответить
                        • HollyWar.
                          Ответить
                        • Будто бы множественное наследование круто?
                          Хотя да, если боишься, то присутсвующее в языке множественное наследование можно и не использовать.
                          Ответить
                          • Множественное наследование - это один из способов управления сложностью. Очень мощный, но и очень опасный. Как бензопила - в умелых руках рубит деревья пачками, а в кривых - ноги умельца.

                            И да, когда им не пользуешься, и оно есть - это одно, а когда им пользуешься, и его нет - это, <censored>, совсем другое.
                            Ответить
                            • С вашего позволения исправлю:
                              "И да, когда им не пользуешься, и оно есть - это одно, а когда им умеешь пользоваться и сильно хочется, а его нет - это, <censored>, совсем другое."
                              Ответить
                            • Смотрите.
                              - Компилятор писали американцы, и я даже знаю кто - http://stopcoding.wordpress.com/ , индусы там не при чем :) Писал его по сути один человек... Решение на чем его писать принимал, по всей видимости не он, а продакт менеджеры - и то, что теперь имеем самый популярный компилятор для AS3 написаный на Яве (которая перед каждым запуском должна еще свой рантайм поднять, да и не бог весть какая шустрая сама по себе + проблемы с объемами памяти и т.д. и т.п.)
                              Вобщем, компилятор наш, он как бы "игрушечный", ну, так выглядит... Поэтому лучше уж там будут импорты. Если это сократит время компиляции, хоть на немного - буду их печатать, - напечатать это всего один раз, а компилировать прийдется много :) Кроме того, на стуктуру языка это вообще никак не влияет, это претензия в духе "а по чему у вас в языке много прописных букв, или подчерков, или доллaров?" (Нужное подчеркнуть).

                              Лямбда функции и АС3 ну просто никак не дружат друг с другом, ну вот так вот, или пишите на другом языке, где они есть, или учитесь пользоваться даденым инстументом, незачем со своим уставом в чужой монастырь. В HaXe есть немного больше от функциональных языков (см. callback и using). Если нравится такой подход - пожалуйста, есть другой язык, с другим подходом, компилирующийся при желании в то же самое.

                              С множественным наследованием у меня был всего один контакт в жизни, и ничего хорошего для себя я в нем не нашел (что, наверняка не отменяет его полезность, но тем не менее) - SVG - его элементы предполагают (и обязывают) к множественному наследованию. В большинсте случаев это просто не удобно и накладывает больше ограничений, чем дает возможностей...

                              Не знаю, к AS3 можно выставлять много справедливых претензий, но ваши откровенно говоря высосаны из пальца - вам нравится другой язык, так замечательно, пишите на нем, в мире есть много хороших и не похожих друг на друга языков.
                              Ответить
                              • > AS3 спроектирован и написан школьником из американской школы для дебилов (у них это называется high school). Соответственно, относится к классу эзотерических. Используйте язык программирования, а не эзотерику.

                                Бесят кулибины, засравшие мои интернеты своими поделиями и манагеришки, которые эти поделия заставляют использовать.
                                Ответить
                                • >Используйте язык программирования
                                  C++
                                  Ответить
                                • Вы это утверждаете так, как будто знаете о чем говорите.
                                  Просто для общей информации - AS3 это реализация ECMA4 которая по разным политическим и техническим соображениям была в дальнейшем оставлена. У этого языка есть автор, но это тот же человек, что в 1995 году придумал JavaScript - т.е. если бы он придумал AS3 учась в последнем классе школы (2005), то он должен был придумать JavaScript когда ему было 7-8 лет :) Да, кроме того, JavaScript существующий сейчас в FireFox очень похож на AS3 т.как в отличие от остальных браузеров, где есть только JavaScript 1.5 в FF это либо 3.6 либо 4 (не путайте с Майкрософтовским JScript, у них версии не зависимы от ECMA, и JScript 5.5 - это все тот же JavaScript 1.5 по сути.
                                  Ну а если серьезно - то у языка не один автор конечно, и как ни странно, в его создании замешаны всякие большие компании, даже тот же MS, Apple, Mozilla, и др. :) Что ни в коем случае не гарантирует качества, но тем не менее не соответствует вашей гипотезе.
                                  Интересный момент: некоторые популярные языки были действительно придуманы, ну, не школьниками, а студентами, тот же PHP например.

                                  И это... напишите свой, хороший, Интернет. Я абсолютно с вами согласен, этот Интернет никуда не годится - его место на помойке! :)
                                  Ответить
                                  • Так и хочется вас потролить.
                                    Ответить
                                  • Соглашусь со всем, а с этим:

                                    > Что ни в коем случае не гарантирует качества

                                    вдвойне.

                                    Это называется "намутили".
                                    Ответить
                                    • встретились столяр и слесарь.
                                      столяр говорит:"блин, ненавижу ключ на 10, им плохо доски отёсывать"
                                      а слесарь ему в ответ:"ты, сам му**к, ключ на 10 это классно, а вот топором гайку закручивать это попа, топор - отстой"
                                      и пошла драка не на жизнь а на смерть
                                      Ответить
                                      • Не так.

                                        Встретились столяр и слесарь. Столяр говорит: "блин, ненавижу китайский рубанок, нихрена не снимает, ломается каждые пять минут - плохо, в общем". А слесарь ему в ответ: "так возьми другой, швейцарский". Столяр отвечает: "швейцарские слишком ровно снимают, менеджеру не нравится". На том и разошлись.
                                        Ответить
                                  • >этот Интернет никуда не годится
                                    Согласен. Школотовский PHP нужно в помойку, но замены нет. :(
                                    Ответить
                                    • для php нет замены? а ты ее искал или предпочитаешь просто плакаться на говнокоде как плохо живется с "школотовским php"?
                                      вот фреймворки навскидку:
                                      happstack (haskell)
                                      erlang-web (разумеется erlang)
                                      Seaside (smalltalk)
                                      Ответить
                                      • Нифига себе. Спасибо. Незнал. Если ещё приведёте примеры - буду благодарен. :)
                                        Ответить
                                        • еще про рельсы забыл написать (Ruby On Rails http://rubyonrails.org/)

                                          Но даже на пхп есть приличные фреймворки, например kohana3 (изначально была форком CodeIgniter) http://kohanaframework.org/
                                          Использует полезный паттерн - иерархический MVC (HMVC)
                                          Ответить

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