Применяется ли принцип кода для интерфейса к классам сущностей?

Я пытаюсь следовать коду в интерфейсе проекта. Должен ли я сначала создать интерфейс, а затем реализовать этот интерфейс для классов сущностей? Я думаю, что это может быть слишком далеко за интерфейсом, и сущности следует игнорировать. Это то, что я имею в виду...

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);
  }
}
12.12.2008 16:35:35
5 ОТВЕТОВ
РЕШЕНИЕ

Я думаю, что создание интерфейсов для сущностей, вероятно, не является необходимым.

Цель создания Интерфейсов (или, по крайней мере, одна из целей) состоит в том, чтобы облегчить замену одной конкретной реализации на другую. Это, очевидно, хорошо для ваших DAO, Business Logic и т. Д.

Но если у вас нет планов по изменению реализации ваших сущностей, я бы этого не допустил!

4
12.12.2008 16:39:28
Это также значительно усложняет создание нового адреса, поскольку теперь вам требуется фабрика, чтобы скрыть реализацию.
Robin 12.12.2008 18:56:23

В вашем примере вы, вероятно, зашли слишком далеко, но как только вы добавите методы, напишите тестовые примеры и, возможно, будете использовать внедрение зависимостей, это будет иметь больше смысла.

Для таких простых проектов, как этот, это излишне, но как только вы попадаете в «реальное» приложение, тогда это часто хорошая идея. Только будьте осторожны, чтобы не переусердствовать, все не требует реализации интерфейса, только там, где это имеет смысл.

3
12.12.2008 16:40:29

Я думаю, когда вы говорите о сущностях, это, вероятно, излишне.

Интерфейсы полезны, когда вы работаете с сущностями, которые обычно используются, но не обязательно совпадают. Не могу придумать хороший способ объяснить это, но вот пример:

interface IFlaggable {
  bool IsFlagged ...
  string Reason ...
}

class ForumPost implements IFlaggable { }

class PrivateMessage implements IFlaggable { }

Надеюсь, это поможет!

1
12.12.2008 16:47:53

Обычно я не делаю интерфейсы для bean-компонентов, содержащих данные, то есть я не делаю интерфейсы для классов со значениями примитивных типов и методов получения / установки для них. На самом деле я никогда не сталкивался с моментом, когда мне понадобились бы интерфейсы для всего, для чего я их обычно использую (в основном, для полиморфизма и насмешек), поэтому я не потрудился сделать это.

Думаю, я должен отметить, что в большинстве случаев, когда я использую средства данных, я также отражаю значения тех же объектов с помощью пользовательских классов, которые работают следующим образом:

Reflector r = new Reflector(new DataBean( [ values given through constructor ] ));
long someNumber = r.get("method", Long.class);
0
12.12.2008 16:53:06

интерфейс для сущностей должен быть поведением и свойствами, общими для всех сущностей!

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

извините за пример C #, но язык не имеет значения. Интерфейсы предназначены для «совместимости плагинов».

3
12.12.2008 16:55:06