Как Вы моделируете роли / отношения с Доменным Управляемым Дизайном в памяти?

Существуют библиотеки, подобные упомянутым, но для этого простого случая можно легко сделать, используя только java.util:

public class PersonsReader {
    public static void main(String[] args) throws IOException {
        String content = new String(Files.readAllBytes(Paths.get("inputFile.txt")));
        List<Person> persons = Arrays.stream(content.split("\n\n"))
                .map(PersonsReader::toPerson).collect(Collectors.toList());
        // use persons list here
    }

    private static Person toPerson(String personData) {
        Map<String, String> keyValue = Arrays.stream(personData.split("\n"))
                .collect(Collectors.toMap(
                        line -> line.split("\\s+")[0],
                        line -> line.split("\\s+")[1]));
        return new Person(keyValue.get("name"),
                keyValue.get("birthday"),
                keyValue.get("address"),
                keyValue.get("Postcode"),
                keyValue.get("phone"));
    }
}

Обратите внимание, что некоторые ключи не существуют в keyValue, поэтому Person Конструктор получает null для некоторых параметров. Кроме того, в конструкторе Person вы можете при необходимости преобразовать параметр в Integer (и сначала проверить, если null).

5
задан kitsune 30 March 2009 в 15:50
поделиться

5 ответов

Вы моделируете many-many отношения: проект может иметь многих людей, работающих над ним, и человек может работать над несколькими проектами.

Вы моделируете отношение как Роль Проекта, которая в дополнение к служению в качестве двунаправленного канала от Человека <-> Проект, также записывает RoleType, и запустите/закончите того Человека, заполняющегося что RoleType на том Проекте. (Заметьте, как английская работа, "которая" помогает для базы данных FK или, в коде, указателе/ссылке?)

Из-за тех FKs мы можем в базе данных следовать за графиком от Человека, через Роль Проекта, к Проекту:

select a.person_id, b.project_role_id, c.project_id
from person a join project_role b on (a.id = b.person_id)
join project c on (b.project_id = c.id)
where a.person_id = ?

Или мы можем следовать за ним в другом направлении из Проекта:

select a.person_id, b.project_role_id, c.project_id
from person a join project_role b on (a.id = b.person_id)
join project c on (b.project_id = c.id)
where c.project_id = ?

Идеально, мы хотели бы смочь сделать то же в коде C#. Таким образом да, мы хотим, чтобы у Человека были список и Проект иметь список и ProjectRole ссылки на Человека и Проект.

Да, Project::addPerson( Person& ) должен действительно быть Project::addProjectRole( ProjectRole& ), если мы не решаем это Project::addPerson( Person& ) удобный метод формы:

void Project::addPerson( Person& p ) {
  this.addProjectRole( new ProjectRole( p, &this, RoleType::UNASSIGNED ) ;
}

ProjectRole не имеет списка, он имеет - ссылка на Человека и ссылка на Проект. Это также имеет, как значения, дата начала, дата окончания и RoleType (который или перечисление, или экземпляр класса, который подражает перечислению значений - то есть, существует только один объект на перечислимый тип, и это является не сохраняющим состояние, неизменным и идемпотентным, и таким образом с обеспечением совместного доступа среди многих ProjectRoles).

Теперь это не должно означать, что получение Человека от базы данных должно заставить целую базу данных быть овеществленной в графе объектов в коде; ленивые прокси, которые получают только на использовании, могут сохранить нас от этого. Затем, если мы только в настоящее время обеспокоены Человеком и не его Ролями (и Проекты, мы можем просто получить Человека. (NHibernate, например, я думаю, делает это более или менее беспрепятственно.)

В основном я думаю что:

1) Это - стандартный способ представить many-many отношения; 2) Это стандартно для отношения, чтобы иметь дополнительные данные (когда, какой) и; 3) Вы в значительной степени получили верную мысль и просто являетесь справедливо добросовестными в получении обратной связи здесь.

