指定变量类型和返回函数类型是否有任何优势?

时间:2012-08-14 19:21:07

标签: actionscript-3 flash oop types

我总是设置变量和函数的类型,这是我从Java学习中带来的一种习惯,似乎是正确的做法。
但我总是在其他人的代码中看到“弱打字”,但我不能不同意这一点,因为我不知道保持所有强类型的真正优势是什么。

我认为我的问题很明确,但我会举一些例子:

var id = "Z226";

function changeId(newId){
    id = newId;
    return newId;
}

我的代码是这样的:

var id:String = "Z226";

function changeId(newId:String):String{
    id = newId;
    return newId;
}

4 个答案:

答案 0 :(得分:7)

是的,最大的优点是:

  1. 更快的代码执行,因为运行时知道类型,它不必评估调用
  2. 更好的工具支持:自动完成和代码提示将使用类型化参数和返回类型
  3. 更好的可读性

答案 1 :(得分:5)

您可以通过强类型获得性能优势。见http://gskinner.com/talks/quick/#45

我还发现强类型代码更易读,但我想根据他们可能不关心的人来说。

答案 2 :(得分:3)

正如florian所指出的,强类型的两个优点是开发工具可以使用这些信息来提供更好的代码提示和代码完成,以及该类型,作为变量或方法的明确指示使用,可以使代码更容易理解。

表现问题似乎有待辩论。但是,stackoverflow上的this answer表明,在某些基准测试中,typed肯定比无类型更快,但正如作者所述,并不是在正常条件下你会注意到它。

但是,我认为强类型的最大优点是,如果您尝试分配或返回错误类型的值,则会出现编译器错误。这有助于防止那种只能通过实际运行程序来追踪的有害虫。

考虑以下设想的示例,其中ActionScript在返回之前自动将结果转换为string。强烈键入方法的参数并返回将确保程序不会编译并发出警告。这可能会节省您数小时的调试时间。

function increment(value) {
    return value + 1;
}

trace(increment("1"));
// 11

答案 3 :(得分:1)

虽然关于代码提示和错误检查的其他答案中的要点是准确的,但我想解决有关性能的声明。这真的不是真的。理论上,强类型允许编译器生成更接近本机的代码。但是,对于当前的VM,这种优化不会发生。在这里和那里,AS3编译器将使用整数指令而不是浮点指令。否则,类型指示符在运行时没有太大影响。

例如,请考虑以下代码:

function hello():String {
    return "Hello";
}

var s:String = hello() + ' world';
trace(s);

以下是由此产生的AVM2操作码:

getlocal_0 
pushscope
getlocal_0 
getlocal_0 
callproperty 4 0 ; call hello()
pushstring 12    ; push ' world' onto stack
add              ; concatenate the two
initproperty 5   ; save it to var s
findpropstrict 7 ; look up trace
getlocal_0       ; push this onto stack
getproperty 5    ; look up var s 
callpropvoid 7 1 ; call trace
returnvoid 

现在,如果删除类型指示符,我会得到以下内容:

getlocal_0 
pushscope 
getlocal_0 
getlocal_0 
callproperty 3 0 
pushstring 11 
add 
initproperty 4 
findpropstrict 6 
getlocal_0 
getproperty 4 
callpropvoid 6 1 
returnvoid 

它完全相同,除了所有名称索引都少了一个,因为'String'不再出现在常量表中。

我并不是想阻止人们使用强力打字。人们不应该期待在表演方面出现奇迹。

编辑:如果有人有兴趣,我已将我的AS3字节码反汇编程序放到网上:

http://flaczki.net46.net/codedump/

我已经改进了它,现在它取消引用操作数。