【问题标题】:Domain Class vs Implementation Class领域类与实现类
【发布时间】:2019-01-04 21:23:19
【问题描述】:

我正在阅读一篇关于composition vs inheritance 的文章,该文章使用了术语“域类”和“实现类”。作者特别说“域类应该使用实现类,而不是从它们继承”。请解释一下领域类和实现类的区别。

【问题讨论】:

    标签: class oop inheritance composition


    【解决方案1】:

    文中给出的一个实现类的例子是ArrayList。它不是描述业务实体的代码的一部分,它只是一个常用的通用类。

    这与他们提到的 Customer 类形成对比。 Customer 将是属于域的一个类,它描述的是特定于业务的实体。

    这篇文章告诉您在创建域类时不要像这样从实用程序类进行扩展。

    如何滥用继承 - 示例 2

    通过从实现类继承来创建域概念类是一种常见的继承误用。例如,假设我们想对我们的特定客户群做某事。简单明了的做法是继承 ArrayList,将其命名为 CustomerGroup,然后开始编码,对吗?

    错了。那将是跨域继承关系,应该避免:

    1) ArrayList 已经是 list 的子类,一个实用程序集合 - 一个实现类。

    2) CustomerGroup 是另一个子类 - 域类。

    3) 域类应该使用实现类,而不是从它们继承。

    如果您需要实现 CustomerGroup 类,它可以将 ArrayList 作为实例成员,如下所示:

    public class CustomerGroup {
        private List<Customer> customers = new ArrayList<>();
    
        public List<Customer> getCustomers() {return customers;}
    } 
    

    但你不会让类本身成为 ArrayList 的子类。

    原因是当您将某些东西子类化时,即使不合适,您的类的用户也会获得超类的所有功能。您实际上不需要域类来查看它的实际效果,只需查看 java.util.Properties 的源代码,它的设计很糟糕,扩展了 java.util.Hashtable。当您使用 Properties 对象时,您可以使用 Hashtable 中的方法,即使它们完全不必要且令人困惑,并且使用超类方法不起作用或会导致问题。

    【讨论】:

    • 那么,是否有任何上下文可以将 ArrayList 类视为域类?就像每个班级都是一个或另一个,这永远不会根据上下文而改变?
    • @Adam:不是真的。这是关于实现问题与接口的关系。实际上,您甚至不需要考虑业务领域实体。查看 java.util.Properties 以了解文章所批评的错误设计决策。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多