Полезно ли использовать доменные объекты в качестве ключей? - PullRequest
17 голосов
/ 21 июня 2010

Является ли хорошей практикой использование доменных объектов в качестве ключей для карт (или методов "get") или лучше просто использовать идентификатор объекта домена?

Проще объяснить на примере. Допустим, у меня есть класс Person, класс Club и класс Membership (который связывает два других). То есть.,

public class Person {
    private int id; // primary key
    private String name;
}

public class Club {
    private String name; // primary key
}

public class Membership {
    private Person person;
    private Club club;
    private Date expires;
}

Или что-то в этом роде. Теперь я хочу добавить метод getMembership в Club. Вопрос в том, должен ли этот метод принимать объект Person:

public Membership getMembership(Person person);

или идентификатор лица:

public Membership getMembership(int personId);

Какой самый идиоматичный, какой самый удобный, какой самый подходящий?

Редактировать: Много очень хороших ответов. Я пошел с тем, чтобы не раскрывать идентификатор, потому что экземпляры "Person" (как вы, возможно, поняли, мой настоящий домен не имеет никакого отношения к людям и клубам ...) легко доступны, но сейчас они хранятся внутри HashMap хэшируется на id - но по крайней мере я правильно выставляю его в интерфейсе.

Ответы [ 13 ]

0 голосов
/ 22 июня 2010

Прежде всего, я бы поместил любой получатель такой природы в DAO (а не в модель). Тогда я бы использовал саму сущность в качестве параметра, и то, что происходит внутри метода, является деталью реализации.

0 голосов
/ 21 июня 2010

Если у вас уже есть объект, нет причин извлекать идентификатор, чтобы получить хеш-ключ.

Пока идентификаторы всегда уникальны, реализуйте hashCode () для возврата идентификатора, а также реализуйте equals ().

Шансы есть каждый раз, когда вам понадобится Членство, у вас уже будет Персона, поэтому он сохраняет код и путаницу позже.

0 голосов
/ 21 июня 2010

Я бы обычно придерживался меньше, это больше.Чем меньше информации требуется для вызова вашего метода, тем лучше.Если вы знаете идентификатор, требуйте только идентификатор.

Если хотите, предоставьте дополнительные перегрузки, которые принимают дополнительные параметры, такие как весь класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...