Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Использование super (http://www.flasher.ru/forum/showthread.php?t=137068)

Psycho Tiger 03.03.2010 23:52

Использование super
 
С точки зрение тру-флешеризма нужно писать
Код AS3:

super.superClassMethod()

верно?
Интересует 2 вещи:
1) А если у меня цепочка:
Class1 extends Class2 extends Class3
чтобы в Class1 вызвать методы Class3 по логике super`а нужно писать super.super.method3(), только вот так нельзя - ругается. Тогда пишем как - super.method3() или даже просто method3()?

2) Ситуация:
Код AS3:

if (autoConnect) addEventListener(UserToUser.READY_EVENT, onModuleReady);
super(param, autoConnect);

Класс наследуется от класса, который наследуется от EventDispatcher`а. Правильней нужно поставить super.addEventListener, однако нельзя вызвать после использования super ещё и конструктор суперкласса - что делать?

etc 04.03.2010 00:03

1) Вызываем method3 класса Class2, который в свою очередь вызывает method3 у Class3. Всё через super.
2) Если оно асинхронное, то нафига что-то втыкать до вызова супер-конструктора?

wvxvw 04.03.2010 00:14

Вообще, в конструкторе лучше либо ничего не писать, либо самый минимум. Конструктор - это самая медленная функция в классе изза того, что каждый раз она по-новому прочитывается (остальные функции раз скомпилировали JIT'oм и используем готовые). Да и ограничения на порядок вызова тоже не самое лучшее - вобщем, если в конструкторе нужна какая-то логика, легче ее всю завернуть в отдельную функцию и вызвать из конструктора чем потом сталкиваться с подобного рода проблемами.

Psycho Tiger 04.03.2010 00:40

Цитата:

1) Вызываем method3 класса Class2, который в свою очередь вызывает method3 у Class3. Всё через super.
Звучит как будто надо оверрайдить в Class2 методы его суперкласса.
Я так понимаю что просто если метод в этом классе, то this.thisClassMethod(), а если в суперклассе или "выше" - то super.mySuperClassMethod()?
Уже кстати понимаю сторонников писать this везде, где нужно)
Кстати, про this - я пишу this.myMethod() или this.myPole - если это члены класса, а если это локальные переменные в методе писать this не нужно, верно?

Цитата:

2) Если оно асинхронное, то нафига что-то втыкать до вызова супер-конструктора?
В целом верно, просто когда увидел этот кусок задумался - а что если событие UserToUser.READY_EVENT может диспатчится в конструкторе? Конечно, если делать как скзаал wvxvw проблемы нет - но уже интересно просто с точки зрения правильности - без super ведь работает.

udaaff 04.03.2010 02:39

super в методах нужно писать там где необходимо, имхо. Так же как и this. В конструкторе всегда.
Цитата:

а если это локальные переменные в методе писать this не нужно, верно?
Проще попробовать, чем спросить :) Естественно не нужно.
Цитата:

Уже кстати понимаю сторонников писать this везде, где нужно)
Везде, где нужно, или везде где только можно? :)
Никогда не понимал сторонников загромождения своего кода различными ненужностями, которые якобы улучшают читаемость и понятность.

etc 04.03.2010 08:25

Цитата:

Сообщение от Psycho Tiger (Сообщение 890739)
если это локальные переменные в методе писать this не нужно, верно?

А что, получилось написать this? :)

Цитата:

Сообщение от Psycho Tiger (Сообщение 890739)
В целом верно, просто когда увидел этот кусок задумался - а что если событие UserToUser.READY_EVENT может диспатчится в конструкторе? Конечно, если делать как скзаал wvxvw проблемы нет - но уже интересно просто с точки зрения правильности - без super ведь работает.

И кому оно отправляется в конструкторе, мм?

Psycho Tiger 04.03.2010 09:49

Цитата:

Везде, где нужно, или везде где только можно?
Никогда не понимал сторонников загромождения своего кода различными ненужностями, которые якобы улучшают читаемость и понятность.
Везде, где нужно) Раньше переменную myVar обзывал по 3 раза - myVar, myVariable, variable (к примеру) - разные переменные для суперкласса, поля этого класса и локального класса. Сейчас часто такие пересечения и везде указываю область видимости - кайф )
Цитата:

