代码之家  ›  专栏  ›  技术社区  ›  sma

模型对象应该有接口吗?

  •  11
  • sma  · 技术社区  · 14 年前

    我正在我的系统中创建域模型。在设计模型对象时,是否应该为每个实体对象创建接口?人们告诉我,我们的web层不应该关心实体的实现,我们应该能够交换实现,但我不确定这种情况是否会发生。

    例如,如果我们有一个维护学生列表的教师类,getstudents方法可以是:

    public List<Student> getStudents() {
          return this.students;
    }
    

    或者:

    public List<Student> getStudents() { 
         return someExternalService.retrieveStudents();
    }
    

    我明白这个好处,但一般的做法是什么?

    6 回复  |  直到 13 年前
        1
  •  8
  •   R. Martinho Fernandes    14 年前

    除非你有充分的理由认为你需要把模型换掉,否则我现在还不担心。基于雅格尼原理( You ain't gonna need it )

        2
  •  2
  •   Roman    14 年前

    我所见过或参与过的项目都没有域实体的接口。

    但在我的一个项目中我有接口 NamedEntity :

    public interface NamedEntity {
       int getId ();
       String getName ();
    }
    

    所有域实体都实现了此接口。它给了我一种可能性,不是为不同的实体创建不同的jsf转换器,而是创建一个使用这个接口而不是具体的域类的转换器。

        3
  •  1
  •   Noel Ang    14 年前

    我不能和一般的实践对话,但这并不仅仅是为了隐藏实现。

    它是关于将接口形式化作为文档和合同的基础。

    在将模型抽象到接口中时,您正在为服务客户机开发人员创建文档。根据您的开发风格,您可能已经或可能还没有对服务的正式描述(例如,基于wsdl的描述)。接口可以满足这种需求。

        4
  •  1
  •   Fazal    14 年前

    我认为拥有服务接口来检索对象和模型对象本身之间有一个重要的区别。

    在运行时,加载模型对象的服务可能因请求数据的位置而异。但是不管您如何创建此对象,预期的数据对象的格式和类型都不会更改。因此,携带状态的模型对象不需要接口,但是创建和加载这些模型对象的服务类需要接口。

    如果模型对象不仅仅是一个简单的bean类型的对象,而且还公开了某种行为,那么模型对象拥有接口的唯一原因是有意义的。

        5
  •  0
  •   KarstenF    14 年前

    我的普遍看法是 为域模型创建一对一的接口集,因为这只会复制域模型的类结构。它没有添加任何有用的东西。

    我能马上想到的两个案子 考虑引入接口是:

    1. 接口描述域模型中某些类集合的契约/行为,在该模型中,独立于实现它的类对该行为建模是有用的
    2. 您需要将域模型公开给外部客户端,并希望对它们隐藏实现详细信息

    换句话说,如果接口帮助您描述行为或帮助您向客户端隐藏实现详细信息,则添加它们。其他的原因可能是有道理的,但这是两个想到的。

        6
  •  0
  •   walnutmon    13 年前

    提取接口是最简单的重构之一;最糟糕的情况是,它是一个类重新命名->移动方法。一旦你找到了改变主意的理由,改变主意的努力就很小了。我一直发现,如果一个决定很容易改变,它会加强雅格尼和亲吻甚至更多。相反的论点是,最初创建一个接口并不需要太多的努力,这是真的,但是随着时间的推移,如果这个决定做了很多次,那么维护的工作量就会增加——通常是不用的。