2009-05-08 9 views
11

次のロジックを実装したいと思います。AS3:int、uintまたはNumberの "未定義"パラメータを宣言する

function setMyValue (myVar:int = undefined):void 
{ 
    if (myVar == undefined) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

したがって、値が指定されていればそれを使用してください。そうでない場合は、生成してください。シンプルだと思われる。

問題はAS3がこれを好まないということです。 'undefined'は強制的に '0'になるので、myVarは決して定義されません。 NaN、nullなどのバリエーションを試しましたが、何も効果がありませんでした。私がオフハイで考えることができる唯一のクルーギーは、デフォルトとして使うための「マジックナンバー」を供給することですが、それは醜いです。誰もがより良い解決策を知っていますか?

ありがとう!

+0

ああを使用していた、OK、数は若干異なっています。 NumberはデフォルトでNaNになるため、isNaN(myVar)を使用してインスタンスを処理できます。しかし、intとuintについては解決したいと思っています。 – Wikiup

答えて

14

UPD:確かにあなたがこのマジックナンバーは、いくつかの結果として表示されません完全に確認することができない限り、値が存在しないことを示すために、いくつかのマジックナンバーを選ぶことをお勧めではありません算術(これは一般的に真実です)。つまり、int(たとえばNumber)より広いタイプを使用するか、機能するためにフラグ(Booleanの値)とintを渡して、実際の値が存在しないことを示します。選択肢は、合格値が不可欠であるという事実の重要性を強調したいかどうかにかかっていなければなりません。あなたは引数の型を拡張すると快適に感じる場合


、あなたはNaNを使用して、これを行う必要があります。両方のより技術的に正確である

function setMyValue (myVar : Number = NaN) : void 
{ 
    if (isNaN(myVar)) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 

をし、それはまた、より安定しています。また、コンパイル時に強く入力することができ、Objectのように奇妙なバグは発生しません。

答えの1つが示すように、これはintとは機能しません。 intの数値がであり、NaNは0に強制されます。Numberタイプを使用する必要があります。

パフォーマンスが心配な人は、しないでください。 intまたはuintの代わりにNumberを使用すると、通常OKです。


UPD:あなたがしたい場合は、明示的にその引数がちょうど追加のフラグと正確な型を使用する整数であるべきマーク - それがより明確になります。

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void 
{ 
    if (isIntValueSupplied) 
    { 
     /* Generate or use a default value of intValue */ 
    } 
    else 
    { 
     /* Use the supplied value for intValue */ 
    } 
} 

別のオプションは、例えば、追加の値を使用して独自の型を定義することですMaybeInt。整数値とフラグ(実際に初期化されたかどうか)を保持します。そうすれば、その値が整数でなければならないことを明確に知らせることができます。no-value。しかし、このアプローチは少し大きめかもしれません。

+0

これは確かに近づいています。少なくとも、それはパラメータで来る数値です。 int/uint)ですが、それは私の懸念と同じような問題になります。間違ったデータ型に型キャストするのは本当にきれいですか?おそらく、私は真にクリーンな方法では行えないことを単に求めているだけかもしれません。ところで、これはパフォーマンス自体とは関係ありません。私はこの問題のベストプラクティスアプローチを確立しようとしています。助けてくれてありがとう! – Wikiup

+0

@Wikiup:値の不在を示すためにいくつかのマジックナンバーを選ぶのは、マジックナンバーがいくつかの算術演算の結果として現れないことを完全に確かめることができない限りは(一般的に真です)、確かに良い習慣ではありません。したがって、ここでの最良のアプローチは、 'int'(例えば' Number')よりも広い型を使用するか、関数にいくつかのフラグ( 'Boolean'値)を渡すか、' int'を渡して実際の値の欠如を示します。選択肢は、合格値が不可欠であるという事実の重要性を強調したいかどうかにかかっていなければなりません。 – dragonfly

+0

あなたのコメントは、元の回答よりもはるかに優れた「ベストプラクティス」の解決策を提供すると思います。私はマジックナンバーがめったに良いアイデアではないことに同意します(つまり、私のオリジナル投稿のポイントです)。関数setMyValue(useSuppliedValue:Boolean = false、suppliedValue:int = 0)は、wordierはあまりあいまいではないようですが、これはかなり固い答えとして私を襲う。あなたがあなたの答えを編集してそれを書くことを望むなら、私は喜んで「答え」をチェックして、あなたに代理人のポイントを与えます。 :c)多くのありがとう! – Wikiup

2

生成される値はconstですか?そうであれば、単にこれをデフォルト値にするのはなぜですか?

問題は、AS3ではこれが嫌いです。 'undefined'は強制的に '0'になるので、myVarは決して定義されません。

はい、これはintのデフォルト初期値(stringObjectためthis'd nullである)からです。

他のオプションが緩くObjectなどのパラメータを入力するか、(*を使用して)指定されていないそれを維持することであり、それは非nullあれば後でintにそれを型キャスト。 (私のコメントから)

function setMyValue (myVar:Object = null):void 
{ 
    if (myVar == null) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     int value = myVar as int; 
     /* Use the supplied value for myVar */ 
    } 
} 
+0

クイックレスポンスが面白いです。生成された値はconstではありません。メソッドの呼び出し時に生成する必要があります。私は私の質問は、魔法の数字を使用するよりもきれいにこのように緩いタイピングされるだろうと思いますか?あなたが示唆しているようにすれば、データをスクラブして、私が不正な値(文字列/数値/マイクロフォン)を渡していないことを保証する必要があります。少なくともマジックナンバーを使用すると、開発者は必要なデータ型を知ることができます。私はちょうどこれを行うためのよりクリーンな方法がなければならないと思うだろう。 – Wikiup

+0

私は「ロングダークティータイム」であなたを愛していました; c) – Wikiup

2

私のソリューションは、単にこの

if(myUint == new uint){ is undefined, act appropriately; } 
+0

問題は、(new uint == 0)がtrueに解決されることです。ですから、myUint == 0の場合は、実際にテストしています。 –

0
function setMyValue (myVar:int = -1):void 
{ 
    if (myVar == -1) 
    { 
     /* Generate a value for myVar */ 
    } 
    else 
    { 
     /* Use the supplied value for myVar */ 
    } 
} 
関連する問題