2010-06-13 67 views
5

Stackoverflow用戶:許多事情可以通過使用基本類型在程序中表示,我們可以爲它創建一個新類。何時使用基本類型(Integer,String)以及何時寫一個新類?

示例:社會安全號碼可以是數字,字符串或其自己的對象。

(其他常見的例子:電話號碼,姓名,郵政編碼,用戶ID,訂單ID和其他ID的。)

我的問題是:什麼時候應該使用的基本類型,我們何時應該寫自己一個新班?

我看到,當您需要添加行爲時,您需要創建一個類(例如社會安全號碼解析,驗證,格式化等)。但這是唯一的標準嗎?

我遇到過很多情況下,這些事情都表示爲java整數和/或字符串。我們放棄了類型檢查的好處,並且我經常看到由於參數調用function(Intever, Integer, Integer, Integer)而導致的錯誤。

難道我們不能從function(OrderId, ExternalOrderId, UserId, SalesManId)中受益,而且從類型檢查中受益,即使這些都不能證明擁有自己的類別嗎?

顯然,答案是「這要看情況」。但是,你怎麼看,以及你通常做什麼?

+1

這裏有一個關於* How *如果/當你決定要替換原始類的想法的問題:http://stackoverflow.com/questions/24981278/design-patterns-for-type-safe-integers – Morad 2014-07-27 17:52:34

回答

2

要問的問題不是「我該如何存儲這些數據?」,而是「我該如何處理這些數據?」。

使用你的幾個例子: 一個SSN是數字,形式爲XXX-XX-XXXX。如果您要讀取用戶輸入的值,那麼您需要提供某種驗證以確保格式輸入正確。您可能還想提供一種方法來單獨輸入3個數字(例如表單上的3個文本框),但將它們內部連接到SSN。 單獨使用String類或Integer不會提供執行這些任務的方法,所以最好給它使用它自己的類型,並確保只能存儲有效值。該類型內部會有一個Int或String來實際保存數據,但封裝類可確保以有效方式讀取/寫入該值。

電話號碼,郵政編碼是其他領域,你可能需要一些驗證,所以它是明智的在那裏使用它們。

UserIds將取決於場景,但基本類型通常是足夠的。如果您需要將用戶id限制在某個數字範圍內(與任何基本Integer類型的範圍不同),則可以將其封裝到一個類中。

2

如果該實際生活對象存在多個常見屬性,並且您希望具有操作這些屬性的詳細方法,請使用類。如果只有一種類型的數據,並且不需要高級操作,則使用原語。

1

只要內置的類型對你正在使用它們的內容有意義,就沒有理由做出特殊的類。當不清楚變量中的數據實際上意味着什麼時,可以創建一個類來清除它。

像電話號碼這樣的值例如可以很好地用作字符串。它本質上是數字的,但是你不會對它進行任何計算,所以你對它做的任何驗證都不是對函數的關鍵,它只是爲了防止用戶輸入無意義的內容。

類似距離的值是一個類的候選人。您可以使用整數或雙精度來存儲距離,但是您必須添加更多信息才能使該值有意義,例如命名變量DistanceInMeters。您可以創建一個距離的類來限制它的使用,只提供一個FromMeters方法作爲構造函數,而只提供讀取值的屬性Meters。這樣很清楚價值的含義。

+0

不知何故,你的例子似乎與我的直覺是完全相反的,一個電話號碼應該是一個類,因爲它可能有很多不同的格式,我們不希望每個人都必須處理解析和檢查,當涉及到像距離這樣的變量時,我沒有看到需要將它變成自己的類,我通常在變量名稱中註明單位(例如'int commandTimeoutSec') – Morad 2014-07-27 17:40:02

+0

@MoradAbdelrahman:是的,可能是這樣的你想要實現它,但這與示例沒有什麼關係。它們只是一些能夠共鳴的例子,而這正是相關示例中的推理。 – Guffa 2014-07-27 17:55:50

1

這是一個權衡。基本類型很容易理解,而自定義類型應該首先被理解。它應該是您的項目域中被聲明爲自定義類型的主要實體之一。

一個標準是:如果它值得使用自定義類型,那麼已經有一個特定於域的等效術語。例如,在有乘客的情況下,我們稱之爲「開車的人」是運輸領域的「駕駛員」,而在醫療領域,所有司機和乘客都是人,而標準則是別的。

0

如果該字段總是與其他字段結合使用,則進行邏輯分組是合理的。這可以在那些一貫採用相同參數集的方法中看到。

將字段分組爲邏輯單元會將邏輯單元本身從邏輯單元的用戶中抽象出來。這意味着實現細節是隱藏的,可以改變數據的底層表示而不影響代碼的其他方面。

如果功能僅限於該領域,那麼我認爲它是一個類的候選人。另外,如果單元很簡單,但總是以相同的方式使用,我認爲將它變成一個類並將該功能放入類中。這意味着功能只保留在一個地方,所以更改該行爲更容易,而且您的代碼將包含更少的重複。

1

向多參數函數提供類型安全性是IMO確實值得它使一個沒有任何功能的類(假設您的代碼中有足夠的功能可以獲益)。

命名參數將是更容易的解決方案,儘管它們不幸在所有語言中都不可用。

+0

我問這個問題已經有一段時間了,但我得出了幾乎相同的結論。類型安全和避免混淆通常很值得引入一些新的(微小的)類。 – andrel 2014-07-27 18:04:04

相關問題