2010-11-25 171 views
0

我一直在研究一些面向對象的概念,如設計模式,乾淨的代碼和一些其他的東西,我仍然有一些關於如何進行的懷疑。例如,讓我們看看我的例子。需要類建模幫助

我有一個Person類是一個模型。我想爲某人添加一些驗證,例如檢查年齡是否與出生日期相符,並檢查名稱是否包含有效字符。

我有兩種方法,但我不知道我應該使用哪一種。

方法之一: 我創建一個名爲新類:

class ValidatePerson {} 

和班級已方法:「validateAge()」和「validateName()」和每一個vallidation,我需要,我將有實施一種新方法。

方法有兩個: 我創建了一個叫做抽象類: ValidatePerson {},將有一些commum方法,所有的驗證和我將有:

class ValidatePersonAge extends ValidatePerson { validate();} 
class ValidatePersonName extends ValidatePerson {validate();} 

我想選擇的方法有兩個,原因我將不得不添加的每個新的驗證規則都將是一個新類,並且不會影響其他類。就像,如果我需要改變新規則需要的commum方法,我可以覆蓋它。在第一種方法中,我將不得不添加另一種方法,然後創建另一種方法或改變已經爲其他方法工作的方法,這可能會導致崩潰。

事情是這樣一種混淆所有這一切,因爲即時通訊編程新,我想看到一些幫助和解釋。我也讀過類應該關閉更改,但打開擴展(或類似的東西)。

+0

目前還不清楚你在這裏問什麼。你在尋找什麼樣的幫助? – Oded 2010-11-25 19:08:02

回答

1

沒有特定的正確答案。設計應始終在您的問題領域和業務環境中。因此,這裏有各種選項

選項1 Person類有,你可以打電話的當前狀態履行他驗證一個vailidate()方法。

優點

  • 更好的封裝
  • 改變定位於1單級設置的所有屬性

缺點

  • 人可能是以後進行
  • 驗證處於無效狀態b安伏的validate()方法被調用,因此沒有失敗的快速
  • 不能有不同的驗證規則不同的上下文

選項2 每個屬性在Person類自身的validateXXX()方法。每個setXXX()方法都將調用相應的validateXXX()方法。

優點

  • 更好的封裝
  • 改變定位於1個單班
  • 快速失敗行爲即Person對象絕不會是一個無效狀態

缺點

  • 可能是矯枉過正的基礎上下文
  • d不能有不同的驗證規則不同的上下文

選項3 你可以有包含這些驗證檢查一個PersonBuilder。構建器將在構建Person對象之前執行這些驗證。這種方式一旦建立了Person對象,它就滿足了所有的驗證和不變量。

優點

  • 你外在的驗證到建築商類,因此你可以有不同的上下文
  • Construnction邏輯從
  • Person類可以製成不可變的域對象分開不同的驗證規則一旦構建

缺點

  • 可能是一個矯枉過正在某些情況下

你的選項2是不正確的,因爲ValidatePersonAge不完全一樣的ValidatePerson。你不是完全驗證這個人,而只是驗證他的年齡。所以它們在語義上是不同的。