1
ответ дан 15 December 2019 в 01:11
поделиться

Разве Вы не путающий "Описание" роли с ролью, которую человек имеет в проекте? Добавление понятия "RoleDescription" ('ролевой класс так сказать), и объекты "RoleInstance", относящиеся к фактическим людям в проектах, может помочь.

0
ответ дан 15 December 2019 в 01:11
поделиться

Вот то, как я обработал бы его:

class Person
{
  string Name { get; set; }
  IList<Role> Roles { get; private set; }
}

class Role
{
  string Name { get; set; }
  string Description { get; set; }
  IList<Person> Members { get; private set; }
}

class Project
{
  string Name { get; set; }
  string Description { get; set; }
  IList<ProjectMember> Members { get; private set; }
}

class ProjectMember
{
  Project Project { get; private set; }
  Person Person { get; set; }
  Role Role { get; set; }
}

Класс ProjectMember приносит им всем вместе. Эта модель дает Вам гибкость для присвоения того же Человека различным Проектам с различными Ролями (например, он мог бы быть Разработчиком на ProjectA и Тестером на ProjectB).

Не создавайте роль определенные классы - что урок уже был извлечен.

Я создал демонстрационное приложение для демонстрации этого (оно включает отношения также):

  1. Выполненный "bin\debug\RolesRelationshipsSample.exe"
  2. Дважды щелкните по значкам библиотеки для создания объектов
  3. Перетащите/отбросьте их для присвоения соответствующих отношений

Не стесняйтесь играть с кодом. Надеюсь, что Вы находите это полезным.

3
ответ дан 15 December 2019 в 01:11
поделиться

То, что Вы имеете, является many-many отношениями с дополнительными данными, ролью. У нас есть подобная структура кроме нашего случая, у человека может быть несколько ролей на проекте, таким образом, я боролся с теми же вопросами. Одно решение состоит в том, чтобы создать класс ProjectPerson, который расширяет Человека и добавляет ролевое свойство:

public class ProjectPerson : Person
{
    public string Role { get; set; }
}

Ваш класс Проекта теперь имеет набор ProjectPerson, но класс Человека имеет набор Проекта, потому что не имеет смысла расширять класс Проекта для добавления роли. Необходимо будет сделать некоторую дополнительную работу (ищите Человека в наборе ProjectPerson) найти роль на Проекте с точки зрения Человека.

Вторым решением является стандартный способ обработать many-many отношения с дополнительными данными. Создайте класс ProjectRole и смоделируйте его, поскольку многие примыкают двух связей "один ко многим" из Проекта и Человека. Таким образом, и Проект и Человек у каждого есть набор ProjectRole.

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

0
ответ дан 15 December 2019 в 01:11
поделиться

Похоже, что есть две основные сущности - Проект и Участник проекта. Участник проекта имеет атрибуты «Роль участника» и «Имя участника».Любой из этих атрибутов может принадлежать домену, то есть набору значений, которые могут поддерживаться в таблицах поиска как для удобства, так и для использования при поиске. Предполагается, что кому-то требуется информация обо всех участниках проекта, выполняющих определенную роль / работу.

Примечание. В таблицы поиска могут быть добавлены записи, но обычно значение записи не изменяется. После того, как значение выбрано из справочной таблицы, оно считается постоянным элементом таблицы-владельца - в данном случае таблицы Project Member.

Я бы не ожидал увидеть сущность или таблицу «Человек» в каком-либо бизнесе, кроме удобства в виде таблицы поиска, как в приведенном выше случае. HR-отделы будут вести список сотрудников, у которых есть конкретная информация, которая требуется для расчета заработной платы и т. Д., Но нет ничего фундаментального в отношении людей, которые необходимо знать бизнесу. NB Найдите бизнес-процесс, чтобы идентифицировать сущность - не придумывайте.

0
ответ дан 15 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: