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

    −211

    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
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    public function GameCanvas() 
    		{
    			if(_instance)
                    throw new Error("Вы не можете создавать экземпляры класса при помощи конструктора. Для доступа к экземпляру используйте GameCanvas.instance.");
    			if (stage) {
    				createGameCanvas();
    			} else {
    				addEventListener(Event.ADDED_TO_STAGE, createGameCanvas);
    			}
    		}
    		
    		public var field : Field;
    		public var current_field : uint = 1;
    		public var fields_canvas : Canvas;
    		public function createGameCanvas(e:Event = null):void  
    		{ 
    			GodObject.instance.addEventListener(ModelEnum.SERVICE_LEVEL.toString() + "." + ModelEnum.METHOD_GETUSERLEVEL.toString(), createLevel);
    			GodObject.instance.addEventListener(ModelEnum.SERVICE_SANDBOX.toString() + "." + ModelEnum.METHOD_GETUSERSANDBOX.toString(), createSandbox);
    			GodObject.instance.addEventListener(ModelEnum.SERVICE_USER.toString() + "." + ModelEnum.METHOD_GETINFO.toString(), getInfoHandler);
    
    			removeEventListener(Event.ADDED_TO_STAGE, createGameCanvas);
    			this.width = 800;
    			this.height = 600;
    			this.x = 0;
    			this.y = 0;
    			this.autoLayout = false;
    			this.verticalScrollPolicy = "off";
    			this.horizontalScrollPolicy = "off";
    			_memСontroller = new MemoryController();
    			loadData = new LoadData();
    			stage.addEventListener(Event.RESIZE , windowResize);
    			
    			MainInterface.instance.create_main_interfame();
    			this.addChild(MainInterface.instance);
    			
    			var items:Vector.<InventoryItem> = new Vector.<InventoryItem>();
    			items.push(new InventoryItem(FieldLibrary.square_grass_class, "sad"));
    			items.push(new InventoryItem(FieldLibrary.square_grass_class, "sad"));
    			items.push(new InventoryItem(FieldLibrary.square_grass_class, "sad"));
    			items.push(new InventoryItem(FieldLibrary.square_grass_class, "sad"));
    			Inventory.instance.createInventory(items.length+ 68, items);
    			
    			
    			//addChild(ActiveQuests.instance);
    			var obj:Array = [ { name:"Найди пять бутылок", descr:"Тебе необходимо сдать 5 бутылок, чтобы купить банку яги!" },
    			{ name:"Трололошки", descr:"Оставь десять комментов, содержащих слово \"школота\"!" },
    			{name:"Сдай сессию", descr:"Будь мужиком, сдай сессию!"} ];
    			ActiveQuests.instance.setQuests(obj);
    			
    			
    			
    			switch (Capabilities.playerType) {
    				case 'StandAlone':	
    					loadData.gateway.call("Server.service", new Responder(startSessionResult, loadData.onFault),"User.startSession", "bstrx");//bstrx
    					break;
    			}
    			
    			for (var i:uint = 0; i < MainInterface.instance._menuBtsButtons.length;i++)
    				(MainInterface.instance._menuBtsButtons[i].img as Image).addEventListener(MouseEvent.CLICK, menuButtonsClickHandler);
    		
    			//Model.instance.requestData(ModelEnum.SERVICE_LEVEL, ModelEnum.METHOD_GETUSERLEVEL, true, userID, current_field);	
    		}
    
    		private function createLevel(e : DataEvent):void 
    		{
    			if (e.getData())
    			{
    				ScreenManager.removeObject(field, this);
    				field = new Field();
    				field.sandbox = false;
    				field.initFieldListeners();
    				field.initSquareListeners();
    				field.createField(e.getData());
    				field.rearrange();
    				field.createPlayer(e.getData()[0].id);
    				this.addChildAt(field, this.getChildIndex(MainInterface.instance));
    				MainInterface.instance.setBtnsField();
    			}
    		}

    Кусочек главного класса игры до рефакторинга

    Запостил: KirAmp, 25 Апреля 2012

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

    • this.horizontalScrollPolicy = "off";
      _memСontroller = new MemoryController();

      Обожаю такой стайл - пусть позлятся и те кто любят this и кто не любят.
      Ответить
      • Вообще код писал не один и даже не 2 человека.
        Но в данном случае это логично. у нас принять использовать this для унаследованных методов.
        Ответить
        • Мм, странно это, а ваша иде не показывает что унаследовано, да и какая разница...
          Я всегда стояла за лишние символы только если это нужно когда пространство имен перекрываться начинает ).
          Ответить
    • > GodObject

      А как же неупоминание имени Б-жьего всуе?

      if(_instance)
                      throw new Error("Вы не можете создавать экземпляры класса при помощи конструктора. Для доступа к экземпляру используйте GameCanvas.instance.");


      Сильно. А просто сделать конструктор private нельзя было?
      Ответить
      • Building Archeolog
        mxmlc -load-config+=obj\ArcheologConfig.xml -debug=true -incremental=true -o obj\Archeolog634709595029016500
        Incremental compile of 3
        Loading configuration file C:\flex_sdk_3.5.0.12683\frameworks\flex-config.xml
        Loading configuration file D:\arheolog\archeolog\Client\Archeolog\o bj\ArcheologConfig.xml
        Files changed: 2 Files affected: 8
        D:\arheolog\archeolog\Client\Archeolog\s rc\Components\GameCanvas.as(41): col: 21 Error: A constructor can only be declared public.
        private function GameCanvas()
        ^
        Build halted with errors (fcsh).

        (fcsh)
        Done(1)
        Ответить
      • Во флеше нету приватных конструкторов, эта конструкция - стандарт.
        Ответить
        • С другой стороны неоднозначности в том, кто первым создаст объект не существует (т.как всего один процесс - больше некому объекты создавать). И поэтому любой код, который пытается предотвратить создание дополнительных копий делает явно что-то не так. Но в AS очень любят бездумно копировать из Явы, поэтому такого вот в каждом проекте всегда найдется пару штук.
          Ответить
          • Ээ ну и что что процесс один, асинхронная событийная модель вполне себе может фокусов дать.
            И при чем тут ява? Что ооп специально только для него придумано было?
            Ответить
            • Ява - при том что шаблоны проектирования иллюстрировали именно на ней. А благодаря близкородственным отношениям Адоби с Явой AS3 приобрел кучу вот таких вот заимствований, как в примере подражая "старшему брату".
              Я ничего не говорил про ООП, и не сгораю желанием, если честно.

              Нет, я настаиваю на том, что в AS3 невозможно "внезапно" создать 2 копии объекта. В Яве, если не предохранятся synchronized - иногда можно попасть. В AS3 - технически такой возможности нет.
              Ответить
              • Ну а если не внезапно?
                А следить чтобы все кто пользуются твоим кодом тоже это не забывали везде делать?
                Ответить
              • Вечер, нифига мысль не могу сформулировать.
                И все же - как запретить другому человеку случайно создать левый экземпляр?
                А себе через пол года доделывая собственный проект?
                Ответить
                • А зачем запрещать? А может наоборот другому человеку очень нужно будет еще один создать, а тут - оп-па, и никак? Это тоже, уже пример мЫшления которое ассоциируется с Явой, но по другой причине - так энтерпрайз продукты разрабатываются - нанимается самая дешевая рабочая сила, всем дают по табельной лопате, и такого же сообразительного надсмотрщика, чтобы следил, чтобы никто себе случайно лопатой ногу не отрубил. Лучше иметь опасный, но работающий инструмент, чем безопасный и неработающий.
                  Ответить
                  • Перфекционизм это хорошо, но часто неизящный говнокод прикрытый инкапсуляцией и эксепшенами вполне спокойно вписывается не только в реалии текущего тз, но и в переделки на годы вперед. Иначе идеальный объект с которым "что не делай все равно не ломается" можно писать неделю, при этом проебав какую нить серьезную траблу в архитектуре. Ну а потом можно все заново переписать...
                    Ответить
                  • <<Лучше иметь опасный, но работающий инструмент, чем безопасный и неработающий.
                    Ну и берите себе инструмент по вкусу, благо их навалом.
                    Ответить
                    • Я вас теряю :)
                      Я просто говорю, что усилие потраченое на то, чтобы обеспечить объекту то что он создастся в единственном экземпляре в большинстве случаев просто не нужное и в некоторых случаях - вредное, но никогда не полезное.
                      Зачем аппелировать к вещам которые тут не учавствуют? Инкапсуляция и ошибки - какое они имеют отношение к вопросу? Ну как-то проще надо быть, что ли... Или, еще хуже, объяснять код выше тем, что "а вдруг что-то случится, а я не знаю что это?" - да, наверное случится, но это, опять же, это никак не повлияет на решение проблемы - код выше не предохраняет от каких-то непредвиденых ошибок. Он просто добавляет немного бессмысленных строчек. Если кто-то что-то сломает, то нужно писать тесты, которые проверяют, что это что-то не сломалось, но не в самой программе же.
                      Ответить
                      • <<но никогда не полезное
                        Категорично то как.
                        Мне приходилось натыкаться на этот эксепшен, если бы не он пришлось бы долго искать что случилось, почему глючит и куда делись данные (и вообще вспомним что не все умеют дебаггер юзать). На ас профессора для профессоров не пишут, потом же шею намылят за то что твоим кодом воспользоваться не смогли.
                        Все значит везде и всегда писать надо:)
                        Говорить что какая либо языковая конструкция должна или не должна быть это... ну свойство теоретика что ли.
                        Ответить
                        • > свойство теоретика
                          в точку.

                          Если есть объект, который должен быть в единственном числе, нужно это явно декларировать. Чем раньше выявится ошибочная ситуация, тем лучше. Пусть лучше новый разработчик наткнётся на свою ошибку, разберётся получше и сделает всё согласно задуманной архитектуре, чем наворотит феерических костылей, многократно увеличив "технический долг".
                          Ответить
                          • Сам объект однозначно не должен знать сколько экземпляров было создано. Потому что именно это приводит к большому количеству проблем, а то, что кто-то не прочитал документацию, не разобрался как пользоваться инструментами, забыл и т.д. - не оправдание для того, чтобы писать в корне неправильный код. Более того, в AS3 нет механизма, который бы однозначно гарантировал что объект будет создан в единственном экземпляре - если мне очень сильно захочется, или так же "случайно", эту ошибку можно обойти, например, создав класс-наследник и не вызвав в нем супер-конструктор.
                            И за очень долгую практику использования AS я не встретил ни один класс-одиночку, который бы был оправдан. И я думаю, что видел очень много AS кода...
                            Ответить
                            • >>И за очень долгую практику использования AS я не встретил ни один класс-одиночку, >>который бы был оправдан. И я думаю, что видел очень много AS кода...
                              Возьмите какой-нибудь прокси-класс, который создается только если у него в подобии хэшмэпа не хранится уже созданный экзэмпляр, для коннекта с конкретным сервисом. Да, изврат. Но эдабы же. Как с ними по-другому?
                              >>Более того, в AS3 нет механизма, который бы однозначно гарантировал что объект будет >>создан в единственном экземпляре - если мне очень сильно захочется, или так же >>"случайно", эту ошибку можно обойти, например, создав класс-наследник и не вызвав в >>нем супер-конструктор.
                              Поэтому многие дружно стали юзать роботлегс. С ним экшн становится более, чем вменяем.
                              Ответить
                            • И если в объявлении класса указать final, то не обойдете.
                              Ответить
                        • Это не языковая конструкция, но и языковые конструкции могут быть бесполезными. Тому есть много примеров. В том же AS3 в начале его творческого пути была такая конструкция как var identifier:(expression) - где expression мог быть комплексным выражением, с условием, что его можно вычислить на момент компиляции, например,
                          public var foo:Class = MovieClip;
                          public var bar:(foo) = new MovieClip();

                          Его убрали потому, что им никто особо не пользовался, реализация была очень затруднительной и занимала много времени при компиляции.
                          Программист, который не умеет использовать дебаггер - это личинка программиста :) С таким же успехом можно в качестве аргумента привести тот факт, что не все люди знают AS3, и поэтому программы лучше писать на китайском, т.как большинство людей на планете понимает китайский. Если не умеет использовать дебаггер - то чего он вообще взялся за работу?
                          Ответить
                          • Эх, хочу в ваш мир идеализма.
                            У нас найти хоть чуть умеющего прогера черезвычайно сложно.
                            Программисты в киеве не знающие дебаггер / ху из опп / где гугл не только есть но и хотят (иногда и получают) больше 1-2к баксов.
                            Ответить
                          • И вообще одно дело шариться дебаггером когда уже все упало а другое - знать где может быть ошибка потому что автор поставил забор.
                            Ответить
                            • В мой мир? А как же... мир хаоса?
                              Ну да, если что-то случилось, а если не случилось - значит все нормально.
                              Ответить

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