2010-03-11 204 views
1

我正在創建接口和抽象類,它們代表了SMS,email,twitter,xml等短文本消息的消息傳遞框架。我想知道應該在哪裏放置消息驗證代碼。我應該在哪裏放驗證碼?

事情是,我只寫超類和接口,所以我沒有把實際的實現,我只是把掛鉤,讓其他人來驗證消息的內容。我看到它的方式,我可以用幾種方法做到:

  • 在抽象超類「消息」中,有一個抽象方法'isValid'。對此的一個變體是在調用Message構造函數時調用isValid,如果消息格式不正確,則拋出MalformedMessageException。

  • 在傳輸層,在發送之前,驗證消息。我會有一個send(Message)方法,它在發送之前立即調用isValid(Message)方法。

  • 擁有一個帶有靜態方法isValid(Message)的單例消息驗證程序,該程序在某個點被調用。

我確定還有其他的選擇,我錯過了。目前,我傾向於第一個,但我覺得在應該是域對象的驗證代碼中感覺不對。

回答

0

消息是一回事。數據的容器。

驗證是單獨東西。驗證與消息分開,因爲驗證取決於非消息數據。驗證包括一個或多個算法,用於確定是否可以從某些數據構建有效的消息。

你想要建立郵件只有當他們有效。你希望消息的所有方法都要求並依賴於有效性。這給你容易理解的責任。

因此,消息不應包含任何驗證邏輯。這種邏輯只是在有效消息的邊界之外生存。它是MessageFactoryMessageValiadtor的一部分,它確定是否可以使用某些給定的數據水坑來構建有效的消息。

您有兩件事:MessageValidator(或MessageFactory)和Message

消息中沒有isValid。它必須是有效的或它不存在。

MessageValidator從源數據構建消息。如果無法建立消息,則可以拋出異常。它還應該積累它發現的錯誤列表,以便可以通過詢問來確定各種問題。

考慮可能的突變:Message的多個變體子類。驗證器可以識別特定的子類。實現這一點不需要應用程序更改。

針對特殊情況,異常,擴展等的多個驗證器。它只是MessageValidator的一個子類,它具有所有驗證器具有的相同接口,併發出消息實例(或它的一個子類。)

由於驗證規則與有效消息分開,驗證器也可以提供不同的假定默認值或派生數據。

+0

那麼你是否說我應該依靠這個框架的實現者在消息創建之前驗證消息?或者你是否說我應該在第一個選項上使用一些變體,將驗證代碼拉出,也許​​在MessagingService對象本身中? – DLaw

+0

在創建之前驗證。總是。消息對象必須是有效的;他們不能被問及他們是否有效。不應該存在,如果他們是無效的。 –

+0

你的編輯對我來說很有意義。謝謝! – DLaw