我正在创建接口和抽象类,它们代表短消息,电子邮件,Twitter,xml等基于短文本的消息的消息传递框架。我想知道应该在哪里放置消息验证代码。
问题是我只编写超类和接口,所以我没有把实际的实现,我只是把钩子放在允许其他人验证消息的内容。我看待它的方式,我可以通过几种方式做到:
在抽象超类“Message”中,有一个抽象方法'isValid'。对此的一种变体是在调用Message构造函数时调用isValid,如果消息格式不正确则抛出MalformedMessageException。
在发送之前立即验证消息。我会有一个send(Message)方法,它在发送之前立即调用isValid(Message)方法。
有一个带有静态方法isValid(Message)的单例消息验证器,在某些时候被调用。
我确信还有其他选项我不知道。目前,我倾向于第一个,但我认为在域对象中应该有验证代码是不对的。
答案 0 :(得分:0)
消息是一回事。数据容器。
验证是一个单独的事物。验证与Message分开,因为验证依赖于非Message数据。验证包括一个或多个算法,用于确定是否可以从某些数据构建有效的消息。
您希望消息在有效时构建 。您希望消息的所有方法都需要并依赖于有效性。这让你很容易理解。
因此,Message不应包含任何验证逻辑。该逻辑仅存在于有效消息的边界之外。它是MessageFactory
或MessageValiadtor
的一部分,用于确定是否可以使用某些给定的数据池来构建有效的消息。
您有两件事:MessageValidator
(或MessageFactory
)和Message
。
消息中没有isValid
。它必须有效或不存在。
MessageValidator从源数据构建消息。如果无法构建消息则可以抛出异常。它还应该累积它找到的错误列表,以便可以查询它以确定各种问题是什么。
考虑可能的突变:Message的多个变体子类。 Validator可以标识特定的子类。无需更改应用程序即可实现此目的。
针对特殊情况,异常,扩展等的多个验证器。它只是MessageValidator的子类,具有相同的接口,所有验证器都具有并发出Message的实例(或其中一个子类。)
由于验证规则与有效消息分开,因此Validator也可以提供不同的假设默认值或派生数据。