重构手法——函数行为重塑类 | 语意 | 替换魔法字面量

61 阅读2分钟

简介

"替换魔法字面量"是提升代码可维护性的基础重构手法。通过将代码中直接使用的特殊值(数字、字符串等)替换为具名常量,可以显著提高代码可读性和可维护性。

针对的症状(代码坏味道)

  • 代码中出现无法直接理解含义的原始值
  • 同一字面量在多处重复使用
  • 需要修改字面量值时存在多处修改风险
  • 包含复杂表达式或公式的魔法数值

替换魔法字面量的详细步骤

  1. 识别魔法字面量
    • 查找代码中的原始数字/字符串
    • 标记具有特殊含义的字面量
  2. 创建常量声明
    • 选择有业务含义的常量名称
    • 添加合适的访问修饰符
  3. 替换引用点
    • 用常量替换原始字面量
    • 更新相关注释说明
  4. 验证重构
    • 确保常量值符合业务需求
    • 检查所有替换点正确性

示例

重构前代码:

class Circle {
    double calculateArea(double radius) {
        return 3.14159 * radius * radius;
    }

    double calculateCircumference(double radius) {
        return 2 * 3.14159 * radius;
    }
}

重构步骤:

  1. 定义圆周率常量:

    private static final double PI = 3.14159;
    
  2. 替换原始值:

    class Circle {
        private static final double PI = 3.14159;
    
        double calculateArea(double radius) {
            return PI * radius * radius;
        }
    
        double calculateCircumference(double radius) {
            return 2 * PI * radius;
        }
    }
    

练习

基础练习题

  1. 简单数字常量替换

    // 重构前
    class TaxCalculator {
        double calculate(double income) {
            return income * 0.15;
        }
    }
    

进阶练习题

  1. 复合业务常量替换

    // 重构前
    class SpaceShip {
        void adjustTrajectory() {
            if (fuelLevel < 0.2) {
                activateEmergencyProtocol("CODE_RED");
            }
        }
    }
    

综合拓展练习题

  1. 复杂公式常量提取

    // 重构前
    class PhysicsEngine {
        double calculateForce(double mass) {
            return mass * 9.80665;
        }
    
        double kineticEnergy(double mass, double velocity) {
            return 0.5 * mass * velocity * velocity;
        }
    }
    

代码审查要点

  1. 优点:

    • 提高代码可读性
    • 集中管理关键值
    • 降低维护成本
  2. 潜在问题:

    • 避免过度使用常量类
    • 保持常量命名准确性
    • 注意常量作用域范围