2008-10-14 6 views
3

J'ai besoin de modéliser un système où il y aura une équipe composée d'utilisateurs qui jouent des rôles dans l'équipe et qui ont des compétences qui leur sont assignées.Existe-t-il des modèles de conception pour la modélisation d'une structure contenant des équipes, des rôles et des compétences?

-à-dire une équipe A 5 membres, l'un joue le rôle de chef d'équipe, remplissent tous la réponse à rôle e-mail, mais certains ont une compétence supplémentaire pour répondre au téléphone

Je suis en train de déterminer comment Je peux mieux modéliser ça.

Ce problème doit avoir été résolu avant, existe-t-il de bonnes ressources sur la façon de modéliser cela?

EDIT: Je dois déterminer ce qu'un utilisateur est autorisé à le faire, ce qui pourrait être parce qu'ils sont dans une certaine équipe, effectuer un certain rôle ou ont été affectés d'une certaine compétence

Répondre

1

Pas vraiment tout ce que j'ai entendu, mais il est assez simple pour être résolu de diverses façons.

Il y a donc des équipes, des membres, des rôles et des compétences. Les équipes ne sont que des conteneurs membres et les membres ont des rôles et des compétences.

est ici encore un petit pseudo pour vous donner l'idée:

class Team 
    container[Member] members 

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

Ensuite, vous instancier ou des rôles de sous-classe et les compétences, en fonction de ce genre de choses qu'ils sont et les capacités de votre langage de programmation.

.. D'autre part, en pratique, il peut être logique de faire une classe d'équipe similaire à Role and Skill -class - une propriété de Member -class. Si vous avez besoin de savoir des choses comme quoi un membre a accès.

+0

Cela devient un peu plus compliqué quand peut attribuer des rôles et des compétences à l'équipe et des rôles et des compétences aux particuliers, puis prendre en héritage compte des équipes . En outre, vous devez penser à avoir un utilisateur privilégié qui contrôle une équipe dont vous ne voulez pas hériter de –

+0

Oui, mais je voudrais quand même aborder le problème dans cette direction. Hm. Eh bien ... si cela devait être modifié à ce que vous dites, il serait plus utile de le changer un peu ... – Cheery

2

J'ai googlé ceci, alors prenez-le avec un grain de sel. J'ai trouvé ce paper sur la modélisation de rôle et les objets. À la page 30, il y a un modèle de rôle. J'espère que ce n'est pas une chasse aux oies sauvages pour vous. Voici le résumé

Le modèle de rôle vous permet de concevoir un composant qui peut être étendre à l'exécution avec de nouveaux objets contexte, appelés rôles. Un composant est étendu avec des rôles selon le contexte Modèle d'objet. Le composant correspond à un composant de décorateur et un rôle correspond à à un objet de contexte. L'intégration d'état d'un composant de jeu de rôle est réalisée en appliquant la propriété et la stratégie . La propriété est utilisée pour définir l'espace d'état du composant et la stratégie est utilisée pour fournir le comportement dépendant de la propriété.

2

Il semble que vous puissiez utiliser ici une variante du modèle composite, au moins pour une partie du problème. Vous pouvez commencer avec l'unité qui agit comme une super-classe, alors vous pouvez avoir une équipe en tant que sous-classe de l'unité. L'équipe est un conteneur qui peut contenir d'autres unités. En outre, vous pouvez avoir une unité de sous-classe utilisateur. Ainsi, vous pouvez écrire du code qui cible simplement l'unité et traiter toutes les équipes et tous les utilisateurs de la même manière. Vous pourrez alors créer des équipes complexes composées d'autres équipes.

Vous pouvez alors fournir une classe pour chaque type d'utilisateur ou type d'équipe dont vous avez besoin.

Si le nombre de rôles augmente considérablement et que vous vous retrouvez avec trop de classes (explosion de classe), vous pouvez alors appliquer le motif Décorateur.Ainsi, vous enveloppez (décorez) un objet avec un autre objet avec une interface similaire mais des fonctionnalités différentes (ou supplémentaires).

Vous pouvez donc avoir un BasicUtilisateur et le AnswerPhoneDecorator. Prenez n'importe quel objet BasicUser dans AnswerPhoneDecorator et vous avez un utilisateur qui peut répondre au téléphone.

+0

Je pense que l'utilisation du motif décorateur devrait être en mesure de résoudre ce problème. J'aurai besoin d'ajouter une autre classe, employé, pour être décoré avec, compétences, puis rôle, puis équipe et le modèle Composite pour les équipes. Surtout "dans ma tête de conception jusqu'à présent" mais je vais regarder dans la conception de la semaine prochaine, puis mettre à jour –

+0

