Je travaille sur un nouveau projet. Ma meilleure analogie serait un fabricant de tests d'évaluation psychologique.
Aspect #1. L'utilisateur final doit créer des questions de test. Avec des types de questions. Et des réponses possibles aux questions, le cas échéant.
Exemples :
1. Do you have red hair? (T/F)
2. What is your favorite color? (Single Response/Multiple Choice)
(Possible Responses: Red, Yellow, Black, White)
3. What size shoe do you wear (rounded to next highest size)? (Integer)
4. How much money do you have on you right now? (Dollar Amount (decimal))
Je dois donc être en mesure de créer des questions, leur type et, pour certaines d'entre elles, des réponses possibles.
Ici :
Le numéro 1 est un type connu de "Vrai ou Faux".
Le numéro 2 est un type connu de "réponse unique/choix multiple" ET l'utilisateur final créera les réponses possibles.
Le nombre 3 est un type connu de "Integer". L'utilisateur final (la personne qui effectue l'évaluation) peut en principe introduire n'importe quelle valeur entière.
Le nombre 4 est un type connu de "décimal". C'est la même chose que le nombre entier.
Aspect n°2. L'utilisateur final doit évaluer les réponses de la personne. Et attribuer une valeur scalaire à un ensemble de réponses.
Exemple :
Si quelqu'un répondait :
1. T
2. Red
3. >=8
4. (Not considered for this situation)
Un expert en psychiatrie a calculé que si quelqu'un a répondu par les réponses ci-dessus, il est 85% plus à risque de dépression que la normale. (Où 85% est un nombre que l'utilisateur final (psychiatre) peut entrer comme paramètre.
L'aspect n°2 consiste donc à parcourir les réponses de quelqu'un et à déterminer un résultat.
La "grille de réponse" devrait être configurée de manière à passer en revue (certaines ou toutes) les possibilités dans un ordre de priorité, puis, une fois toutes les conditions remplies (sur une seule ligne), à sortir avec le résultat.
Comme ça :
(1.) T (2.) Red (3.) >=8 ... Result = 85%
(1.) T (2.) Yellow (3.) >=8 ... Result = 70%
(1.) F (2.) Red (3.) >=8 ... Result = 50%
(1.) F (2.) Yellow (3.) >=8 ... Result = 40%
Une fois qu'une correspondance est trouvée, vous sortez avec le pourcentage. Si vous ne trouvez pas de correspondance, vous passez à la règle suivante.
De plus, en utilisant cet exemple fictif d'évaluation psychologique, je n'ai pas besoin de définir chaque permutation. De nombreuses questions des évaluations psychologiques ne sont pas réellement utilisées, elles ne sont que du superflu. Ainsi, dans ma grille ci-dessus, j'ai délibérément laissé de côté la question n°4. Elle n'a aucune incidence sur les résultats.
Il peut également y avoir une grille d'évaluation "Cette personne a-t-elle pris cela au sérieux ?" :
(3.) >=20 (4.) >=$1,000 ... Result = False
(La possibilité d'avoir une pointure >= 20 et d'avoir de gros dollars en poche est très faible, donc vous n'avez probablement pas pris le test psychologique au sérieux).
Si aucune règle n'est trouvée (dans mon application réelle, pas dans cette maquette), je lèverais une exception ou je m'en moquerais tout simplement. Je n'aurais pas besoin de règle par défaut ou de règle de repli. Dans l'exemple ci-dessus, le rouge et le jaune sont des couleurs préférées "inquiétantes". Si votre couleur préférée est le noir ou le blanc, cela n'a aucune incidence sur votre facteur de risque de dépression.
J'ai utilisé des Business Rule Engines dans le passé. (InRule par exemple). Ils sont très chers, et ce n'est pas dans le budget.
BizTalk Business Rules Framework est une possibilité. Pas souhaitable, mais possible.
Mon problème avec tout moteur de règles est que le "vocabulaire" (je n'ai qu'une expérience limitée des moteurs de règles commerciales) est basé sur des objets, avec des propriétés statiques.
public class Employee
{
public string LastName
{ get; set; }
public DateTime HireDate
{ get; set; }
public decimal AnnualSalary
{ get; set; }
public void AdjustSalary(int percentage)
{
this.AdjustSalary= this.AdjustSalary + (this.AdjustSalary * percentage);
}
}
Il serait facile de créer des règles de gestion.
If
the (Employee's HireDate) is before (10 years ago)
then
(Increase Their Salary) By (5) Percent.)
else
(Increase Their Salary) By (3) Percent.)
Mais dans ma situation, le test est composé de questions (dynamiques) et de réponses (dynamiques), et non de propriétés prédéterminées.
Je pense donc que je suis à la recherche d'idées sur la manière de réaliser ce projet.
Je sais que je peux construire une application "TestMaker" assez rapidement.
Le plus gros problème est d'intégrer les questions et les réponses possibles dans les "règles d'évaluation".
Merci pour tout conseil.
Technologies : Cadre DotNet 4.0 Base de données dorsale Sql Server 2008 VS2010 Pro, C#