![]() |
Использование super
С точки зрение тру-флешеризма нужно писать
Код AS3:
Интересует 2 вещи: 1) А если у меня цепочка: Class1 extends Class2 extends Class3 чтобы в Class1 вызвать методы Class3 по логике super`а нужно писать super.super.method3(), только вот так нельзя - ругается. Тогда пишем как - super.method3() или даже просто method3()? 2) Ситуация: Код AS3:
|
1) Вызываем method3 класса Class2, который в свою очередь вызывает method3 у Class3. Всё через super.
2) Если оно асинхронное, то нафига что-то втыкать до вызова супер-конструктора? |
Вообще, в конструкторе лучше либо ничего не писать, либо самый минимум. Конструктор - это самая медленная функция в классе изза того, что каждый раз она по-новому прочитывается (остальные функции раз скомпилировали JIT'oм и используем готовые). Да и ограничения на порядок вызова тоже не самое лучшее - вобщем, если в конструкторе нужна какая-то логика, легче ее всю завернуть в отдельную функцию и вызвать из конструктора чем потом сталкиваться с подобного рода проблемами.
|
Цитата:
Я так понимаю что просто если метод в этом классе, то this.thisClassMethod(), а если в суперклассе или "выше" - то super.mySuperClassMethod()? Уже кстати понимаю сторонников писать this везде, где нужно) Кстати, про this - я пишу this.myMethod() или this.myPole - если это члены класса, а если это локальные переменные в методе писать this не нужно, верно? Цитата:
|
super в методах нужно писать там где необходимо, имхо. Так же как и this. В конструкторе всегда.
Цитата:
Цитата:
Никогда не понимал сторонников загромождения своего кода различными ненужностями, которые якобы улучшают читаемость и понятность. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Просто забавно, что код "идеологически" неверный работает, а идилогически верный - нет :( Дак что с методами суперкласса суперкласса? Просто super.myMethod() ? |
Цитата:
|
Кстати, в коде далеко не глупых ребят всё чаще встречаю
Код AS3:
Сам я с некоторых пор этой темы пишу Код AS3:
Как правильно? Ещё заметил, что mxmlc не хочет компилировать конструкцию Код AS3:
Код AS3:
|
super для методов а не свойств.
|
Цитата:
|
Про баг понял, из за него буду писать просто x+= :(
То есть, чтобы уж точно - по второму кругу - ВСЕ свойства, сеттеры, геттеры и методы, определенные в базовом классе и выше должны вызываться через super, и по сути this.addEventListener без переопределения этого метода писать неправильно с точки зрения сверх-грамотного флешеризма? |
Цитата:
Код AS3:
Добавлено через 3 минуты являясь (круто, три буквы "я"!) автором класса, вы вправе переопределять методы надкласса(ов). Употреблять super для меня не столько модно, сколько для понимания исходного кода, что этот метод точно вызывается у суперклассов. |
Цитата:
Код AS3:
|
Ребят, а если не сложно, расскажите мне пожалуйста на пальцах, для чего, и как используется super(); :)
|
Присоединяюсь к вопросу джонатана.
Я так понимаю, что если нам явно не нужно вызвать метод суперкласса, то мы просто страхуемся, что, как написал Psycho Tiger, "true"? |
Ага, типа того.
Я уже понимаю людей кто явно пишет this и super. Код без super`ов для меня с некоторых пор стал читаться хуже... Но я ни в коем случае не агитирую писать его везде где только можно ) Это дело вкуса. |
в том то и дело, что не совсем вкуса..супер - явный признак вызова родительского метода.
т.е. к примеру если мы разбираем класс, где много много букаф и видим конструкцию super.someMetod() мы не лазием по тыще строк в поисках его (его может и не быть в этом классе), а смотрим экстенд и смотрим метод в родителе. я к чему - проще для восприятия и работы с кодом в целом. это навскидку) |
Возможно super() может быть полезен, если мы хотим выполнить какой-то дополнительный код до вызова конструктора расширяемого класса.
Насчёт использования super для вызова методов присоединяюсь к мнению тех, кто считает, что это использование оправдано только в соответствующем перезаписываемом методе, т.е. Код AS3:
Добавлено через 3 минуты И ещё при глубокой вложенности классов super совсем не помогает найти метод. |
не знаю - я не использую супер везде.
Не вижу смысла. Только проблемы. А если мне нужно вызвать допустим есть Цитата:
фанатизм не нужен. если ты уверен что нужно вызывать ТОЛЬКО метод родителя тогда супер, а если надо/есть возможность переопределить - то не стоит - писанием кругом super мы нарушаем полиморфизм - не даёт потомкам нормально мутировать. |
2 cleptoman:
Цитата:
2 etc: Цитата:
По поводу использования super везде, моё мнение схоже с Котяра. Хотя, опять же, это, наверно, дело вкуса, кому-то, может быть, удобнее писать super везде. Если такие есть, то мне интересно, пишете ли вы super.addChild, или super.graphics, или super.mouseX или super.contains? |
Это случай на миллион, когда вдруг внезапно потребовалось что-то изменить, да так, чтобы у всех. Случай на 10 тысяч это когда конкретному блоку кода нужно вдруг другое поведение, а не всем в целом - тут уже переопределяем метод и не парим голову по поводу того, что в 40 местах это поведение вдруг изменилось.
В моей практике как-то так. Миллион бывает реже, поэтому я пишу super. А учитывая что мне с ним когда читать легче - мой выбор очевиден. А начиналось с моды..) Кошмарик, да. Я даже super.stage пишу )) |
Цитата:
Цитата:
|
Цитата:
super, this - это же идентификаторы области видимости в классе и только... Представляю, во что бы превратился код на с++ (там используется конструкция "ИмяКласса::" либо просто "::") если для "понятливости" везде писали эти конструкции... Цитата:
|
Если логика не меняется - и переопределять не надо.
|
Лишние буквы — плохо!
Код AS3:
Код AS3:
Я и this не пишу без явной надобности.. f4 спасает, хотя при использовании интерфейсов/базовых классов — ничего не спасает :( UPD и честно говоря, меня мало волнует - пишут super/this или нет, главное чтоб код был понятен и нормально организован, и хотя бы в основном соблюдал конвенции, а эти мелочи — дело десятое. |
Если вы всюду пишете super, то это значит, что вы хотите, чтоб по умолчанию вызывался метод старшего в иерархии класса, даже если этот метод переопределён. Т.е. чтоб был не super, а notSuper, а поведение с super было по умолчанию. Но это бред и такого нет ни в одном языке, ибо полиморфизм и инкапсуляция.
super означает, что по каким-то очень специальным причинам вызывается не переопределённый в классе метод, а метод родителя. И пока этот метод не переопределён, то нечего писать супер, т.к. методы вообще переопределяются (а не пишутся другие) для того, чтоб их переопределённые вызывали. this означает, что дёргается не локальная/глобальная переменная/функция, а именно поле/метод этого класса (и значит, похоже, тут есть локальная переменная с таким же именем и надо быть поосторожнее). |
@-De-
Отлично сказано! |
Зайдём с другой стороны.
Люди пишут this чтобы сразу отличать локальные переменные от полей. this.addChild я считаю безграмотным. Да, он доступен в этом скоупе. Но в this его никто не объявлял. |
Psycho Tiger, по-моему зло везде this лепить. Лучше уж тогда венгерская нотация - m перед всеми членами класса и всё видно и писать меньше. Там, где надо подчеркнуть, что это именно член класса - да (ну или просто без this работать не так будет). Но если опасаешься путаницы с локальными, то это по-моему повод на полсекунды задуматься, всё ли так в методе.
|
-De-, тут в другом дело. Обычно за первый час разработки у меня в проекте появляется около 20-30 классов (MVC addicted, чо)). Когда я пишу логику - мне очень важно сразу знать, куда я обращаюсь, пока не втянешься в архитектуру нового проекта, каждый раз новую (я под каждый проект делаю всё лучше и правильнее, спасибо etc, Котяре и всем остальным, кто разжевывает как правильно). В итоге "_", отсутствие "_" и super являются для меня неотъемлемыми помощниками. К тому же часто приходится переопределить что-то для каких то новых объектов и фишек - и я совсем не хочу, чтобы моё старое перестало работать.
В общем, я думаю это просто дело вкуса. Я например вот текилой проникнуться никак не могу) |
Цитата:
Код AS3:
Цитата:
|
Да это-то понятно )
Я думаю, тут придти к согласию нельзя. Соглашусь лишь с тем, что самое главное чтобы код был читабельный и красивый, а super и this там, где можно без них - лишь стиль. |
Цитата:
Всё же главное - чтобы код работал. Я не за быдлокод, но красота кода — это не главное. Хорошо когда красота кода вырабатывается автоматически, (часто приходит с опытом), но красота ради красоты - это излишнее. |
Красота ради красоты называется рефакторинг )
Мне доводилось видеть разный код, часто просят поправить баги/доработать. В проекте одном было 20 классов. 19 из них по 300-400 байт, один в 120 кб. В другом проекте - вложенность функций в методах (дада, я не оговорился, я о анонимных функциях, плодящихся в рантайме) достигала 3-4. В третьем мне вообще предоставили декомпилированный код. После таких и подобных ситуаций я пришел к выводу, что недостаточно одной лишь работоспособности кода: с кодом должно быть приятно работать. Ну, примерно из этих же соображений я за низкую связанность в коде - высокое сцепление, безусловно, необходимо, но в отдельных классах: приложение должно строится на модулях, которые знают друг о друге минимум. Может я не прав, но именно с таким кодом мне работать удобнее всего. |
молодец.
Цитата:
оттуда же (комменты статьи) в моём избранном: Цитата:
Цитата:
рефакторинг иногда помогает сделать красиво и методы рефакторинга часто похоже на " давай сделаем красиво", но это не главное в рефакторинге. Цели рефакторинга могут быть и абсолютно другими, вплоть до снижения читабельности== обструфакции кода) |
Цитата:
Хочется, пускай пишут ... Цитата:
PS я в перепалки вступать не хочу, я просто высказал свое мнение ! |
Короче. Хватит флудить - идите кодьте. Или программируйте. Как у кого получится.:drinks:
|
Я таки +1 к zuxul к написанию нового метода, если надо "переопределить что-то для каких то новых объектов и фишек". Не вижу, в чем разница, для всех старых писать super.method(), для новых писать method() или для старых писать method(), для новых newMethod(). Ну кроме того, что super не для таких штук делали. Или есть при каком-то хитром использовании разница?
PS: считаю, что код должен приносить наилучшую разницу в конечном итоге удовольствия и неудовольствия написавшему, а красота там или гламурность - это вторично =) |
Бобры — правы.
|
| Часовой пояс GMT +4, время: 15:57. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.