Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Указание типа возвращаемых данных у функций (http://www.flasher.ru/forum/showthread.php?t=171006)

Ookami 06.11.2011 18:19

Указание типа возвращаемых данных у функций
 
Компилятор постоянно выдает ворнинги о том, что у функции не указан тип возвращаемых данных, даже если функция ничего не возвращает, т.е. используется как процедура. Что лучше в данной ситуации - забить на ворнинги или всем таким функциям указать void?

Wolsh 06.11.2011 18:36

Я в шоке. Конечно указать void.

Ookami 06.11.2011 18:38

С точки зрения ресурсов, чем черевато неуказание типа данных?

etc 06.11.2011 18:51

Чревато тоннами ворнингов, как минимум. В последствии ещё и грязным кодом.

goodguy 06.11.2011 18:53

Непредсказуемым поведением. В ас3 всегда нужно типизировать методы, переменные и константы. Иначе можно наткнуться нато, что где-то будет не тот тип данных, который ожидался

Inet_PC 06.11.2011 18:55

Плюс ко всему, среди сотен одинаковых ворнингов о "void", можно пропустить другие ворнинги. Ворнинг для того и существует, чтобы на него обратили внимание и исправили.

Ookami 06.11.2011 18:56

Это понятно. Я имел ввиду использование памяти и процессора.

goodguy 06.11.2011 19:07

ничем не чревато в этом плане

Newred 06.11.2011 19:19

Один знакомый прогер, говорит что неуказание типа данных :void вынуждает флеш проводить проверку или эта функция что то возвращает... что теоретически способствует уменьшению скорости работы.

Ookami 06.11.2011 19:39

Newred, вот я примерно так же подумал - если тип не указан то наверное резервирует в памяти заведомо избыточный объем для хранения значения.

Ладно, всем спасибо, полазил по сайту адоба - прояснил некоторые моменты для себя.

strangedk 07.11.2011 02:50

Вы в Flash Builder видимо не работали) он критичен к многим warning.

Не хочу повторяться, но от себя - ставьте типы везде где это можно, И старайтесь как можно реже использовать тип :*

Ookami 07.11.2011 03:11

Да, не работал, только во Flash CS 5.5 и пару дней во Flash Develop. Типы проставил везде где можно, даже в счетчиках циклов ) А про тип :* вообще не знал... Теперь знаю но постараюсь им не пользоваться

goodguy 07.11.2011 09:03

Цитата:

А про тип :* вообще не знал... Теперь знаю но постараюсь им не пользоваться
Бывают случаи (хоть и редко), когда это необходимо.

Типизация так де дает возможность получать от IDE подсказки по коду. Если она знает какой это тип данных, то получает от него весь список публичных свойств

etc 07.11.2011 14:56

* тоже самое, что отсутствие типа.

goodguy 07.11.2011 14:58

но в счучае со звездочкой, компилятор не выдаст предупреждения

etc 07.11.2011 15:01

Ну да, за исключением этого.

gloomyBrain 07.11.2011 15:48

А в чем разница - указывать * или Object? Ведь по сути тип данных и не Object - это только undefined.

goodguy 07.11.2011 16:08

Разница в том, что если указать Object, то при вызове какого-то свойства (которого у Object нет), компилятор выдаст ошибку, а в случае со звездочкой, ему пофиг =)

etc 07.11.2011 16:19

Цитата:

Сообщение от goodguy (Сообщение 1044380)
Разница в том, что если указать Object, то при вызове какого-то свойства (которого у Object нет), компилятор выдаст ошибку, а в случае со звездочкой, ему пофиг =)

Неужели? Object динамический.

Inet_PC 07.11.2011 16:40

Я лично думал, что разница в этом:
Код AS3:

var s: * = getStuff();
var o: Object = getStuff();//вот тут не скомпилится
 
private function getStuff():void{}


goodguy 07.11.2011 16:41

Цитата:

Неужели? Object динамический.
Не спорю, но, вот тебе пример, когда со звездочкой все нормально сработает, а с Object нет (просто недавно столкнулся с этим, раньше тоже думал, что без разницы):
есть какой-либо интерфейс:
Код AS3:

package  
{
        public interface IDisposable {
                function dispose():void;
        }
 
}

класс, реализующий его

Код AS3:

package {
        import flash.display.Sprite;
        public class ToDispose extends Sprite implements IDisposable {
 
                public function ToDispose() {}
                public function dispose():void {
                        trace("disposal");
                }
        }
}

Ну и, собственно сам тест:
Код AS3:

package  
{
        import flash.display.Sprite;
 
        public class ObjectTest extends Sprite
        {
 
                public function ObjectTest() {
 
                        var someVal:Object = new ToDispose() as IDisposable;
                        someValue        = someVal;
 
                }
                public function set someValue(value:IDisposable):void {
                        value.dispose();
                }
        }
}

В этом случае компиляция завершается ошибкой
Код:

C:\Users\Konstantin\Flash\DifferentTests\src\ObjectTest.as(11): col: 16 Error: Implicit coercion of a value with static type Object to a possibly unrelated type IDisposable.
Меняем объект на звездочку, и все работает без проблем.
Код AS3:

