El misterioso nombramiento de la refactorización de código

Cuando comenzamos a aprender a escribir código, debemos haber aprendido que el nombre en el código no debe ser nombrado arbitrariamente. Por ejemplo, para una variable que representa el tiempo, debemos tomar t como el nombre del tiempo. Por supuesto, este nombre El método es muy extremo La mayoría de las personas no cometerán tales errores, pero el problema de la nomenclatura no estándar es una ocurrencia frecuente en el código de nuestro proyecto. Cómo analizar la denominación no estándar y reconstruir el método de denominación no estándar, este es el problema que se discutirá a continuación.

Un nombre misterioso

1.1 Definiciones

¿Qué son los nombres crípticos?Al leer el código, algunos nombres que afectarán nuestra experiencia de lectura (no sé qué significa) se denominan nombres crípticos.
inserte la descripción de la imagen aquí

1.2 Impacto

  • Para comprender este código, debe pasar mucho tiempo "adivinando" el significado de este código, lo que afecta seriamente la legibilidad.
  • Si el código es difícil de nombrar, puede haber más problemas de diseño al acecho detrás de él.
  • La nomenclatura irregular es fácil de causar errores en el desarrollo posterior debido a malentendidos.

1.3 Objetivos de mejora de nombres misteriosos

El objetivo de la refactorización es hacer que el código sea intuitivo y claro, de modo que los nombres de funciones, módulos, variables y clases indiquen claramente su función y uso.

En segundo lugar, el caso del código misterioso

2.1 Código irregular

El siguiente es un código con nombres irregulares, para ver qué está mal , el
inserte la descripción de la imagen aquí
código completo es el siguiente:

public class MysteriousExample {
    
    
    public int amont(Perf perf, Type type) {
    
    
        switch (type) {
    
    
            case TYPE1:
                return resfortype1(perf);
            case TYPE2:
                return resfortype2(perf);
            default:
                throw new IllegalArgumentException("Illegal type : " + type);
        }
    }

    private int resfortype1(Perf perf) {
    
    
        int s = 40000;
        if (perf.getAud() > 30) {
    
    
            s += 1000 * (perf.getAud() - 30);
        }
        return s;
    }

    private int resfortype2(Perf perf) {
    
    
        int s = 30000;
        if (perf.getAud() > 20) {
    
    
            s += 1000 + 500 * (perf.getAud() - 20);
        }
        return s;
    }
}


class Perf {
    
    
    private final int aud;

    public Perf(int aud) {
    
    
        this.aud = aud;
    }

    int getAud() {
    
    
        return aud;
    }
}
enum Type {
    
    
    TYPE1,
    TYPE2,
    UNKNOWN
}

Se puede ver que el código tiene los siguientes problemas:
1. Este código quiere calcular un número, pero el nombre del método está mal escrito y el nombre no tiene la forma de verbo + nombre
2. Los parámetros de la función, utiliza Perf abreviaturas, y no es apropiado usar abreviaturas aquí, porque la palabra es ambigua.
3. El método ejecuta diferentes métodos según el valor de enumeración, pero el nombre del valor de enumeración es TYPE1 y TYPE2, lo que obviamente es inapropiado.
4. Los nombres de los siguientes dos métodos de procesamiento específicos no están estandarizados
5. perf.getAud, es difícil entender qué significa Aud
6. En el método, la variable s, aunque hay muy poco código en el cuerpo del método , no debe usarse como este Nombre de un solo carácter.

2.2 Significado práctico:

No puedo entender este código, por lo que al consultar los documentos técnicos relevantes, es importante conocer los requisitos de este código, de la siguiente manera:
inserte la descripción de la imagen aquí
Después de ver este requisito, el método del código es fácil de entender, pero si los desarrolladores posteriores inician este código , ¿Todavía tengo que comprobar la documentación? Esto sería una pérdida de tiempo, así que comencemos a refactorizar este código.

2.3 Sugerencias de revisión

  • Los nombres de los métodos usan la forma verbo + sustantivo
  • nombres de variables usando sustantivos
  • Evita las faltas de ortografía
  • Métodos, variables, enumeraciones, etc., use palabras con significados específicos en lugar de palabras vagas
  • Evite las abreviaturas de palabras al azar

3. Utilice las herramientas de desarrollo de IDEA para refactorizar

¿Cómo debemos refactorizar? Si cambiamos directamente una variable y una variable, debido a que los métodos y las clases tienen una relación de llamada directa entre sí, a menudo cambia un lugar. Todos los lugares donde se usa esta variable, debe modificarla manualmente, y hay muchas referencias, en este caso la carga de trabajo será muy grande.
inserte la descripción de la imagen aquí

Afortunadamente, para resolver este problema, IDEA tiene una función de refactorización de cambio de nombre incorporada.
Atajo de refactorización de IDEA: shift+f6

3.1 Modificar el nombre del método

inserte la descripción de la imagen aquí

3.2 Refactorización de nombres de clases

inserte la descripción de la imagen aquí
Al modificar el nombre de la clase, IDEA le preguntará si desea modificar el nombre de la variable definido por el nombre de la clase a minúsculas, por
ejemplo, Perf per before, after Perf se modifica a Performance, si desea modificar Performance perf a Performance performance.
inserte la descripción de la imagen aquí

3.3 Refactorización de variables usando IDE

inserte la descripción de la imagen aquí

3.4 Refactorización con el ratón

Por lo general, se recomienda utilizar teclas de acceso directo para la reconstrucción, pero a veces las teclas de acceso directo pueden estar ocupadas y no se pueden usar. Aquí se explica cómo usar el mouse para hacer clic en la reconstrucción: Haga clic con el botón derecho del mouse---->Refactor----- -->Renombrar
inserte la descripción de la imagen aquí

3.5 Código refactorizado

El código de refactorización específico es el siguiente:

public class RenamedExample {
    
    
    public int calculateAmount(Performance performance, PlayType playType) {
    
    
        switch (playType) {
    
    
            case TRAGEDY:
                return calculateTragedyAmount(performance);
            case COMEDY:
                return calculateComedyAmount(performance);
            default:
                throw new IllegalArgumentException("Illegal type : " + playType);
        }
    }

    private int calculateTragedyAmount(Performance performance) {
    
    
        int totalAmount = 40000;
        if (performance.getAudienceNum() > 30) {
    
    
            totalAmount += 1000 * (performance.getAudienceNum() - 30);
        }
        return totalAmount;
    }

    private int calculateComedyAmount(Performance performance) {
    
    
        int totalAmount = 30000;
        if(performance.getAudienceNum() > 20){
    
    
            totalAmount += 1000 + 500 * (performance.getAudienceNum() - 20);
        }
        return totalAmount;
    }
}


/**
 * 剧种枚举
 *
 */
public enum PlayType {
    
    
    TRAGEDY,
    COMEDY,
    UNKNOWN
}

/**
 * 演出信息
 *
 */
public class Performance {
    
    
    private final int audienceNum;

    public Performance(int audienceNum) {
    
    
        this.audienceNum = audienceNum;
    }

    int getAudienceNum() {
    
    
        return audienceNum;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45171957/article/details/124388512
Recomendado
Clasificación