2009-07-12 48 views
0

假設您有多種基於數字或基於整數的變量,您希望將其初始化爲某個默認值。但是使用0可能會有問題,因爲0是有意義的,可能會有副作用。數字的推薦初始化值

這是否有任何約定?

我一直在Actionscript最近工作,並有可選參數的各種值對象,所以對於我設置爲空的大多數變量,但對於數字或整數我不能使用null。一個例子:

package com.website.app.model.vo 
{ 
    public class MyValueObject 
    { 
     public function MyValueObject (
              _id:String=null, 
              _amount:Number=0, 
              _isPurchased:Boolean=false 
            ) 
     { // Constructor 
      if(_id != null)   this.id   = _id; 
      if(_amount != 0)   this.amount  = _amount; 
      if(_isPurchased != false) this.isPurchased = _isPurchased; 
     } 

     public var id:String; 
     public var amount:Number; 
     public var isPurchased:Boolean; 
    } 
} 

的困難在於,如果該值不是永遠從其初始值改變在上面的代碼中,使用0可能是有問題的。檢測變量是否有空值很容易。但是檢測0可能不是那麼容易,因爲0可能是一個合理的值。我想設置一個默認值,使參數可選,但我也想稍後在我的代碼中檢測值是否從其默認值更改而不難調試副作用。

我想我可以使用類似-1的值作爲值。我想知道這種事情是否有一些衆所周知的編碼慣例?我想這取決於變量和數據的性質。

這是我的第一個堆棧溢出問題。希望我的問題的主旨是有道理的。

回答

1

既然您在評論中提問,我會談一談C和C++。出於效率原因,默認情況下不會初始化局部變量和分配的內存。但調試版本通常會這樣做,以幫助捕獲錯誤。一個常用的值是0xcdcdcdcd,這是不太可能的。它具有較高的位集,並且是一個相當大的無符號或相當大的負號。作爲一個指針地址,它是奇怪的,如果用在除char之外的任何東西(但不在X86上),將導致對齊異常。它作爲一個32位浮點數沒有特別的意義,所以它不是一個完美的選擇。

偶爾您會在變量中看到部分對齊的值,例如0xcdcd0000或0x0000cdcd。這些可以被視爲至少可疑。

根據庫的分配區域,有時會使用不同的值。這給了你一個線索,可能來源於一個錯誤的值(即,它本身沒有被初始化,但是它是從一個單位化的值中複製的)。

無論您從內存中讀取的對齊方式如何,理想值都是無效的,並且對所有基元類型無效。它也應該對一個人產生懷疑,所以即使他們不知道他們可以懷疑某種東西是一隻腳的慣例。這就是爲什麼0xdeadbeef可以是一個不錯的選擇,因爲(十六進制查看)程序員將認識到這是一個人的工作,而不是隨機的機會。還要注意的是,它很奇怪,並且設置了高位,所以它有這樣做。

1

通常將值-1用作「超出範圍」或「無效」值來指示失敗或未初始化的數據。然後,如果-1是變量的語義上有效的值,或者您使用的是無符號類型,那麼它會繼續向下。

1

你似乎很喜歡null(並有一個很好的理由),那麼爲什麼不直接使用它呢?

+0

對於int或數字類型的參數,Actionscript不接受null。但在閱讀了這個問題: http://stackoverflow.com/questions/1003100/why-cant-typed-optional-arguments-have-a-default-of-null 它看起來像NaN的是等效的空值數字。所以我認爲這回答了我的問題。但我很好奇其他語言中的約定是否存在。 – 2009-07-12 10:59:36

3

許多調試器將使用0xdeadbeef來初始化寄存器。當我看到這些時,我總是會笑起來。

但是,在所有誠實中,您的問題都包含自己的答案 - 使用您的變量預計不會變成的值。它的價值無關緊要。

+0

0xdeadbeef,哈哈。有趣的,會留意那個。感謝您的迴應。這是我一直在尋找的東西。我同意使用非預期的數字是有道理的。 – 2009-07-12 11:11:49

1

在ActionScript中,您只能將Number.NaN分配給鍵入數字的變量,而不是int或uint。這就是說,因爲AS3不支持命名參數,所以你總是可以查看參數數組(它是所有函數都有的內置數組,除非你使用... rest結構)。如果該數組的長度小於數字參數的位置,則知道它未通過。

+0

有趣的一點是參數數組我會研究這個。聽起來很有用。謝謝你的提示。 – 2009-07-13 08:29:54

1

我經常爲此使用最大值。正如你所說,零通常是一個有效的價值。一般來說,max-int雖然在理論上有效,但可以安全排除。但不總是;小心。

1

我喜歡0xD15EA5ED,它類似於0xDEADBEEF,但通常在調試時更準確。