2011-10-11 49 views
2

如果我要創建一切類型,而不是使用字符串和原始類型,最大的缺點是什麼?創建所有類的最大缺點是什麼?而不是String name = person.getName()它會是Name name = person.getName();

通常,它看起來像:

String name = person.getName(); 
int age = person.getAge(); 

但現在「一切」是客觀,你很少處理字符串(除非你需要特定的字符串操作)。

Name name = person.getName(); 
Age age = person.getAge(); 

NameAge會(在這個例子中)簡單的容器類:

public class Name { 

    private final String name; 

    public Name(final String name) { 
     this.name = name; 
    } 

    @Overide 
    public String toString() { 
     return name; 
    } 

} 

然而,在未來,他們可以有更多更多的方法和驗證等

但底線是你基本上爲每件事物創造類型。

我知道這使得代碼更類型安全,但什麼是這種代碼約定的最大缺點?

+0

我認爲字符串和原語概括了希望實現的功能。製作任何類別的東西都會增加複雜性,因爲它取決於使用或實施它的人的視角。 – Amanpreet

回答

0
  • 這是不必要的冗長
  • 你可能會失去不變性(在這種情況下Name是不可改變的,但它更容易出錯)如果你需要更多的字段後,你可以輕鬆地添加他們

。儘可能簡化代碼。

1

唯一真正的缺點,這是使更多的代碼你寫的,你必須保持和測試更多的代碼。理論上這是一個好主意。這是導致問題的實際方面。

0

類爆炸將會使你的代碼難以遵循和理解。

當有人看到String name,他們知道目標是什麼,立即。所有java開發人員都知道String類。當有人看到Name name時,他們不知道Name類是什麼。它有什麼作用?它增加了什麼功能?

如果這個類只是擴展了Name而且什麼也沒有做,那麼開發人員在代碼上工作就毫無意義,浪費時間。如果這個類沒有做別的事情,那麼你當然需要讓這個類來獲得這個功能。

底線:如果你要添加額外的功能,創建自己的類。如果您只需要String中的功能,那麼只需使用String即可。如果您需要其他功能,您可以隨時創建Name並稍後重構。

+0

我永遠不會建議更改屬性的類型。這往往潛入各種小蟲子(反射,鑄造......) - 在那裏,修正了這個問題。它有一個未來重構的有效機會,這已經是一個很好的起點,已經有了一個專門的課程。關於你的第一個論點:你多長時間把一個新開發人員帶到一個項目中,以及需要多少時間才能掌握這樣一個簡單課程的功能?我認爲每個新開發人員只需簡短一眼,就是這樣。由於某些IDE將Javadoc顯示爲工具提示,因此甚至可能不需要打開該類。 – sfussenegger

+0

除非在整個項目中都這樣做,在這種情況下,每個新開發人員都會進行無數短的瀏覽。你必須設計假設新的開發者將進入該項目。業務需求需要人們改變重點。事情發生。如果在未來的重構中有一個有效的機會,那麼你現在就可以開始構建這個類的屬性,它不僅僅是一個包裝。另外,像Eclipse這樣的工具使得這種類型的重構變得很容易,而不會偷偷摸摸地看到所有類型的小錯誤。有時你必須改變一個屬性的類型。沒關係。 –

+0

它比替代方案更好。有一堆代碼用於未來代碼的代碼庫很混亂。在未來到達這裏之前需求發生變化時,佔位符將成爲障礙。現在簡單編碼並在功能清晰的將來進行修改會更好。 –

2

的代碼獲得更詳細的,而不是所有的庫處理同樣使用此模式。我試圖在Java代碼中取得平衡,我使用了相當多的原語和字符串,但一些數據類型(例如貨幣金額和社會安全號碼)獲得了他們自己的專用類。 SSN有其內部驗證規則。貨幣計算受益於明確控制四捨五入和防止以不同貨幣增加金額。

在比Java更冗長的語言中,我傾向於使用比Java中更多的這些專用類。

+0

+1進行貨幣計算。我看到一個應用程序將價格存儲爲長整型值,必須除以100.0並將其格式化到整個地方。 – sfussenegger

0

我不會推薦這個,因爲簡單的原因,如果你要與其他系統集成(例如在組織的不同部分或第三方供應商的Web服務,你最終不得不處理Strings和int的反正而且當你從其他系統獲取它們時,必須將對象名稱包含在Name對象中,並且當你想將它們發佈到其他系統時將它們打包,這樣你就不得不讓你的代碼變得更加複雜。

我會說保留它簡單和驗證可以很容易地使用bean驗證引入JSR-303

另外,如果您需要不同的驗證規則s在不同的物體上,例如組織名稱與人名不同,在知道它之前,如果要更改名稱,您將擁有整個類層次結構來處理這個問題,這將是一個重構的噩夢。

0

有些時候,我後悔沒有創建用簡單的字符串表示的對象的類(場地和巡迴演唱會是例子)。我做到了這一點,以遵循KISS principle爲什麼預計是一個非常簡單的應用程序

我不記得我曾經後悔在這種情況下創建一個類。當然還有更多的維護和鍋爐板。但是,從直覺的角度來看,如果你覺得它可以在未來得到回報(重構,甚至可能是性能),我會說去做。這是一項小型投資,可以幫助您避免重大麻煩。但儘量不要過頭。

相關問題