2009-06-19 246 views
2

假設您有一個變量,稱爲hotelPropertyNumber。內容將始終是一個數字,但通常用作字符串。將它聲明爲一個字符串會有什麼「錯誤」,這樣你就不必將其不斷地轉換爲字符串....或者這是一種糟糕的編程習慣嗎?聲明變量

謝謝。

回答

6

數字是用於計數和測量的數學對象。如果您使用hotelPropertyNumber進行計數,即對其應用任何算術運算,則其,並且應該以數字類型存儲。

如果不是,那麼它是不是一個數字;它是一個字符串。

+0

從來沒有想過這樣接近它。該算術運算中永遠不會使用該變量。這實際上只是一家大型連鎖酒店用來區分其物業管理系統安裝的標識符。我已經看到並且聽到它把這兩個都稱爲「ID」和「號碼」。後者是什麼卡住,因爲這是我第一次聽到。無論如何,標識符是在我的應用程序中傳遞給某些WCF方法/​​函數的變量之一。 – Lenard 2009-06-20 02:12:11

3

始終以最簡單的形式存儲您的信息。在這種情況下,一個整數。必要時將其轉換爲字符串。幾乎所有的語言都使得這幾乎毫無痛苦,特別是對於一個字符串的整數。

一個很好的例子是StackOverflow Podcast #58,當時Jeff將標題的HTML存儲在數據庫中,而不僅僅是標題本身。當他想要稍後添加功能並在不需要HTML的地方顯示該標題時,這導致了很多問題。

ChrisW還提出了一個很好的觀點,即做到這一點斷言type safety。我認爲這很重要。

+2

有時候需要創建一個類似HotelPropertyNumber類的用戶自定義類型,只是爲了與其他字符串和數字區分開來,也許在構造函數中做一些語法驗證,並且幫助編寫代碼更多的自我記錄和類型安全等。 – ChrisW 2009-06-19 22:33:40

+0

@Chris:在任何情況下,類型安全都是一個大問題。偉大的建議。 – Eric 2009-06-19 22:37:05

+1

它也有助於使其具備面向未來的性能:因爲它實際上是作爲數字還是作爲字符串存儲成爲該類的私有實現細節。 – ChrisW 2009-06-19 22:43:13

0

不一定是錯的。但是你可能想考慮重命名變量來反映它是一個字符串。我不認爲有一個簡單的答案,你應該保留一個數字還是將它轉換爲一個字符串。這取決於實際情況。如果您選擇將其作爲整數存儲在您的應用程序中,並且必須在代碼中將其轉換爲1000次字符串,那麼一次可能需要將字符串轉換爲字符串。根據情況你必須考慮權衡。

0

我同意@Eric。你會發現,如果你將它聲明爲字符串,你會犯錯誤或者解析爲int,或者將它強制爲int。只需使用int。

2

這取決於你想要對他們做什麼。

你可能永遠不會對它們執行算術,但是如何排序呢?整數將以不同於字符串的方式進行排序。你想讓他們成爲1,10,2等?如果不是,則使用整數或特殊排序方法。

另一方面,使用字符串將允許以後使用更多類型的「數字」。例如,「10090A」。整數不會出現溢出問題。

+1

排序是一個很好的整數的親,而領先-0的問題是一個很好的字符串親.. – 2009-06-20 00:01:51

0

我不同意Eric。

開發中沒有「總是」規則。

如果您主要將此變量用作字符串,那麼將它作爲字符串存儲並從變量名稱中丟失「數字」會更有意義。

如果你對這個變量進行了更多的數字操作,那麼它就是一個數字,並且應該作爲一個數值存儲,並且將一個字符串轉換爲一個字符串。

+0

我認爲總是以最簡單的形式存儲的東西是最有意義的,我不認爲這是不好的建議。恕我直言,犧牲未來發展的靈活性讓一點點便利讓步,這是一個不必要的複雜層面。通過採取這樣的捷徑,我被燒得太多了,因此我不能推薦偷工減料。 – Eric 2009-06-19 22:36:21

+0

最簡單取決於使用情況。我的反對意見是語義的。說你應該「總是」在軟件開發中這樣做是一個紅旗。爲什麼你應該總是將一個數值存儲爲一個整數?如果它只被用作字符串,爲什麼不斷支付CPU開銷以轉換爲字符串?這就是我不同意你的原因。 – Alan 2009-06-19 23:36:55

0

將名稱更改爲hotelPropertyIdentifier會有意義嗎?這可能會避免撥打某個號碼的所有內涵。

6

在一些語言中,你可以創建一個用戶定義的類型,比如「class HotelPropertyNumber」,其中:

  • 支持正是你需要
  • 可以在內部存儲數據作爲一個字符串的方法
  • 燦驗證(在其構造函數中)其值具有類似數字的語法
  • 不能與其他不是HotelPropertyNumber實例的數字和/或字符串類型實例混淆。
0

您可以隨時創建一個公共的「HotelPropertyNumber()」函數,它將字符串作爲字符串返回,但int仍然保留在下方。

如果您決定確實不需要覆蓋範圍內的int,HotelPropertyNumber()可以返回私有字符串。

-1

這不是不好習慣本身,但它可能會導致後來的麻煩。

現在從個人經驗說起:我曾經是一個存儲數字值的大愛好者,這些數值總是用作字符串變量中的字符串。我的意思是,爲什麼不,對吧?節省你所有那些繁瑣的鑄造和任何事情,你可以繼續解決問題的真正內容。 (當然,這決定了午餐的內容。)

然後,我花了一天的好時間試圖弄清楚爲什麼現場系統會拋出各種瘋狂的例外。結果發現我在數據中看到的「1」實際上是一個小寫的「l」。

然後,正如他們所說,我開悟了。當然,這可以根據你使用的語言而改變。在Java這樣的東西中,幾行類定義可以解決所有這些問題,在Python或Perl中,這個問題甚至不意味着什麼 - 語言只是「正確」。好吧,對於「右」的一些定義,無論如何。)

2

伊戈爾Krovokon已經說過了,但我想詳細闡述一下。

您爲什麼認爲酒店號碼的內容是數字? 「12」不是一個數字。它是一個包含幾位數字的字符串。你不能拿153號房間的平方根,但你可以用號碼153做到這一點。

酒店房間號碼不是表示作爲一個數字。一個數字是一個數學概念,可以用許多不同的方式用文本表示。 14可以寫成XIV羅馬數字,「十四」或十六進制0xfe,或二進制11111110。但是,如果你要求「房間一一一一」,酒店工作人員很可能會給你一個非常奇怪的外觀。

酒店房間號碼不是數學數字,所以它們不應該被表示爲整數。

他們是字符串嗎?是的,或多或少,但他們確實有一些額外的限制,正如你注意到的那樣。

不是每個字符串都是有效的酒店號碼。 「14」很好,但「西瓜」不是。

所以理想情況下,它應該被表示爲包裝字符串的抽象數據類型,並確保字符串中不存在非數字。

實際上,如果您採用簡單的方法,並且將房間號碼錶示爲整數或字符串,那麼當然,您不太可能遇到許多問題。但最好的設計將確保房間號碼的行爲與房間號碼一樣。字符串或整數都不會這樣做。

0

永遠不要說永遠。它可能並不總是用數字表示。例如,14可以細分爲14a和14b。或者21和22可以合併成21-22。這比用它們做算術更有可能。

看看街道地址,這通常是以數字爲目的而開始的。 (很接近的比喻,也是。)