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

    −99

    1. 1
    2. 2
    3. 3
    4. 4
    private function onClick(e:MouseEvent):void 
    {
            dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false))
    }

    Еще один кусочек очень полезного кода. (this для этого обработчика - MovieClip).

    Запостил: wvxvw, 30 Октября 2012

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

    • Эксплуатация сборщика мусора.
      Ответить
    • Естесственно, того же автора, человек обо всем позаботился, даже если свитч с первого раза не сработает.

      switch (event.keyCode)
      {
      	case 80: //p
      		bPenTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 66: //b
      		bBrushTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 83: //s
      		bAirBrushTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 67: //c
      		bCircleTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 81: //q
      		bRectangleTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 87: //w
      		bPolygonTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 69: //e
      		bEraseTool.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 32: //space
      		bZoomPan.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      	case 32: //space
      		bZoomPan.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
      		break;
      // еще штук десять кейсов
      	default: 
      		break;
      }
      Ответить
      • красота. налицо беда рахитектуры. а тут еще и волшебство чисел впридачу.

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

          ЗЫ. Неа, как ни странно, даже предупреждения такого нет. Хотя могли бы. С другой стороны, разрешено выражения в кейсах, и полноценной проверки компилятор не сделает, т.как он даже обычную арифметику не умеет. Так что если бы там, например было:
          case 1 + 1: ... break;
          case 2: ... break;

          компилятор это уже не рассекретил бы.

          Но я думаю, что есть PMD утилита, которая может это отлавливать.
          Ответить
          • да, так и выглядит, что чел захотел написать свой пейнт, и сел писать код сразу "из головы"
            Ответить
    • А вот автора на ООП потянуло. Создал очень даже ценный класс.

      package components
      {
      	import mx.controls.sliderClasses.SliderThumb;
      
      	public class AnimationThumbClass extends SliderThumb
      	{
      		public function AnimationThumbClass()
      		{
      			super();			
      			this.width=19;
      			this.height=22;
      		}
      	}
      }
      Ответить
      • Гы-гы. Классический поциент с травмированой ООП психикой
        Всё прям как Тарас диагностировал:
        КрасныйКвадрат, ЗеленыйКвадрат.
        Ответить
        • typedef Square<Color::Green> GreenSquare;
          Было бы очень по-тарасовски
          Ответить
          • class GreenSquare: public Square
            {
            public: 
              GreenSquare():
                  Square(Color::Green)
              {}
            };
            Ответить
            • Ты мыслишь предсказуемо: гораздо интересней вынести цвет и координаты фигуры в параметры шаблона
              Ответить
              • >Ты мыслишь предсказуемо
                Мне не нравится этот вариант с шаблоном, тк IDE будет везде подсвечивать тип переменных как Square<Color::Green>, а не как GreenSquare, тк к сожалению typedef не вводит новый тип.
                Кто там пользовался новым стандартом? using появился там для объявления типов. При этом новый тип объявляется и IDE подсвечивает GreenSquare, а не Square<Color::Green>?
                Ответить
              • Капитан Крестоблядство одобрил бы.
                Ответить
          • Не, это я крестоугорал так.
            Ответить
            • ООП - это когда вместо функции main, нужно написать класс Main.
              Ответить
        • Тут еще кроме очевидного момента есть неочевидный. Класс, от которого автор наследуется - из фреймворка в который напихано всего-всего-всего, и в том числе объемистая билбиотека реализующая КСС с селекторами и чем только можно. Более того, экземпляры этого класса потом используются в контейнере, который их своими констрейнами все равно равняет как ему нравится, и на ширину / высоту заданные в конструкторе даже не посмотрит.
          Более того, я как бы это сейчас переписывать должен под Андроид, а там и размеров таких не будет, да и вообще все по-другому.
          Ответить
      • кроме всего замеченного:

        > AnimationThumbClass
        PublicClassAnimationThumbClassExtendsSli derThumbClassWithWidth19AndHeight22
        Ответить
    • Вообще в этом наверно есть какой-то смысл.
      Допустим у нас есть вертолет, который можно кликнуть и взорвать. Есть отдельно детонатор, клик по которому тоже взрывает этот конкретный вертолет. Пусть еще будет кнопка, которая взрывает вообще все.

      Для того, кто следит за всеми этими кликами и убирает взорвавшийся вертолет со сцены, конечно, удобно когда он получает событие с event.target = вертолет который нужно убрать, а не с event.target = что-то, что вызвало взрыв. Наверно допустимо вертолету повесить несколько слушателей на детонаторы и передиспатчивать событие с собой в качестве таргета, вместо того, чтобы вертолетоубиралка.as следила за всеми связями, и понимала что от чего взрывается.
      Ответить
      • В таком случае лучше было не click посылать, а какое-нибудь другое событие и без всплытия. Зачем всплытие, если мы уже напрямую подписались? Кроме того, если мы подпишемся на click, так нам и остальные всплывающие будут в тот же слушатель попадать, и проблема не решится, т.как все равно нужно будет разбираться откудa оно пришло.
        Ответить
    • public class DrawingTool implements IAnimateable, IUndoable, IRedoable, ISerializeable

      Не хотелось отдельным постом, не заслуживает оно столько внимания, но не мог не поделиться.
      Ответить
      • нуу... ООП головного мозга, быть может. А может, и сойдет еще для сельской местности.
        Ответить
        • Да не... ну кто ж блин хоть немного, ну хоть раз видевший как undo/redo реализовано в других редакторах додумался бы до того, чтобы создать два интерфейса для того и для другого? Это как создавать специальный класс для отрицательных чисел. :)
          Ну и грамматические ошибки, которые даже и не выговоришь - тож неплохо.
          Ответить
          • > два интерфейса для того и для другого
            код не видел, но есть смутное подозрение, что это "не совсем" одно и то же, т.е. опять беда с архитектурой
            > грамматические ошибки
            скорее автору важнее сохранить написание корней, или просто не задумывался
            Ответить
            • Ну в коде - понятное дело, что это никак не связано :) На самом деле там undo/redo реализует каждый инструмент, сам для себя. Как оно работает - мне страшно предположить, но наверное пользователи не особо полагались на эту часть программы, а может оно работало по счастливой случайности: типа, undo всегда вызывалось с тем же инструментом, который выполнил последнее действие, или как-то так.
              Ответить
              • скорее всего, от интерфейса там зависит, какие кнопочки показывать для данного иструмента
                Ответить
              • > инструментом, который выполнил последнее действие
                Инструмент выполнил недопустимое действие и будет завершен.
                Ответить
          • > до того, чтобы создать два интерфейса для того и для другого

            Зачем вообще создавать интерфейс для каждой операции?
            Ответить
            • В контексте этой программы - есть смысл. Ну, так как это там построено. Программа умеет сохранять файлы, которые она потом воспроизводит. В файл записывается история использования инструментов. Т.е. undo/redo это скорее не функции редактора, а так хитро названый serializable (который тут же присутствует). Все объекты реализующие такой интерфейс пишутся в лог, который впоследствии становится файлом-проигрывателем.
              Меня сначала немного удивил подход, но потом я понял, что картинки, как таковые, никогда не предполагалось сохранять, а только то, как они были сделаны. Конечно, там еще куча разных других косяков, включая самопальный формат сериализации и абсолютно нерабочий механизм отмены действий, но вцелом задумка жизнеспособная.
              Ответить
            • > Зачем вообще создавать интерфейс для каждой операции

              Чтобы потом писать if (command instanceof IUndoable) ((IUndoable) command).undo();
              Ответить
              • Кстати я как-то тестил полиморфизм на JVM.
                Так вот оказалось что
                if (obj instanceof A) ((A) a).a();
                if (obj instanceof B) ((B) b).b();
                самый быстрый способ диспетчеризации вызова нужного метода.
                Хз почему так. Но в 90% случаев вызовы виртуальных методов работают чуть-чуть медленее.
                А в шарпе-то вроде виртуальность убрали по дефолту.

                Мораль такая: любители ооп, которые на любое ветвление лепят полиморфизм вместо case or if в очередной раз соснули.
                Ответить
                • А после скольки ифоф начинает отставать от виртуальных методов?
                  Ответить
                  • А там всё странно. Сильно зависит от количества подклассов.
                    Если у нас 1 или 2 подкласса, то скорость примерно одинаковая. К моему превеликому удивлению увеличение количества наследников (ну и след. ифов) сильней снижает скорость полиморфного кода. Вот пруф, например:
                    http://www.javaspecialists.eu/archive/Issue158.html

                    А после 3-х ифов нативный instanceof начисто порвал полиморфные вызовы.
                    Уж не знаю как нынче на 1.7, но на 1.6 было так.

                    PS. А Case+Enum, так же неожиданно оказался пошустрее интерфейсов, настолько же неожиданно его обошли instanceof.
                    Ответить
                  • Ну вот кстати годный бенч:
                    http://www.theeggeadventure.com/wikimedia/index.php/InstanceOf_Performance
                    Сранение классов x.getClass() ==A.сlass непрактично по понятным причинам. Я такой вариант даже не рассматривал.

                    Как вы могли прочитать по сцылке выше - в серверном HotSpote случаи когда 1 и 2 наследника - оптимизируются. Это объясняет хороший результат на сервеной солярке.

                    Когда варинтов >2 - там слив. Я с десяток проверял.
                    Ну может если ветвление будет штук на 30 то if-else и сольют.
                    Но делать с 30 классов - это попахивает говнецом.
                    Ответить

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