package  
{
        import flash.display.Sprite;
 
        public class ObjectTest extends Sprite
        {
 
                public function ObjectTest() {
 
                        var someVal:* = new ToDispose() as IDisposable;
                        someValue        = someVal;
 
                }
                public function set someValue(value:IDisposable):void {
                        value.dispose();
                }
        }
}

C классами проблем нет, но интерфейсы - другой случай.

gloomyBrain 07.11.2011 16:44

Ну это круто конечно, только бессмысленно =)
В моем проекте я могу не знать что именно возвращает функция, но в том что она хоть что-то возвращает я не могу сомневаться. Так что сомнительная фича. Я всегда пишу Object.

@goodguy
Так ты тип поставь нормальный - IDisposable, и все заработает =)

Inet_PC 07.11.2011 16:44

Но похоже сильно разницы нет, и это всего лишь проверка при компилиции, ибо вот так работает:
Код AS3:

var o: Object = this['getStuff']();


goodguy 07.11.2011 16:50

Цитата:

Так что сомнительная фича. Я всегда пишу Object.
В бокс2д, userData имет тип данных *, и там никак объектом не заменишь.
Допустим у меня в игре есть несколько видов солдат, Rookie, Thug, Mercenary и т.д.
Все они, применяют интерфейс ISoldier, и при столкновениях UserData проверяется по интферфейсу объекта. Согласись, проверять каждый класс было бы глупо. Да и не известно, сколько я их еще захочу добавить.
Раз уж с объектом это работать не будет, остается только звездочка.
Так что фича не сомнительная, а довольно полезная.

etc 07.11.2011 16:53

goodguy, это вполне логичная ошибка приведения типов, а не вызова неопределенного метода/свойства. * по сути типа вообще никакого не имеет, поэтому и ошибки как бы нет.

goodguy 07.11.2011 17:04

О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)

etc 07.11.2011 17:17

Цитата:

Сообщение от goodguy (Сообщение 1044390)
О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)

Ну так выражайтесь, чтобы было правильно сходу.
Несмотря на подобные «фичи», их использование должно быть осознанным, а не ради подавления ворнингов и эксепшенов.

Wolsh 07.11.2011 18:40

Цитата:

var someVal:* = new ToDispose() as IDisposable;
А можно поинтересоваться, в чем задумка кастования в этой ситуации? Кто в трезвой памяти будет кастовать к одному типу для инициализации переменной другого типа или типа * ?

goodguy 07.11.2011 19:07

В скайпе уже объяснял народу =) Ну да ладно, объясню еще раз.
Такая ситуация:
бокс2д, там userData имеет тип данных *. У меня в тип данных, который может быть ей назначен, передается либо ISoldier, либо IMovable. Причем не известно когда и какой будет назначаться. Назначается он не напрямую, а через сеттер. В классах солдат сеттеры в качестве параметра имеют ISoldier, в транспортных средствах IMovable. Это нужно для проверки столкновений между разными объектами через b2ContactListener.
Так вот, если я назначу туда Object, вместо *, то все мои сеттеры будут дружно кидаться ошибками прведения к типу. Да и смысла назначать туда Object не вижу, так как все равно потом придется проверять ISoldier это или IMovable.
Так что звездочка здесь - самый удобный вариант (хоть и не утверждаю, что без нее обойтись нельзя).

Wolsh 07.11.2011 21:11

Все равно не понял, какое отношение это имеет к данному выражению. Ну пусть в сеттере (value:*). А кастинг-то тут каким боком? Такому сеттеру же совсем по-барабану, что в него передали, зачем ему кастинг?
Ну и, не могу промолчать, но почему же не сделать хотя бы маркерный интерфейс, реализуемый и солдатами и транспортом, какой-нибудь IForce, и спать ночью спокойно, не царапая программистскую совесть звездами?

goodguy 07.11.2011 21:30

Цитата:

Ну и, не могу промолчать, но почему же не сделать хотя бы маркерный интерфейс, реализуемый и солдатами и транспортом, какой-нибудь IForce, и спать ночью спокойно, не царапая программистскую совесть звездами?
И как же я в таком случае буду узнавать, столкнулся солдат с себеподобным, или же его задавил танк? ) Или он при хотьбе наткнулся на стоящий джип, например.
Этот вариант исключен.
Цитата:

Ну пусть в сеттере (value:*). А кастинг-то тут каким боком?
У меня в сеттере помимо простого назначения, еще и получаются разные свойства от передаваемого объекта, например тип солдата, в соответствии с которым ему задается максимальная скорость, выносливость, передается ссылка на массив "отряд" и т.д. Короче говоря, во-первых я не понимаю, чем вариант со звездочкой в сеттере лучше или красивее изначалного (со звездочкой в userData), а во-вторых, с ним мне все равно пришлось бы приводить к типу и делать те же проверки.

Мой вывод: звездочка полезна, и нужна.

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

dimarik 07.11.2011 21:42

