Oop 您将如何改进这个简单的类,使其更松散地耦合?
正如您在下面看到的,在构造函数中,我实例化了一个验证对象,这样我就可以用一套方法验证用户的电子邮件。这是架构最佳实践还是有缺陷?我可以避免让我的用户类直接依赖于我的验证类吗Oop 您将如何改进这个简单的类,使其更松散地耦合?,oop,coupling,Oop,Coupling,正如您在下面看到的,在构造函数中,我实例化了一个验证对象,这样我就可以用一套方法验证用户的电子邮件。这是架构最佳实践还是有缺陷?我可以避免让我的用户类直接依赖于我的验证类吗 Class User { Private Email //constructor User() { Validation = new Validation } SetEmail(NewValue) { if (Validation.isEmail(NewValue)) { Email = NewVal
Class User {
Private Email
//constructor
User() {
Validation = new Validation
}
SetEmail(NewValue) {
if (Validation.isEmail(NewValue)) {
Email = NewValue
}
}
还有一个相关的问题:当set方法接收到无效值时,正确的响应是什么?我有两个选择
到目前为止,所有的提案似乎都是过火了,尤其是国际奥委会和AOP的提案
用户
类需要一个电子邮件地址,因此创建一个电子邮件地址
类,并让用户
类通过属性和/或其构造函数接受一个。验证可以简单到输入EmailAddress
引用是否为空EmailAddress
类可以是一个简单但通常可重用的实现(请考虑将其基于RFC文档)。它应该是不可变的,并且应该在无效输入上从其构造函数引发异常EmailAddress
类应该由EmailUserId
类(基于RFC?)和InternetDomain
类(基于RFC?)组成,因为电子邮件地址是一个复合数据结构。同样,这些类中的每一个都应该管理不可变的实例,并且应该在具有无效输入的构造上抛出异常valid(input)
),该方法从构造函数调用,使用Java或C等语言。通常,以问题的形式公开该功能会很有用(isValid(input)
)
编辑:
您是否建议我需要验证的每个不同的数据类型都应该有自己的类 这是解决这个问题的一个可靠方法,通常被称为值类型(感谢提醒,Frank)。结果将是几个(十几个或两个)定义良好、可重用的类,比如
电子邮件地址
,电话号码
,人名
,等等。提出的替代方案可能会导致“上帝类”混合了不可重用、不易测试和难以维护的功能
还有其他方法来划分解决方案,但我的建议的优点是成熟、易于理解,并且与大量可靠的设计原则保持一致。我当然建议在尝试发明自己的产品之前先尝试一下。我不确定我是否理解。你是说用户应该扩展和抽象验证类吗?不——将具体的验证类分为接口(抽象类)和实现(具体类),并使用户类仅依赖于验证的接口,而不是实现。我并不是对每个类(LaJ2EE)都这样做,但解耦是#1用例。好了,我现在明白了。我一直这么做,只是不知道它的名字。也就是说,EmailAddresses是值类型。优秀的解决方案Rob。您是否建议我需要验证的每种不同的数据类型都应该有自己的类?所以我需要一个name类、address类、city类、zip类等等?我目前有一个验证类,包含许多方法(电子邮件、电话等)。你建议把每个方法分成自己的类?是的,我相信他是这么说的。为类似邮政编码的东西创建一个类似乎是错误的,但它只是将事物分解为表示单个概念的一部分。