Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 您将如何改进这个简单的类,使其更松散地耦合?_Oop_Coupling - Fatal编程技术网

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方法接收到无效值时,正确的响应是什么?我有两个选择

  • 不要设置值并返回false
  • 仍然设置该值,但为对象设置错误属性。(因此,如果设置了User.Error,我就知道出了问题)
  • 我怀疑#1是最佳实践,因为这样可以确保任何对象属性的值始终有效。对吗?

    我会:

  • 通过依赖项注入打破与具体验证对象的耦合:定义抽象(纯虚拟)验证类,使具体验证类从中派生,并在用户类的构造函数中传递(“注入”)对抽象验证类的引用

    <>关于如何在C++中做这件事的原因和如何做的讨论,请参见C++关于Robert Martin的主题。
  • 与其返回false或静默设置某些属性,不如引发异常。这就是他们在那里的目的


  • 到目前为止,所有的提案似乎都是过火了,尤其是国际奥委会和AOP的提案

  • 用户
    类需要一个电子邮件地址,因此创建一个
    电子邮件地址
    类,并让
    用户
    类通过属性和/或其构造函数接受一个。验证可以简单到输入
    EmailAddress
    引用是否为空

  • EmailAddress
    类可以是一个简单但通常可重用的实现(请考虑将其基于RFC文档)。它应该是不可变的,并且应该在无效输入上从其构造函数引发异常

  • 理想情况下,
    EmailAddress
    类应该由
    EmailUserId
    类(基于RFC?)和
    InternetDomain
    类(基于RFC?)组成,因为电子邮件地址是一个复合数据结构。同样,这些类中的每一个都应该管理不可变的实例,并且应该在具有无效输入的构造上抛出异常

  • “验证”在我看来不是一个“东西”,而是一个通用的“动作”。因此,它适合作为方法而不是类。在这种情况下,我倾向于将这些类中的每个类中的验证实现为一个私有静态方法(
    valid(input)
    ),该方法从构造函数调用,使用Java或C等语言。通常,以问题的形式公开该功能会很有用(
    isValid(input)

    编辑:


    您是否建议我需要验证的每个不同的数据类型都应该有自己的类

    这是解决这个问题的一个可靠方法,通常被称为值类型(感谢提醒,Frank)。结果将是几个(十几个或两个)定义良好、可重用的类,比如
    电子邮件地址
    电话号码
    人名
    ,等等。提出的替代方案可能会导致“上帝类”混合了不可重用、不易测试和难以维护的功能


    还有其他方法来划分解决方案,但我的建议的优点是成熟、易于理解,并且与大量可靠的设计原则保持一致。我当然建议在尝试发明自己的产品之前先尝试一下。

    我不确定我是否理解。你是说用户应该扩展和抽象验证类吗?不——将具体的验证类分为接口(抽象类)和实现(具体类),并使用户类仅依赖于验证的接口,而不是实现。我并不是对每个类(LaJ2EE)都这样做,但解耦是#1用例。好了,我现在明白了。我一直这么做,只是不知道它的名字。也就是说,EmailAddresses是值类型。优秀的解决方案Rob。您是否建议我需要验证的每种不同的数据类型都应该有自己的类?所以我需要一个name类、address类、city类、zip类等等?我目前有一个验证类,包含许多方法(电子邮件、电话等)。你建议把每个方法分成自己的类?是的,我相信他是这么说的。为类似邮政编码的东西创建一个类似乎是错误的,但它只是将事物分解为表示单个概念的一部分。