Los ejemplos le muestran cómo descomponer expresiones condicionales

Este artículo es compartido por la comunidad HUAWEI CLOUD " Descomposición condicional ", autor: JavaEdge.

1 Motivación

La compleja lógica condicional del programa hace que tenga que escribir código para verificar diferentes ramas condicionales, hacer diferentes cosas en función de diferentes condiciones y, luego, pronto tendré una función bastante larga. Las funciones grandes reducen inherentemente la legibilidad del código, mientras que la lógica condicional hace que el código sea más difícil de leer.

En funciones con lógica condicional compleja, el código (incluido el código que verifica la rama condicional y el código que realmente implementa la función) me dirá qué sucedió, pero a menudo me hace preguntarme por qué sucedió, lo que indica que la legibilidad del código se redujo en gran medida.

Al igual que con cualquier gran bloque de código, puedo dividirlo en funciones separadas, nombrar las nuevas funciones de acuerdo con el propósito de cada pequeña pieza de código y cambiar el código correspondiente en la función original para llamar a la nueva función, por lo tanto Expresar intención mas claro.

Para la lógica condicional, descomponer cada condición de rama en una nueva función tiene beneficios adicionales: se puede resaltar la lógica condicional, lo que hace cada rama más claramente y se resalta el motivo de cada rama. Este método de refactorización es en realidad solo un escenario de aplicación de [función de refinamiento]. Pero quiero enfatizar ese escenario porque creo que a menudo aporta mucho valor.

2 Practica

Use el método [función de refinamiento] para el juicio condicional y cada rama condicional.

3 casos

Supongamos que quiero calcular el precio total de comprar un determinado producto (precio total = cantidad × precio unitario), y el precio unitario de este producto es diferente en invierno y verano:

public static void price(LocalDate aDate, Plan plan, Long quantity) {
  if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) {
    charge = quantity * plan.summerRate;
  } else {
    charge = quantity * plan.regularRate + plan.regularServiceCharge;
  }
}

Destila el juicio condicional en un solo método:

    /**
     * 在冬季和夏季的单价不同
     */
    public static void price(LocalDate aDate, Plan plan, Long quantity) {
        if (summer(aDate, plan)) {
            charge = quantity * plan.summerRate;
        } else {
            charge = quantity * plan.regularRate + plan.regularServiceCharge;
        }
    }

    public static boolean summer(LocalDate aDate, Plan plan) {
        return !aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd);
    }

Luego refine la rama donde la condición es verdadera:

/**
 * 在冬季和夏季的单价不同
 */
public static void price(LocalDate aDate, Plan plan, Long quantity) {
  if (summer(aDate, plan)) {
    charge = summerCharge(plan, quantity);
  } else {
    charge = quantity * plan.regularRate + plan.regularServiceCharge;
  }
}

/**
 * 提炼条件判断为真的分支
 */
public static Long summerCharge(Plan plan, Long quantity) {
  return quantity * plan.summerRate;
}
}

Finalmente, se refina la rama donde se juzga que la condición es falsa:

/**
 * 在冬季和夏季的单价不同
 */
public static void price(LocalDate aDate, Plan plan, Long quantity) {
  if (summer(aDate, plan)) {
    charge = summerCharge(plan, quantity);
  } else {
    charge = regularCharge(plan, quantity);
  }
}

private static Long regularCharge(Plan plan, Long quantity) {
  return quantity * plan.regularRate + plan.regularServiceCharge;
}

Una vez completada la refinación, me gusta reorganizar la declaración condicional con el operador ternario.

/**
 * 在冬季和夏季的单价不同
 */
public static void price(LocalDate aDate, Plan plan, Long quantity) {
  charge = summer(aDate, plan) ? summerCharge(plan, quantity) : regularCharge(plan, quantity);
}

Haga clic en Seguir para conocer las nuevas tecnologías de HUAWEI CLOUD por primera vez~

Supongo que te gusta

Origin blog.csdn.net/devcloud/article/details/123988993
Recomendado
Clasificación