重构第七章:搬移特性

这一张作者主要交代了一系列重构手法,目的是通过调整类中的字段和方法,改善类的结构和设计。

复制代码
字段的搬移(Move Field): 如果一个字段更适合放到另一个类,那就把它搬移到目标类中。就像把自家的东西搬到一个更恰当的地方一样。
bash 复制代码
// Before
class SourceClass {
    TargetClass target;
    int field;

    int getField() {
        return target.getField();
    }
}

class TargetClass {
    int field;

    int getField() {
        return field;
    }
}

// After
class SourceClass {
    TargetClass target;
}

class TargetClass {
    int field;
}

函数的搬移(Move Method): 就好像把家里的事情交给擅长的人一样,如果一个函数更适合属于另一个类,就搬移到目标类中。

bash 复制代码
// Before
class SourceClass {
    TargetClass target;

    void method() {
        target.method();
    }
}

class TargetClass {
    void method() {
        // Method logic
    }
}

// After
class SourceClass {
    TargetClass target;
}

class TargetClass {
    void method() {
        // Method logic
    }

搬移字段至超类(Move Field to Superclass): 如果某个字段对于某个子类更有意义,就搬移到超类中,并在子类中继承使用。

bash 复制代码
// Before
class SuperClass {
    // Superclass logic
}

class SubClass extends SuperClass {
    int field;
}

// After
class SuperClass {
    int field;
    // Superclass logic
}

class SubClass extends SuperClass {
    // Subclass logic
}

搬移函数至超类(Move Method to Superclass): 同样地,如果一个函数对于某个子类更有意义,就搬移到超类中,并在子类中继承使用。

bash 复制代码
// Before
class SuperClass {
    // Superclass logic
}

class SubClass extends SuperClass {
    void method() {
        // Method logic
    }
}

// After
class SuperClass {
    void method() {
        // Method logic
    }
    // Superclass logic
}

class SubClass extends SuperClass {
    // Subclass logic
}

字段的提炼(Extract Field): 如果一个类中某个字段的责任变得过多,就创建一个新的类,将相关的字段移至新类中,然后在原类中使用新类的实例。

bash 复制代码
// Before
class SourceClass {
    int field1;
    int field2;
    // Other fields

    // Methods using field1 and field2
}

// After
class SourceClass {
    NewClass newClass;
    // Other fields

    // Methods using newClass
}

class NewClass {
    int field1;
    int field2;
}

函数的提炼(Extract Method): 如果一个函数执行的任务过多,就创建一个新的函数,将一部分逻辑移至新函数中,使得每个函数负责一个清晰的任务。

bash 复制代码
// Before
class SourceClass {
    void complexMethod() {
        // Complex logic part 1
        // Complex logic part 2
        // Complex logic part 3
    }
}

// After
class SourceClass {
    void complexMethod() {
        newMethodPart1();
        newMethodPart2();
        newMethodPart3();
    }

    void newMethodPart1() {
        // Complex logic part 1
    }

    void newMethodPart2() {
        // Complex logic part 2
    }

    void newMethodPart3() {
        // Complex logic part 3
    }
}

搬移函数至委托类(Move Method to Delegate): 如果一个函数对于某个类的委托而言更有意义,就在委托类中创建方法,并在原类中使用委托来调用委托类的方法。

bash 复制代码
// Before
class SourceClass {
    DelegateClass delegate;

    void method() {
        delegate.method();
    }
}

class DelegateClass {
    void method() {
        // Method logic
    }
}

// After
class SourceClass {
    DelegateClass delegate;
}

class DelegateClass {
    void method() {
        // Method logic
    }
}

搬移函数至服务类(Move Method to Service): 如果一个函数对于某个服务类而言更有意义,就在服务类中创建方法,并在原类中使用服务类来调用服务类的方法。

bash 复制代码
// Before
class SourceClass {
    ServiceClass service;

    void method() {
        service.method();
    }
}

class ServiceClass {
    void method() {
        // Method logic
    }
}

// After
class SourceClass {
    ServiceClass service;
}

class ServiceClass {
    void method() {
        // Method logic
    }

搬移字段至服务类(Move Field to Service): 如果一个字段对于某个服务类而言更有意义,就在服务类中创建字段,并在原类中使用服务类来访问服务类的字段。

bash 复制代码
// Before
class SourceClass {
    ServiceClass service;
    int field;

    int getField() {
        return service.getField();
    }
}

class ServiceClass {
    int field;

    int getField() {
        return field;
    }
}

// After
class SourceClass {
    ServiceClass service;
}

class ServiceClass {
    int field;
}

搬移函数至模块(Move Method to Module): 如果一个函数对于某个模块而言更有意义,就在模块中创建方法,并在原类中使用模块来调用模块的方法。

csharp 复制代码
// Before
class SourceClass {
    ModuleClass module;

    void method() {
        module.method();
    }
}

class ModuleClass {
    void method() {
        // Method logic
    }
}

// After
class SourceClass {
    ModuleClass module;
}

class ModuleClass {
    void method() {
        // Method logic
    }

通过这些重构手法,我们可以更好地组织类的结构,提升代码的可读性和可维护性。根据实际情况选择合适的手法,确保代码的设计更符合整体架构。就像是整理家里的物品一样,让代码更加井然有序,容易管理和维护。

相关推荐
云雾J视界6 小时前
从位运算到状态机:用纯C重构红外/DS18B20/I²C协议,告别“黑盒库“的嵌入式实战指南
c语言·数据库·重构
秋邱2 天前
智启未来:AGI 教育融合 × 跨平台联盟 × 个性化空间,重构教育 AI 新范式开篇:一场 “教育 ×AI” 的范式革命
人工智能·python·重构·推荐算法·agi
AI产品测评官4 天前
2025年招聘系统后端重构:为什么我们放弃了传统SaaS,转向了LLM+RPA智能体?
重构·rpa
司铭鸿5 天前
祖先关系的数学重构:从家谱到算法的思维跃迁
开发语言·数据结构·人工智能·算法·重构·c#·哈希算法
Ace_31750887765 天前
微店商品详情接口深度挖掘:从多接口联动到数据全息重构
大数据·python·重构
Tezign_space7 天前
技术破局:人机协作如何重构内容生产流水线,实现成本与效能的范式转移
人工智能·重构·降本增效·人机协作·内容数字化·内容科技·内容+人工智能
数字孪生家族8 天前
视频孪生与空间智能:重构数字时空认知,定义智能决策新范式
人工智能·重构·空间智能·视频孪生与空间智能
科技测评-阿博8 天前
基于企业知识图谱的B2B金融获客模型:从“流量思维”到“数据工程”的重构
金融·重构·知识图谱
qqxhb9 天前
零基础MCP——第5章编程实战基础(网页、数据分析、调试与重构)
重构·数据挖掘·数据分析·多模态·mcp
老蒋新思维9 天前
创客匠人 2025 高峰论谈(11.22-25):AI 智能体重构创始人 IP 打造与知识变现的管理逻辑
大数据·网络·人工智能·网络协议·tcp/ip·重构·知识付费