ДействиеСценарий / Говнокод #3051 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Lavir_the_Whiolet, (Updated )

Комментарии (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'ки не получится.
      Ответить
  • Забавно, конечно, но как ещё реализовать вызов конструктора неизвестного класса с неизвестным заранее количеством параметров?
    Ответить
  • Кстати, да, как вызвать функцию с неизвестным заранее кол-вом параметров? Мне на ум приходит только это:
    mov ecx, i
    lea eax, arguments
    @:
    push eax
    add eax, 4
    dec ecx
    jb @
    push i
    call type
    Ответить
    • Функции с неизвестным количеством параметров - must die.

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

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

      ЗЫ в С call convention, параметры просто ложатся на стек: ну вызывающая то сторона всегда знает количество параметров которое она передает. Она же - вызывающая функция - и освобождает стек. Если не угадал с параметрами - крути рулетку как поведет себя вызываемая функция: либо крэш, либо мемори коррапшн, етц.
      ЗЗЫ паскалева call covention не поддерживает произвольное кол-во параметров, потому как вызываемая функция отвечает за чистку стека.
      Ответить
      • В дельфиновом паскале можно так:
        procedure Poly(P: array of TPoint);
        ...
        Poly([P1, P2, P3]);

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

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

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

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

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

      Я думал, что основная претензия была к "case 0..10", чего и удивлялся, т.к. адекватной замены в упор не вижу. Выглядит всё равно диковато... 😀
      Ответить
  • forEach по аргументам, и как выше предлагали, создать строку, которую потом eval
    Ответить
        • 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.
                      Ответить
                      • Будто бы множественное наследование круто?
                        Хотя да, если боишься, то присутсвующее в языке множественное наследование можно и не использовать.
                        Ответить
                        • Множественное наследование - это один из способов управления сложностью. Очень мощный, но и очень опасный. Как бензопила - в умелых руках рубит деревья пачками, а в кривых - ноги умельца.

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

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

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

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

                              Бесят кулибины, засравшие мои интернеты своими поделиями и манагеришки, которые эти поделия заставляют использовать.
                              Ответить
                              • Вы это утверждаете так, как будто знаете о чем говорите.
                                Просто для общей информации - 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)
                                        Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8