4

私はいつも変数と関数のタイプを設定します。これは、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

4 に答える 4

7

はい、大きな利点は次のとおりです。

  1. ランタイムはタイプを認識しているため、コードの実行が高速化され、呼び出しを評価する必要がなくなります。
  2. ツールのサポートの向上:オートコンプリートとコードヒントは、型付き引数と戻り型で機能します
  3. はるかに優れた読みやすさ
于 2012-08-14T19:25:38.677 に答える
5

強く型付けすることで、パフォーマンス上の利点が得られます。http://gskinner.com/talks/quick/#45を参照してください。

また、強く型付けされたコードの方がはるかに読みやすいと思いますが、人によっては気にしないかもしれません。

于 2012-08-14T19:27:00.590 に答える
3

florian が指摘したように、厳密な型指定の 2 つの利点は、開発ツールが情報を使用して、より優れたコードヒントとコード補完を提供できることと、その型を、変数またはメソッドがどのように使用されることを意図しているかの明示的な指標として使用できることです。 、コードを理解しやすくすることができます。

パフォーマンスの問題は議論の余地があるようです。ただし、 stackoverflow に関するこの回答は、特定のベンチマーク テストでは型付きの方が型なしよりも確実に高速であることを示唆していますが、著者が述べているように、通常の条件下で気付くほどではありません。

ただし、厳密な型指定の最大の利点は、間違った型の値を代入または返そうとするとコンパイラ エラーが発生することです。これにより、実際にプログラムを実行することによってのみ追跡できるような悪質なバグを防ぐことができます。

返さActionScriptれる前に結果を自動的に に変換する次の不自然な例を考えてみましょう。stringメソッドのパラメーターと戻り値を厳密に入力すると、プログラムがコンパイルされず、警告が発行されます。これにより、デバッグの時間を節約できる可能性があります。

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

trace(increment("1"));
// 11
于 2012-08-14T21:47:20.150 に答える
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' が定数テーブルに表示されなくなったため、すべての名前インデックスが 1 つ少ないことを除いて、まったく同じです。

私は、人々が強い型付けを採用するのを思いとどまらせようとしているわけではありません。パフォーマンスの面で奇跡を期待するべきではありません。

編集:誰かが興味を持っている場合に備えて、AS3 バイトコード逆アセンブラーをオンラインにしました:

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

オペランドを逆参照するように改善しました。

于 2012-08-15T00:03:40.567 に答える