Никогда не понимал сторонников загромождения своего кода различными ненужностями, которые якобы улучшают читаемость и понятность.
Насчёт this везде ещё соглашусь, однако с точки зрения ООП super всё таки при вызове методов суперкласса писать нужно. Байткод разный получается, так что... лучше переучиваться :)
Цитата:

А что, получилось написать this?
Цитата:

Проще попробовать, чем спросить Естественно не нужно.
Да, не пробовал, каюсь) Я пока ещё this не пишу везде и вся, наверное, если бы начал - вопроса бы не было) спасибо

Цитата:

И кому оно отправляется в конструкторе, мм?
Хах, верно) Хотя, можно же отправлять его чтобы как раз потомки подловили - но пахнет маразмом уже - проще метод пустой объявить и его оверрайдить.
Просто забавно, что код "идеологически" неверный работает, а идилогически верный - нет :(

Дак что с методами суперкласса суперкласса? Просто super.myMethod() ?

etc 04.03.2010 09:55

Цитата:

Сообщение от Psycho Tiger (Сообщение 890812)
Просто super.myMethod() ?

Ну само собой.

Psycho Tiger 06.04.2010 12:07

Кстати, в коде далеко не глупых ребят всё чаще встречаю
Код AS3:

this.addEventListener(...);

без override`а addEventListener`а.
Сам я с некоторых пор этой темы пишу
Код AS3:

super.addEventListener

Да и вообще, любое свойство и метод определенный в базовом классе пишу через super.
Как правильно?

Ещё заметил, что mxmlc не хочет компилировать конструкцию
Код AS3:

super.x+=10;

Однако,
Код AS3:

x+=10;

компилируется. У меня бета, из за этого или есть какая-то фишка?

Котяра 06.04.2010 12:43

super для методов а не свойств.

etc 06.04.2010 14:55

Цитата:

Сообщение от Котяра (Сообщение 898343)
super для методов а не свойств.

Вполне себе и для свойств. То, что не работает инкремент при super — баг.

Psycho Tiger 06.04.2010 15:21

Про баг понял, из за него буду писать просто x+= :(

То есть, чтобы уж точно - по второму кругу - ВСЕ свойства, сеттеры, геттеры и методы, определенные в базовом классе и выше должны вызываться через super, и по сути this.addEventListener без переопределения этого метода писать неправильно с точки зрения сверх-грамотного флешеризма?

dimarik 07.04.2010 00:19

Цитата:

Сообщение от Psycho Tiger (Сообщение 898338)
Ещё заметил, что mxmlc не хочет компилировать конструкцию
Код AS3:

super.x+=10;

Однако,
Код AS3:

x+=10;

компилируется. У меня бета, из за этого или есть какая-то фишка?

Вполне вероятно, что и
Код AS3:

this.property += value;

не скомпилится.

Добавлено через 3 минуты
являясь (круто, три буквы "я"!) автором класса, вы вправе переопределять методы надкласса(ов). Употреблять super для меня не столько модно, сколько для понимания исходного кода, что этот метод точно вызывается у суперклассов.

MrPoma 07.04.2010 01:20

Цитата:

Сообщение от PsycoTiger
Ещё заметил, что mxmlc не хочет компилировать конструкцию
Код AS3:

super.x+=10;

Однако,
Код AS3:

x+=10;

компилируется. У меня бета, из за этого или есть какая-то фишка?

Я пользуюсь заплатками
Код AS3:

super.x = super.x + 10;


джонатан 29.09.2010 19:27

Ребят, а если не сложно, расскажите мне пожалуйста на пальцах, для чего, и как используется super(); :)

arkadattx 29.09.2010 21:25

Присоединяюсь к вопросу джонатана.
Я так понимаю, что если нам явно не нужно вызвать метод суперкласса, то мы просто страхуемся, что, как написал Psycho Tiger, "true"?

Psycho Tiger 29.09.2010 21:45

Ага, типа того.
Я уже понимаю людей кто явно пишет this и super. Код без super`ов для меня с некоторых пор стал читаться хуже... Но я ни в коем случае не агитирую писать его везде где только можно ) Это дело вкуса.

cleptoman 29.09.2010 21:51

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

f.g.programmer 29.09.2010 21:52

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

Насчёт использования super для вызова методов присоединяюсь к мнению тех, кто считает, что это использование оправдано только в соответствующем перезаписываемом методе, т.е.
Код AS3:

override public function callMyMethod():void {
        //...
        super.callMyMethod();
        //...
}

И в этом есть смысл, ведь переопределяем мы методы именно для того чтобы использовать переопределённые методы. Так?

Добавлено через 3 минуты
И ещё при глубокой вложенности классов super совсем не помогает найти метод.

Котяра 29.09.2010 22:28

не знаю - я не использую супер везде.
Не вижу смысла. Только проблемы.
А если мне нужно вызвать
допустим есть
Цитата:

publiс function redraw():void
{
super.init();
super.draw();
}
я переопределил у наследника метод draw, теперь мне нужно искать по коду какого не работает нормально redraw? или переопределять его тоже?
фанатизм не нужен. если ты уверен что нужно вызывать ТОЛЬКО метод родителя тогда супер, а если надо/есть возможность переопределить - то не стоит - писанием кругом super мы нарушаем полиморфизм - не даёт потомкам нормально мутировать.

koIIImarik 30.09.2010 01:10

2 cleptoman:
Цитата:

в том то и дело, что не совсем вкуса..супер - явный признак вызова родительского метода.
т.е. к примеру если мы разбираем класс, где много много букаф и видим конструкцию super.someMetod() мы не лазием по тыще строк в поисках его (его может и не быть в этом классе), а смотрим экстенд и смотрим метод в родителе. я к чему - проще для восприятия и работы с кодом в целом. это навскидку)
В FlashDevelop всё решается кликом на методе и нажатием F4 =)

2 etc:
Цитата:

1) Вызываем method3 класса Class2, который в свою очередь вызывает method3 у Class3. Всё через super.
Если это шутка, то я её вначале не понял =) Хотел написать, что это бред.

По поводу использования super везде, моё мнение схоже с Котяра. Хотя, опять же, это, наверно, дело вкуса, кому-то, может быть, удобнее писать super везде. Если такие есть, то мне интересно, пишете ли вы super.addChild, или super.graphics, или super.mouseX или super.contains?

Psycho Tiger 30.09.2010 01:18

Это случай на миллион, когда вдруг внезапно потребовалось что-то изменить, да так, чтобы у всех. Случай на 10 тысяч это когда конкретному блоку кода нужно вдруг другое поведение, а не всем в целом - тут уже переопределяем метод и не парим голову по поводу того, что в 40 местах это поведение вдруг изменилось.
В моей практике как-то так. Миллион бывает реже, поэтому я пишу super. А учитывая что мне с ним когда читать легче - мой выбор очевиден. А начиналось с моды..)

Кошмарик, да. Я даже super.stage пишу ))

etc 30.09.2010 11:51

Цитата:

Сообщение от koIIImarik (Сообщение 939617)
Если это шутка, то я её вначале не понял =) Хотел написать, что это бред.

Чистейшая правда.

Цитата:

Сообщение от koIIImarik (Сообщение 939617)
Если такие есть, то мне интересно, пишете ли вы super.addChild, или super.graphics, или super.mouseX или super.contains?

Пишу.

zuxul 30.09.2010 13:40

Цитата:

Сообщение от etc (Сообщение 939677)
Пишу.

ё мое...сколько лишних букв, :eek:
super, this - это же идентификаторы области видимости в классе и только...
Представляю, во что бы превратился код на с++ (там используется конструкция "ИмяКласса::" либо просто "::") если для "понятливости" везде писали эти конструкции...
Цитата:

Сообщение от Psycho Tiger (Сообщение 939619)
и не парим голову по поводу того, что в 40 местах это поведение вдруг изменилось.

Все равно не понимаю, зачем тогда переопределять данный метод, если поведение его вдруг поменяется в 40 местах, не проще ли написать тогда новый? Ведь переопределять надо так, чтобы логика не менялась...

Psycho Tiger 30.09.2010 13:42

Если логика не меняется - и переопределять не надо.

Котяра 01.10.2010 00:36

Лишние буквы — плохо!
Код AS3:

this.property =  this.otherProperty + super.oldProperty;

по уровню сигнал/шум намного хуже чем,
Код AS3:

property =  otherProperty + oldProperty;

Ещё раз — лично моё имхо и ничего более :)
Я и this не пишу без явной надобности.. f4 спасает, хотя при использовании интерфейсов/базовых классов — ничего не спасает :(
UPD и честно говоря, меня мало волнует - пишут super/this или нет, главное чтоб код был понятен и нормально организован, и хотя бы в основном соблюдал конвенции, а эти мелочи — дело десятое.

-De- 01.10.2010 01:27

Если вы всюду пишете super, то это значит, что вы хотите, чтоб по умолчанию вызывался метод старшего в иерархии класса, даже если этот метод переопределён. Т.е. чтоб был не super, а notSuper, а поведение с super было по умолчанию. Но это бред и такого нет ни в одном языке, ибо полиморфизм и инкапсуляция.
super означает, что по каким-то очень специальным причинам вызывается не переопределённый в классе метод, а метод родителя. И пока этот метод не переопределён, то нечего писать супер, т.к. методы вообще переопределяются (а не пишутся другие) для того, чтоб их переопределённые вызывали.
this означает, что дёргается не локальная/глобальная переменная/функция, а именно поле/метод этого класса (и значит, похоже, тут есть локальная переменная с таким же именем и надо быть поосторожнее).

Котяра 01.10.2010 14:34

@-De-
Отлично сказано!

Psycho Tiger 01.10.2010 14:53

Зайдём с другой стороны.
Люди пишут this чтобы сразу отличать локальные переменные от полей. this.addChild я считаю безграмотным. Да, он доступен в этом скоупе. Но в this его никто не объявлял.

-De- 01.10.2010 16:11

Psycho Tiger, по-моему зло везде this лепить. Лучше уж тогда венгерская нотация - m перед всеми членами класса и всё видно и писать меньше. Там, где надо подчеркнуть, что это именно член класса - да (ну или просто без this работать не так будет). Но если опасаешься путаницы с локальными, то это по-моему повод на полсекунды задуматься, всё ли так в методе.

Psycho Tiger 01.10.2010 16:23

-De-, тут в другом дело. Обычно за первый час разработки у меня в проекте появляется около 20-30 классов (MVC addicted, чо)). Когда я пишу логику - мне очень важно сразу знать, куда я обращаюсь, пока не втянешься в архитектуру нового проекта, каждый раз новую (я под каждый проект делаю всё лучше и правильнее, спасибо etc, Котяре и всем остальным, кто разжевывает как правильно). В итоге "_", отсутствие "_" и super являются для меня неотъемлемыми помощниками. К тому же часто приходится переопределить что-то для каких то новых объектов и фишек - и я совсем не хочу, чтобы моё старое перестало работать.

В общем, я думаю это просто дело вкуса. Я например вот текилой проникнуться никак не могу)

Котяра 01.10.2010 16:26

Цитата:

Сообщение от Psycho Tiger (Сообщение 940105)
this.addChild я считаю безграмотным.

ну и зря
Код AS3:

mc.addChild(smth)
this.addChild(mc)

this - это не ЭТОТ класс - это ЭТОТ экземпляр!!!

Цитата:

Я например вот текилой проникнуться никак не могу)
А лучше водки хуже нету.

Psycho Tiger 01.10.2010 16:55

Да это-то понятно )

Я думаю, тут придти к согласию нельзя. Соглашусь лишь с тем, что самое главное чтобы код был читабельный и красивый, а super и this там, где можно без них - лишь стиль.

Котяра 01.10.2010 17:49

Цитата:

Сообщение от Psycho Tiger (Сообщение 940145)
главное чтобы код был читабельный и красивый

Это тоже не самое главное. :)
Всё же главное - чтобы код работал.
Я не за быдлокод, но красота кода — это не главное. Хорошо когда красота кода вырабатывается автоматически, (часто приходит с опытом), но красота ради красоты - это излишнее.

Psycho Tiger 02.10.2010 20:19

Красота ради красоты называется рефакторинг )

Мне доводилось видеть разный код, часто просят поправить баги/доработать. В проекте одном было 20 классов. 19 из них по 300-400 байт, один в 120 кб. В другом проекте - вложенность функций в методах (дада, я не оговорился, я о анонимных функциях, плодящихся в рантайме) достигала 3-4. В третьем мне вообще предоставили декомпилированный код. После таких и подобных ситуаций я пришел к выводу, что недостаточно одной лишь работоспособности кода: с кодом должно быть приятно работать. Ну, примерно из этих же соображений я за низкую связанность в коде - высокое сцепление, безусловно, необходимо, но в отдельных классах: приложение должно строится на модулях, которые знают друг о друге минимум. Может я не прав, но именно с таким кодом мне работать удобнее всего.

Котяра 02.10.2010 23:27

молодец.
Цитата:

Вы знаете, полиморфное наследование, на самом деле — жалкая замена функциональным литералам и динамическому типизированию
:):):)
оттуда же (комменты статьи) в моём избранном:
Цитата:

Новички — новички перегибают палку. По-разному. Слишком много оптимизируют, абстрагируют, защищаются от ошибок. Или наоборот, вообще не делают этого. Главное для новичка не запутывать себя принципами «правильного» программирования, не слушать бездумно знатоков, нужно самому разбираться и делать выводы, что работает, а что нет. Я вижу как люди начинают городить абстракции, запутываются. Они и видят что это не работает, но не могут себе признаться в этом. Их научили как «правильно», и все тут.
UPD а
Цитата:

Красота ради красоты называется рефакторинг )
вообще бред)
рефакторинг иногда помогает сделать красиво и методы рефакторинга часто похоже на " давай сделаем красиво", но это не главное в рефакторинге.
Цели рефакторинга могут быть и абсолютно другими, вплоть до снижения читабельности== обструфакции кода)

easy.proger 02.10.2010 23:53

Цитата:

Сообщение от zuxul (Сообщение 939709)
ё мое...сколько лишних букв, :eek:
super, this - это же идентификаторы области видимости в классе и только...
Представляю, во что бы превратился код на с++ (там используется конструкция "ИмяКласса::" либо просто "::") если для "понятливости" везде писали эти конструкции...

Все равно не понимаю, зачем тогда переопределять данный метод, если поведение его вдруг поменяется в 40 местах, не проще ли написать тогда новый? Ведь переопределять надо так, чтобы логика не менялась...

Программистам С++ не понять этого ... я среди не понимающих ...
Хочется, пускай пишут ...


Цитата:

Это тоже не самое главное.
Всё же главное - чтобы код работал.
Я не за быдлокод, но красота кода — это не главное. Хорошо когда красота кода вырабатывается автоматически, (часто приходит с опытом), но красота ради красоты - это излишнее.
я бы добавил еще, что код должен быть в первую очередь логичный, я например веду разделение на контролеры вьюверы и прочее, но в тот же момент мне обсалютно перпендикулярно на MVC, так и тут нужно писать хорошо, но разрывать мозг в сторону: там супер, тут this ... это наверно действительно нужно было начинать программировать с actionScript, я начал с ассма, мне реально это все не понять

PS я в перепалки вступать не хочу, я просто высказал свое мнение !

Котяра 03.10.2010 01:12

Короче. Хватит флудить - идите кодьте. Или программируйте. Как у кого получится.:drinks:

-De- 03.10.2010 02:21

Я таки +1 к zuxul к написанию нового метода, если надо "переопределить что-то для каких то новых объектов и фишек". Не вижу, в чем разница, для всех старых писать super.method(), для новых писать method() или для старых писать method(), для новых newMethod(). Ну кроме того, что super не для таких штук делали. Или есть при каком-то хитром использовании разница?
PS: считаю, что код должен приносить наилучшую разницу в конечном итоге удовольствия и неудовольствия написавшему, а красота там или гламурность - это вторично =)

Котяра 03.10.2010 02:42

Бобры — правы.


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

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