Ceci signifie, par exemple, qu'un employé peut avoir plusieurs rôles. Ce n'est pas grave si vous voulez que vos employés aient des rôles différents dans les différentes équipes auxquelles ils appartiennent, mais alors comment allez-vous comprendre quel est le rôle de l'employé dans une équipe spécifique? – Sandman

+0

Et il y a aussi les problèmes de plusieurs utilisateurs ayant éventuellement le rôle de chef d'équipe pour la même équipe, le salarié travaillant dans une seule équipe mais ayant plusieurs rôles et d'un employé travaillant dans une équipe et ayant le même rôle que lui/elle plusieurs fois. – Sandman

0

Dans votre exemple, j'aurais au moins TeamMember BaseClass et 2 interfaces (iEmail et iPhone). Tous les nouveaux rôles hériteront de la classe TeamMember et, en fonction de ce qu'elle peut faire, implémenteront les interfaces appropriées ... En bref, les rôles seraient implémentés en tant que classe héritant de TeamMember, et les compétences seraient implémentées en tant qu'interface. Par exemple, le chef d'équipe est autorisé à passer un appel téléphonique. Ensuite, j'aurais classe TeamLeader hérite de d'équipe et implémente l'interface iPhone

RWendi

0

Même si je crois que les modèles de conception-sont un excellent outil, je ne pense pas que j'utiliser une configuration spécifique pour ce problème . Au contraire, j'essaierais de l'aborder sous un angle différent. Ce que je propose est d'utiliser une base de données qui va stocker des données sur vos équipes, les membres de l'équipe et leurs rôles. Maintenant, les bases de données ne sont pas exactement mon côté fort, mais je vais essayer:
Créez une table pour contenir tous les membres de votre équipe, de toutes les équipes. La table doit avoir des attributs: Nom, Rôle, Equipe, Compétences qui représentent le nom et le rôle d'un membre, une équipe à laquelle il appartient, et ses compétences respectivement.
Maintenant, supposons que vous avez les rôles suivants dans votre application: RôleA (pour ceux qui peuvent répondre au téléphone et envoyer des courriels), roleB (ne peut envoyer que des courriels) et rôle TeamLeader (peut répondre au téléphone, envoyer e -mail et aller aux réunions, par exemple La table des rôles contiendra tous les rôles dans votre application, les attributs seraient (dans ce cas): nom (nom du rôle), canAnswerPhone (booléen indiquant si un utilisateur avec ce rôle peut répondre au téléphone), peut envoyer un e-mail (booléen dire s'il peut envoyer un e-mail) et ainsi de suite ...
La troisième table peut, par exemple, contenir toutes les équipes de votre application, et diverses données à leur sujet (comme, les projets sur lesquels l'équipe travaille, etc ...)
Maintenant, vous pouvez facilement obtenir tous les membres d'une équipe, ce qu'ils peuvent faire, changer leurs rôles, voir qui est le leader , changer ce qu'un certain rôle fait et ainsi de suite ...

J'espère que cela a du sens pour vous. Bonne chance en concevant votre application!

0

Cela dépend de ce que vous modélisez. Compte tenu de votre exemple ci-dessus, voulez-vous pouvoir trouver le membre de l'équipe le mieux adapté à un problème donné?

Si tel est le cas, je recommanderais quelque chose comme ceci: Imaginez des rôles et des compétences en tant que sommets dans un graphe non orienté. Un rôle donné est lié (via un avantage) à chaque compétence dont il est capable (en supposant que les compétences sont données par rôle et ne sont pas uniquement basées sur un individu). Maintenant, connectez tous les membres de l'équipe à tous les rôles qu'ils ont dans l'équipe et les membres de l'équipe aux équipes appropriées. Ce graphique modélise maintenant les associations entre vos équipes, les membres de l'équipe, leurs rôles et les compétences qu'ils auraient dû donner à leurs rôles. Maintenant, pour cartographier un problème donné à un membre de l'équipe (ou même à une équipe), prenez un problème et connectez-le à chacune des différentes compétences dont vous pensez avoir besoin (Email, DB, Web UI, Web Services, etc). etc.). Vous pouvez maintenant relier les problèmes à ces entités.

Je ne reviendrai pas sur tous les types de rapports que vous pourriez exécuter avec ceci, mais en voici un simple.Si vous voulez trouver une seule personne (si elles existent) qui peuvent résoudre ce problème, je recommande un traversal graphique comme celui-ci:

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 
    } 
} 

Comme vous pouvez le voir à cet égard, je n'ont pas beaucoup d'une utilisation pour les motifs des autres affiches. Si vous essayez de modéliser la sécurité du domaine ou une autre logique métier quelconque. Leurs techniques pourraient très bien être les bonnes. Par ailleurs, il faut noter que l'algo ci-dessus n'est pas optimal.

+0

Votre approche est vraiment unique. J'aime la pensée out-of-the-box. –

Questions connexes