Архитектуру пересмотреть не желаете? Пока не поздно...

Wolsh 07.11.2011 21:44

Может, Вы просто кода кусочек покажете, потому что я решительно не понимаю, о чем Вы. Когда Вам надо будет узнать, солдат это или танк, Вы как ни крутите, будете проверять тип. Что со звездочкой, что с IForce. Вот только "в звездочку" залезет любая зараза, а в IForce – только боевые силы.
Цитата:

я не понимаю, чем вариант со звездочкой в сеттере лучше
Надеюсь, это не ко мне? Потому что я вроде доказывал что от звездочек надо избавляться в пользу интерфейсов.
Ладно, ну объясните мне по существу, по конкретному вопросу: зачем ЭТО?
Цитата:

var someVal:* = new ToDispose() as IDisposable;
Что по-вашему здесь делает кастинг? Какова его ответственность? Какие изменения он инициирует? Что делает возможным, или какой оставляет след?

goodguy 07.11.2011 21:45

Цитата:

Архитектуру пересмотреть не желаете? Пока не поздно...
архитектуру чего? бокс2д? ) Это к Эрину Катто.
У меня в приложении архитектура нормальная.
Цитата:

Может, Вы просто кода кусочек покажете, потому что я решительно не понимаю, о чем Вы. Когда Вам надо будет узнать, солдат это или танк, Вы как ни крутите, будете проверять тип. Что со звездочкой, что с IForce. Вот только "в звездочку" залезет любая зараза, а в IForce – только боевые силы.
Не залезет туда ничего кроме IMovable и ISoldier. Кусочек кода показывать смысла не вижу, я же не вопросы тут задаю ) Меня в моем коде все устраивает. Работает отлично, написано все чисто и понятно.
Вместо IForce тут можно было бы и просто DisplayObject заюзать. Но не вижу необходимости.

Цитата:

Что по-вашему здесь делает кастинг? Какова его ответственность? Какие изменения он инициирует? Что делает возможным, или какой оставляет след?
Да это вообще простейший пример был. Какая разница что он тут делает? Это просто пример того, что Object не всегда можно использовать вместо *, и ничего более.

dimarik 07.11.2011 21:49

Цитата:

Сообщение от goodguy (Сообщение 1044451)
архитектуру чего? бокс2д? )

бокс 4Ы, естессна.

goodguy 07.11.2011 21:57

В общем ладно, хватит меня убеждать, что звездочка зло )
Ничего плохого в ней нет, если не злоупотреблять.

Вопрос то был в другом: Object == * ?
ответ: нет.

Wolsh 07.11.2011 22:21

Цитата:

Это просто пример того, что Object не всегда можно использовать вместо *
Это был пример того, что Object не реализует интерфейс IDisposable, а для звездочки никто этого не проверяет.
Цитата:

В этом случае компиляция завершается ошибкой ... C классами проблем нет, но интерфейсы - другой случай.
То есть вместо интерфейса нельзя подсунуть Обжект, а вместо любого класса – можно? Я сегодня спать спокойно точно не буду.
Код AS3:

private var _val:Sprite;
...
var s:Object = new Sprite(); // по желанию можно добавить as Sprite; или as Object;
this.val = s; // пытаемся выдать тип Object за Sprite, как когда-то за IDisposable
....
public function set val(value:Sprite):void
{
        _val = value;
}

Цитата:

Error: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:Sprite.
И получаем абсолютно ту же ошибку.

strangedk 07.11.2011 23:00

Цитата:

Сообщение от gloomyBrain (Сообщение 1044386)
В моем проекте я могу не знать что именно возвращает функция

Имхо, это крайне нежелательный случай, когда Вы не знаете какой тип возвращает функция.

Если вы знаете что она может вернуть несколько типов, лучше проверить их на выходе с помощью switch-is инструкций

Добавлено через 2 минуты
Цитата:

Сообщение от goodguy (Сообщение 1044455)
В общем ладно, хватит меня убеждать, что звездочка зло )
Ничего плохого в ней нет, если не злоупотреблять.

Звездочка - зло ))) я это отношу туда же, куда и обращение вида parent.parent.parent - вроде синтаксис позволяет, но использовать никому не порекомендую.

На вопрос Вы ответили верно, Object != *

goodguy 07.11.2011 23:28

Цитата:

И получаем абсолютно ту же ошибку.
Я и сам это знаю. Мог и не писать as IDisposable, ничего бы не изменилось
Цитата:

То есть вместо интерфейса нельзя подсунуть Обжект, а вместо любого класса – можно?
Что-то я не понял вопроса. Пора мне наверное спать идти уже ))
Цитата:

Звездочка - зло )))
Тут каждый решает для себя сам.

gloomyBrain 07.11.2011 23:41

Цитата:

Имхо, это крайне нежелательный случай, когда Вы не знаете какой тип возвращает функция.
Благодарю, Капитан! Имелось ввиду, что в рамках одного проекта вероятность возникновения ситуации, когда не известен тип возвращаемого, или вообще его наличие (единственное, где нам поможет *) стремится к 0.


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

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