Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > strangedk

Оценить эту запись

Имитация перегрузки в AS3

Запись от strangedk размещена 17.01.2013 в 16:55
Обновил(-а) strangedk 18.01.2013 в 18:58

Иногда сталкиваясь с C# или C++, мне становится обидно что там есть полноценная перегрузка, и методов и операторов.

Целью было доказать возможность использования одинаковых имен у методов и переменных, вот что собственно и получилось. Кратенький пример:

Код AS3:
package  {
	import flash.display.Sprite;
	/**
	 * ...
	 * @author StrangeDK
	 */
	public class Toggle extends Sprite {		
		private namespace Normal;
		private namespace Turbo;
		private var _mode:Namespace = Normal;
 
		Normal var _strength:int = 40;
		Normal var _health:int = 30;
		Normal var _speed:int = 16;
		Normal var _defence:int = 52;
 
		Turbo var _strength:int = 50;
		Turbo var _health:int = 38;
		Turbo var _speed:int = 26;
		Turbo var _defence:int = 57;
 
		public function get strength():int {
			return _mode::_strength;
		}
		public function get health():int {
			return _mode::_health;
		}
		public function get speed():int {
			return _mode::_speed;
		}
		public function get defence():int {
			return _mode::_defence;
		}
 
		public function normal():void  {
			_mode = Normal; 
		}
		public function turbo():void {
			_mode = Turbo; 
		}
	}
}
Таким образом мы можем переключать режимы работы класса, без конструкций switch и if
Всего комментариев 19

Комментарии

Старый 17.01.2013 17:04 iNils вне форума
iNils
 
Аватар для iNils
Тип данных не меняется.
Старый 17.01.2013 17:14 strangedk вне форума
strangedk
 
Аватар для strangedk
Целью прежде всего было использование одинаковых имен у методов, свойств или переменных.

С типами эксперементирую дальше.

Можно задавать разный тип, проверил. Например String и int
только геттер в этом случае, разумеется должен быть универсальным
Старый 17.01.2013 17:27 iNils вне форума
iNils
 
Аватар для iNils
Будем честными. Это не перезагрузка.

Перезагрузка это когда можно описать так
Код AS3:
function sample (a:int):void
и так
Код AS3:
function sample (a:String, b:int):void
И пользоваться без всяких ухищрений.

А универсальные типы, это ухищрения. И Namespace тоже, его придется задавать, а есть там внутри switch или if внутри, никого не волнует.
Старый 17.01.2013 17:39 strangedk вне форума
strangedk
 
Аватар для strangedk
Это не перегрузка, никто не спорит это эксперименты

ну и цель... вы помните)
Старый 17.01.2013 18:08 iflamberg вне форума
iflamberg
 
Аватар для iflamberg
Зачем перегрузка методов, если есть?
Код AS3:
connect (... args)
Отсутствие перегрузки операторов, насколько я понимаю, объясняется тем, что это ухудшает читаемость кода, что в принципе, правда.
Старый 17.01.2013 18:17 strangedk вне форума
strangedk
 
Аватар для strangedk
Перегрузка операторов достаточно удобна, когда необходимо реализовать обычное поведение кастомных объектов. Можно написать сложную структуру, и собственные правила примитивных математических знаков, и это упрощает визуально код, напротив.

То, как это сейчас можно реализовать у нас:
Код AS3:
someNewObject = someObject1.add(someObject2);
Как это выглядит, если использовать перегруженные операторы:
Код AS3:
someNewObject = someObject1 + someObject2;
В данном случае код внутри метода add и оператора + являлся бы идентичным, но простота явная.
Я полностью понимаю, что этот вопрос спорный, но высказываю исключительно свою точку зрения.
Старый 17.01.2013 19:09 iflamberg вне форума
iflamberg
 
Аватар для iflamberg
Я читаю чужую простыню.
Код someNewObject = someObject1.add(someObject2); дает мне кучу информации. Мне сразу понятно, что someObject1 - объект, у которого есть функция add, которая, очевидно из названия, складывает два объекта
.
Код someNewObject = someObject1 + someObject2; менее информативен. Это складываются два примитива, или перегружен + у объектов? Теперь мне надо искать в чужой простыне определение someObject1, чтобы понять что происходит.
Старый 17.01.2013 19:35 strangedk вне форума
strangedk
 
Аватар для strangedk
спор ради спора? давайте лично с вами закроем эту тему
Старый 17.01.2013 20:06 iflamberg вне форума
iflamberg
 
Аватар для iflamberg
Окей, окей, мне просто скучно. Кто-то балуется с namespace'ми, кто-то пишет бессмысленное ИМО в блоги =)
Старый 18.01.2013 00:50 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Отсутствие перегрузки операторов, насколько я понимаю, объясняется тем, что это ухудшает читаемость кода, что в принципе, правда.
Скорее наоборот.
Пример с перегрузкой оператора – частный пример. Перегружать операторы действительно признали дурным тоном, но это никак не отменяет перегрузку методов, что айс.

