Je souhaite calculer la métrique TCC:Comment trouver des paires en double dans un dictionnaire?
La cohésion Tight Classe (TCC) Mesures le rapport entre le nombre de paires de méthode de méthodes visibles directement connectés dans une classe NDC (C) et le nombre de méthodes possibles maximales paires de connexions entre les méthodes visibles d'une classe NP (C). Deux méthodes visibles sont directement connectées, si elles accèdent aux mêmes variables d'instance de la classe. n est le nombre de méthodes visibles menant à:
NP(C) = (n(n-1))/2
et
TCC(C) = NDC(C)/NP(C)
j'ai donc écrit une méthode qui parse par toutes les méthodes dans la classe que je veux vérifier. Cette méthode stocke toutes les méthodes de cette classe et il champs qu'ils utilisent dans un dictionnaire qui ressemble à ceci:
Dictionary<MethodDefinition, IList<FieldReference>> references = new Dictionary<MethodDefinition, IList<FieldReference>>();
Alors maintenant, comment puis-je itérer cette Dictionnary pour vérifier la condition mentionnée ci-dessus? Si je comprends bien, je dois trouver ces deux paires de méthodes qui utilisent le même ensemble de champs? Alors comment puis-je le faire de la meilleure façon? Je pense que je dois parcourir le dictionnaire et voir si le IList contient le même ensemble? (même pas dans le même ordre)?
Des idées ou des idées?
Mon code est le suivant, mais il ne fonctionne pas correctement:
class TCC
{
public static int calculate(TypeDefinition type)
{
int count = 0;
Dictionary<MethodDefinition, HashSet<FieldReference>> references = new Dictionary<MethodDefinition, HashSet<FieldReference>>();
foreach (MethodDefinition method in type.Methods)
{
if (method.IsPublic)
{
references.Add(method, calculateReferences(method));
}
}
for (int i = 0; i < references.Keys.Count; i++)
{
HashSet<FieldReference> list = new HashSet<FieldReference>();
references.TryGetValue(references.Keys.ElementAt(i), out list);
if (isPair(references, list)) {
count++;
}
}
if (count > 0)
{
count = count/2;
}
return count;
}
private static bool isPair(Dictionary<MethodDefinition, HashSet<FieldReference>> references, HashSet<FieldReference> compare)
{
for (int j = 0; j < references.Keys.Count; j++)
{
HashSet<FieldReference> compareList = new HashSet<FieldReference>();
references.TryGetValue(references.Keys.ElementAt(j), out compareList);
for (int i = 0; i < compare.Count; i++)
{
if (containsAllElements(compareList, compare)) {
return true;
}
}
}
return false;
}
private static bool containsAllElements(HashSet<FieldReference> compareList, HashSet<FieldReference> compare)
{
for (int i = 0; i < compare.Count; i++)
{
if (!compareList.Contains(compare.ElementAt(i)))
{
return false;
}
}
return true;
}
private static HashSet<FieldReference> calculateReferences(MethodDefinition method)
{
HashSet<FieldReference> references = new HashSet<FieldReference>();
foreach (Instruction instruction in method.Body.Instructions)
{
if (instruction.OpCode == OpCodes.Ldfld)
{
FieldReference field = instruction.Operand as FieldReference;
if (field != null)
{
references.Add(field);
}
}
}
return references;
}
}
Combien de paires sont là si la clé A/B/C tous contiennent le même élément "MyItem"? –
Est-ce pour .NET 2.0? (Le manque de var dans une déclaration verbeuse me rend suspect.) Si c'est le cas, alors il est important de le mentionner car vous pourriez obtenir beaucoup de réponses LINQ qui ne vous seront pas utiles. –
J'ai modifié la question pour répondre aux commentaires. –