Ejemplo n.º 1
0
  /**
   * 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;
  }
Ejemplo n.º 2
0
  /**
   * 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;
  }