Существуют ли шаблоны проектирования для моделирования структуры, содержащей команды, роли и навыки? - PullRequest
3 голосов
/ 14 октября 2008

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

т.е. команда A 5 членов, один выполняет роль руководителя команды, все выполняют ответ на роль электронной почты, но у некоторых есть дополнительный навык, чтобы ответить на телефонный звонок

Я пытаюсь определить, как мне лучше это смоделировать.

Эта проблема должна быть решена раньше, есть ли хорошие ресурсы о том, как смоделировать это?

РЕДАКТИРОВАТЬ: мне нужно определить, что пользователю разрешено делать, что может быть из-за того, что он находится в определенной команде, выполняет определенную роль или ему назначен определенный навык

Ответы [ 7 ]

2 голосов
/ 15 октября 2008

Похоже, вы можете использовать вариант составного паттерна здесь, по крайней мере, для решения части проблемы. Вы можете начать с юнита, который действует как суперкласс, затем вы можете создать команду в качестве подкласса юнита. Команда - это контейнер, который может содержать другие юниты. Кроме того, вы можете иметь пользовательский подкласс Unit. Таким образом, вы можете написать код, который просто нацелен на подразделение и одинаково относится ко всем командам и пользователям. После этого вы сможете создавать сложные команды, состоящие из других команд.

Таким образом, вы можете предоставить класс для каждого типа Пользователя или Команды, который вам нужен.

Если количество ролей резко возрастает и у вас слишком много классов (взрыв классов), вы можете применить шаблон Decorator. Таким образом, вы оборачиваете (украшаете) объект другим объектом со схожим интерфейсом, но с другой (или дополнительной) функциональностью.

Таким образом, у вас может быть BasicUser и AnswerPhoneDecorator. Возьмите любой объект BasicUser, оберните его в AnswerPhoneDecorator, и у вас есть пользователь, который может ответить на телефонный звонок.

2 голосов
/ 14 октября 2008

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

Шаблон Role позволяет вам создавать Компонент, который можно расширять во время выполнения с помощью новых Контекстные объекты, называемые ролями. Компонент дополнен ролями в соответствии с контекстом Образец объекта. Компонент соответствует Компоненту Декоратора, а Роль соответствует к объекту контекста. Государственная интеграция ролевого компонента достигается путем применения Недвижимость и стратегия. Свойство используется для определения пространства состояний Компонента, и Стратегия используется для обеспечения зависимого от свойства поведения.

1 голос
/ 14 октября 2008

Не совсем то, о чем я слышал, но достаточно просто, чтобы его можно было решить разными способами.

Итак, есть команды, участники, роли и навыки. Команды - это всего лишь контейнеры для участников, и у участника есть роли и навыки.

Вот еще небольшое псевдо, чтобы дать вам полную идею:

class Team
    container[Member] members

class Member
    container[Role] roles
    container[Skill] skills

Затем вы создаете экземпляры ролей и навыков или делите их на подклассы, в зависимости от того, что они собой представляют, и возможностей вашего языка программирования.

.. С другой стороны, на практике может иметь смысл сделать Team -class похожим на Role и Skill -class - свойство Member -class. Если вам нужно выяснить, например, к чему имеет доступ один участник.

0 голосов
/ 06 марта 2009

Я обнаружил, что в главе 5 Enterprise Patterns и MDA: создание лучшего программного обеспечения с использованием Archetype Patterns и UML обсуждается, как достаточно хорошо смоделировать отношения

0 голосов
/ 18 октября 2008

Это зависит от того, что вы моделируете. Учитывая приведенный выше пример, хотите ли вы найти члена команды, наиболее подходящего для данной проблемы?

Если это так, то я бы порекомендовал что-то вроде этого: Представьте себе роли и навыки как вершины в неориентированном графе. Данная роль связана (через преимущество) с каждым навыком, на который она способна (при условии, что навыки определяются ролью, а не основаны только на личности). Теперь подключите всех членов команды к любой роли, которую они играют в команде, и членов команды к соответствующим командам.

Этот график теперь моделирует связи между вашими командами, членами команды, их ролями и навыками, которые они должны были дать своим ролям.

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

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

class Problem
{
  find_problem_solvers()
  {
    var problem_solvers = null
    for each (skill in skills_required)
    {
      var possible_problem_solvers = skill.find_problem_solvers()
      if(problem_solvers == null)
      {
        problem_solvers = new list().add_range(possible_problem_solvers)
      }
      else
      {
        for each problem_solver in problem_solvers:
        {
          if(problem_solver not in possible_problem_solvers)
            problem_solvers.remove(problem_solver)
        }
      }
      //No point continuing if we eliminated everyone!
      if(problem_solvers is empty) break;
     }
     return problem_solvers
   }
 }

Как вы можете видеть в этом отношении, я не особо пользуюсь образцами других постеров. Если вы пытаетесь смоделировать безопасность домена или какую-то другую бизнес-логику. Их методы вполне могут быть правильными.

Кстати, следует отметить, что приведенный выше алгоритм не является оптимальным.

0 голосов
/ 15 октября 2008

Хотя я считаю, что шаблоны проектирования - отличный инструмент, я не думаю, что использовал бы какой-то конкретный шаблон для этой проблемы. Скорее, я бы попытался подойти к этому с другой стороны. Я предлагаю использовать базу данных, в которой будут храниться данные о ваших командах, членах команды и их ролях. Теперь базы данных не совсем моя сильная сторона, но я попробую:
Создайте стол для всех членов вашей команды, из всех команд. Таблица должна иметь атрибуты: Имя, Роль, Команда, Навыки, которые представляют имя и роль участника, команду, к которой он / она принадлежит, и его / ее навыки соответственно.
Теперь предположим, что в вашем приложении есть следующие роли: RoleA (для тех, кто может отвечать на телефонные звонки и отправлять электронную почту), roleB (может только отправлять электронную почту) и роль TeamLeader (может отвечать на телефонные звонки, отправлять электронную почту) и ходить на встречи, например. Таблица ролей будет содержать все роли в вашем приложении, атрибуты будут (в данном случае): name (имя роли), canAnswerPhone (логическое значение, указывающее, может ли пользователь с этой ролью отвечать на телефонные звонки), может отправлять электронную почту. mail (логическое выражение, может ли он / она отправлять электронную почту) и т. д.
Третья таблица может содержать, например, все команды в вашем приложении и различные данные о них (например, проекты, над которыми работает команда и т. Д ....).
Теперь вы можете легко получить всех членов команды, что они могут сделать, изменить их роли, увидеть, кто является лидером, изменить то, что делает определенная роль и так далее ...

Я надеюсь, что это имеет смысл для вас. Желаем удачи в разработке вашего приложения!

0 голосов
/ 15 октября 2008

В вашем примере я бы имел как минимум TeamMember BaseClass и 2 интерфейса (iEmail и iPhone). Любые новые роли будут наследоваться от класса TeamMember и, в зависимости от того, что он может делать, реализуют соответствующие интерфейсы ... Короче говоря, роли будут реализованы как класс, который наследуется от TeamMember, а навыки будут реализованы как интерфейс.

Например, руководителю группы разрешено сделать телефонный звонок. Тогда я хотел бы получить класс TeamLeader от TeamMember и реализовать интерфейс iPhone

RWendi

...