【问题标题】:Does the code-to-interface principle apply to entity classes?代码到接口原则是否适用于实体类?
【发布时间】:2008-12-12 16:35:35
【问题描述】:

我正在尝试在项目中遵循代码到接口。我应该先创建一个接口,然后再为实体类实现该接口吗?我认为这可能使接口优先方法走得太远了,应该忽略实体。这就是我的意思...

public interface Address {
  public String getStreet();
  public void setStreet(String street);
}

@Entity
public class AddressImpl implements Address {
  private String street;

  public String getStreet(){
    return this.street;
  }
  public void setStreet(String street){
    this.street = street;
  }
}

@Entity
public class OfficeImpl /* implements Office */ {
  private Address location;

  public Address getLocation(){
    return this.location;
  }
  public void setLocation(Address location){
    this.location = location;
  }
}

public class Driver {
  public static void main(String[] args) {
    Office work = new OfficeImpl();
    Address workAddress = new AddressImpl();
    workAddress.setStreet("Main St.");
    work.setLocation(workAddress);
  }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    我认为为实体创建接口可能没有必要。

    创建接口的目的(或至少是其中一个目的)是为了更容易将一种具体实现换成另一种。这对你的 DAO、业务逻辑等来说显然是一件好事。

    但除非您也计划更改实体的实施,否则我会避免这样做!

    【讨论】:

    • 这也使得简单地创建一个新地址变得更加困难,因为您现在需要一个工厂来隐藏实现。
    【解决方案2】:

    在您的示例中,您可能走得太远了,但是一旦您添加方法、编写测试用例并可能使用依赖注入,它就会更有意义。

    对于像这样的简单项目,这有点矫枉过正,但一旦你进入一个“真正的”应用程序,那么它通常是一个好主意。只是注意不要过度,一切都不需要实现接口,在有意义的地方。

    【讨论】:

      【解决方案3】:

      实体的接口应该是所有实体共有的行为和属性!

      public interface IEntity
      {
          int EntityId { get; set; }
          bool FindById(int id);
          bool Create(object [] values);
          bool Delete(int id);
          //etc.
      }
      

      对于 C# 示例很抱歉,但语言无关紧要。接口用于“插件兼容性”。

      【讨论】:

        【解决方案4】:

        我认为当您谈论实体时,它可能有点矫枉过正。

        当您使用具有共同用途但不一定相同的实体时,接口很有用。想不出什么好办法来解释,但举个例子:

        interface IFlaggable {
          bool IsFlagged ...
          string Reason ...
        }
        
        class ForumPost implements IFlaggable { }
        
        class PrivateMessage implements IFlaggable { }
        

        希望有帮助!

        【讨论】:

          【解决方案5】:

          我通常不会为数据保存 bean 制作接口,也就是说,我不会为具有原始类型值的类和它们的 getter/setter 制作接口。从来没有真正遇到过需要接口来处理我通常使用它们的任何东西(主要是多态性和模拟)的时刻,所以我没有费心去做。

          我想我应该指出,在大多数情况下,当我使用 databeans 时,我也会使用自定义类反映来自那些相同对象的值,这些自定义类的工作方式如下:

          Reflector r = new Reflector(new DataBean( [ values given through constructor ] ));
          long someNumber = r.get("method", Long.class);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-12
            • 1970-01-01
            • 2010-10-07
            • 1970-01-01
            • 2011-11-04
            • 1970-01-01
            相关资源
            最近更新 更多