Я вот не очень уверен о реализации перегрузки в подобном языке. По сути, всегда можно вызвать .call/apply и проблема подбора метода ложиться на плечи интепритатора, а не компилятора, хотя должно быть наоборот: компилятор создаёт разные методы с именами, сложенные из сигнатуры и определяет, где какой вызов каким методом заменить. В случае с AS3 – мудрёжка с ...args – единственный вариант. А это потеря типизации в рантайме с проверками, что есть огромная потеря производительности.
Старый 19.01.2013 12:54 ramshteks вне форума
ramshteks
 
Аватар для ramshteks
насчет перегрузки операторов, то это полезно и круто, но только если речь идет о математических абстракциях, таких как матрицы, векторы и комплексные числа. В остальных случая, как уже было замечено, они вводят в ступор.

Что на счет перегрузки методов, а в частности перегрузки конструкторов, то это мега удобно и супер круто. Школьник-mode=off. Они действительно значительно увеличивают читаемость.

Согласитесь что конструкция:
Код:
SomeObject#add(obj:SomeObject):SomeObject
SomeObject#add(value:Number):SomeObject;
чем
Код:
SomeObject#add(value:*):SomeObject
в которой надо еще выяснить, а что же там может быть, какие типы данных туда можно отправлять. Конечно есть комментарии и есть иногда возможность заглянуть в код чтобы посмотреть на наличие if'ов и switch'ей, но это не так удобно и мы все это понимаем.

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

Поэтому в случае с AS3 лучше написать на несколько сеттеров больше и решить это каким то паттерном или util-методом, чтобы избежать в часто повторяющихся фрагментах использования switch'ей и if'ов
Старый 20.01.2013 03:37 Rzer вне форума
Rzer
 
Аватар для Rzer
Перегружать операторы ещё и не секьюрно, как мне кажется. Пишешь значит a+b не заботясь о типах, а тут вам уже и метод подсунули.
Старый 22.01.2013 15:50 semenyakinVS вне форума
semenyakinVS
Не очень понимаю в чём проблема перегрузки операторов. Когда-то тоже считал, что её надо избегать, но потом друг переубедил. Ведь это просто инструмент, и говорить про ухудшение дискриптивности кода можно только если его использование происходит кривым образом. И если делать, например, оператор + для классов, для которых смысл этого оператора не очевиден, то это скорее проблема программиста, чем инструмента.
С помощью инструментов ООП тоже можно наворотить чёрте что.
Старый 22.01.2013 23:19 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
оператор + для классов, для которых смысл этого оператора не очевиден
Для скольких классов в Ваших реальных проектах он очевиден?

Если оверлоадить равно, то как Вы поймете – сравнивать два объекта на одинаковость или сравнивают их ссылки?

В общем случае, это всегда порождает вопросы и неоднозначости, поэтому их рекоммендуют не использовать. Всегда можно довести до абсурда, когда заведомо правильный подход является глупым, ровно как прицепить плохой вариант, что будет смотреться симпатично. Речь то об общем случае. А дальше думает программист, а не какие-то там рекоммендации.
Старый 23.01.2013 03:14 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
заведомо правильный подход является глупым
непонял..
А воообще перегрузки методов очень хороши. Во всяких функциональных языках пошли ещё дальше. Там не только по типу переменной разная функция, но и по значению.
типа
Код AS3:
fact(0) -> 1;
fact(N) -> N * fact(N-1).
Старый 23.01.2013 11:12 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Согласен с semenyakinVS. Если есть возможность перегрузки операторов - это круто. Если не нравится, не пользуйся - ведь в конечном счете это нигде не является обязательным требованием. Но в некоторых моментах они достаточно логично вписываются.
А по теме - находка интересная. Но мне лично интересен сам подход. В реальных проектах это будет выстрелом себе в ногу, как уже заметили.
Старый 23.01.2013 14:32 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Цитата:
Во всяких функциональных языках пошли ещё дальше
Котяра, а суть разве не сводится к обычной проверке на значение?
Старый 23.01.2013 16:06 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
непонял..
Из ярких примеров – статья на хабре, как вычисляли факториал. Делали всё правильно, по фен-шую и паттернам. Но это – глупо. Или PureMVC там. Я к тому, что можно применять плохой инструмент хорошо, как и хороший плохо.
Старый 24.01.2013 14:59 strangedk вне форума
strangedk
 
Аватар для strangedk
Я помню эту статью, кажется на Java. Туда впихнули всё возможное, что только можно было придумать. Хотя факториал вычисляется одной строкой.

По поводу перегрузки, конкретно операторов - дело же частное, если удобно то делай, и напиши конкретный JAVADOC например. Если оно себя не оправдывает, то конечно нет резона внедрять перегрузку. Здравый смысл ведь никто не отменял.
Обновил(-а) strangedk 24.01.2013 в 18:32
 
Последние записи от strangedk

 


Часовой пояс GMT +4, время: 03:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.