Как мне моделировать ассоциации между классами - PullRequest
3 голосов
/ 10 марта 2010

Я моделирую модель предметной области в моем приложении. Очевидно, что некоторые из объектных отношений являются ассоциациями, но эти ассоциации также имеют атрибуты. Например:

Foo может иметь один-много баров. Однако ассоциация имеет атрибуты, например диапазон дат, в течение которого эта ассоциация действительна. Итак, способ, которым я это сделал, выглядит следующим образом:

public interface Association<S, T> {
     public S getSource();

     public T getTarget();
}

Тогда для чего-то подобного выше:

public class FooToBarAssociation implements Association<Foo, Bar> {
    public Foo getSource();
    public Bar getTarget();
    public Date getFromDate();
    public Date getToDate();
}

Тогда класс Foo имеет:

private List<FooToBarAssociation> associations;

Мои вопросы:

  1. Это подходящий способ моделирования ассоциации с атрибутами?

  2. Где должна быть бизнес-логика для добавления / удаления ассоциаций в Foo? Создание FooToBarAssociation иногда требует немного бизнес-логики, и мне интересно, должно ли это обрабатываться в FooService, который затем вызывает setAssociations, а не находится в объекте модели. Я всегда слышал, чтобы бизнес-логика как можно больше скрывалась от объектов модели.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2013

Ответы на ваши вопросы:

  1. Я думаю, что ваша модель подходит.
  2. В доменно-ориентированной модели я бы добавил логику ассоциации в Foo.

У меня есть другое предложение, но оно относится к конкретной ситуации. Если вам требуется, чтобы модель работала только с одной ассоциацией за раз, сработала бы следующая упрощенная модель.

public class Foo {

    private Date startDate;
    private Date endDate;
    private Bar bar;

    public Date getStartDate() {
        return startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public Bar getBar() {
        return bar;
    }


}

, где даты начала и окончания соответствуют периоду, для которого бар связан с Foo. Таким образом, несмотря на то, что Foo to Bar - один ко многим, вы будете работать только с одним Баром за раз. Ассоциация Foo Bar будет извлекаться из базы данных на основе даты вступления в силу, которая будет находиться между датами начала и окончания.

0 голосов
/ 10 марта 2010

ИМХО применяются те же правила, что и при реализации классов ассоциации в UML. То, что вы создали, это один способ, другой может быть вложенным - Foo содержит Assoc, который, в свою очередь, содержит Bar. Вы можете создать его также и в другом случае, если Bar содержит Assoc и Assoc содержит Foo. Foo может содержать Assoc, а Bar может содержать Assoc. Возможностей много, все зависит только от ваших требований. В вашем примере ваше решение выглядит хорошо. То, что вы слышали, кажется хорошим, но иногда это может быть сложно.

...