/** * Méthode appelée pour le calcul de la cohésion entre 2 fonctions. * * <p>Calcule le pourcentage de variables locales similaires entre les deux fonctions sur le * nombre total de variables locales utilisées dans les deux fonctions. * * @param f1 Une fonction d'un modèle de code source * @param f2 Une autre fonction d'un modèle de code source * @return Un double entre 0.0 et 100.0 * @see #cohesion(Function, Function) */ private double cohesionLocalVars(Function f1, Function f2) { double result = 0.0; double nbCommon = 0; Map<LocalVariable, Integer> localVars1 = f1.getLocalVariables(); Map<LocalVariable, Integer> localVars2 = f2.getLocalVariables(); for (LocalVariable var1 : localVars1.keySet()) { for (LocalVariable var2 : localVars2.keySet()) { if (var1.getName().length() >= VARNAME_MIN_LEN && var2.getName().length() >= VARNAME_MIN_LEN) { if (var1.getType().equals(var2.getType())) { if (similarity.similar(var1.getName(), var2.getName())) { ++nbCommon; } } } } } double nbPairs = localVars1.size() * localVars2.size(); if (nbPairs > 0) { result = 100.0 * nbCommon / nbPairs; } return result; }
/** * Méthode appelée pour le calcul de la cohésion entre 2 fonctions. * * <p>Calcule le pourcentage de paramètres similaires entre les deux fonctions sur l'ensemble des * paramètres des deux fonctions. * * @param f1 Une fonction d'un modèle de code source * @param f2 Une autre fonction d'un modèle de code source * @return Un double entre 0.0 et 100.0 * @see #cohesion(Function, Function) */ private double cohesionArguments(Function f1, Function f2) { double result = 0.0; double nbCommon = 0; Set<LocalVariable> argsFct1 = f1.getArguments(); Set<LocalVariable> argsFct2 = f2.getArguments(); Set<LocalVariable> args = new HashSet<LocalVariable>(); for (LocalVariable arg1 : argsFct1) { for (LocalVariable arg2 : argsFct2) { if (arg1.getType().equals(arg2.getType())) { if (similarity.similar(arg1.getName(), arg2.getName())) { ++nbCommon; } } args.add(arg1); args.add(arg2); } } if (args.size() > 0) { result = 100.0 * nbCommon / args.size(); } return result; }