重构-基础3(重构方法之提炼函数)

重构:提炼函数技巧与实践
本文探讨了重构中的提炼函数方法,通过三个版本详细阐述如何优化代码结构。从无局部变量的提炼,到处理局部变量变化,再到处理函数内创建的局部变量,每个版本都展示了如何提高代码可读性和复用性。

重构方法

提炼函数

将代码放在独立函数里中,并让函数名解释该函数的用途。
函数的粒度越小,被复用的可能性就越大;并且粒度越小,函数的覆写也会更容易。

版本一:无局部变量

修改前:

    // 做饭
    public void cook(){
        // 买菜
        System.out.println("买菜开始");
        System.out.println("买菜逻辑");
        System.out.println("买菜结束");

        // 洗菜
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");

        // 做菜
        System.out.println("做菜开始");
        System.out.println("做菜逻辑");
        System.out.println("做菜结束");
    }

修改后:

  // 做饭
    public void cook(){
        buyVegetables();
        washVegetables();
        doVegetables();
    }
    
    void buyVegetables() {
        // 买菜
        System.out.println("买菜开始");
        System.out.println("买菜逻辑");
        System.out.println("买菜结束");
    }

    void washVegetables() {
        // 洗菜
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");
    }

    void doVegetables() {
        // 做菜
        System.out.println("做菜开始");
        System.out.println("做菜逻辑");
        System.out.println("做菜结束");
    }

版本二: 对局部变量做更改

对局部变量做更改,可以直接把局部变量做为参数传入函数(基础类型不OK的哦,例如String、Integer)
修改前:

   public static void main(String[] args){
        Vegetables vegetables = new Vegetables();
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");
        vegetables.setVegetablesState("菜已清洗结束");
        System.out.println("菜的状态:" + vegetables.getVegetablesState());
    }

修改后:

 public static void main(String[] args){
        Vegetables vegetables = new Vegetables();
        washVegetables(vegetables);
        System.out.println("菜的状态:" + vegetables.getVegetablesState());
    }

    public static void washVegetables(Vegetables vegetables) {
        // 洗菜
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");
        vegetables.setVegetablesState("菜已清洗结束");
    }

版本二: 分解函数内创建局部变量

如果局部变量在分解函数内创建或者在分解函数内被重新赋值,后面还要继续使用,则需要做为返回值传递出来。
修改前:

public static void main(String[] args) {
        System.out.println("买菜开始");
        List<Vegetables> vegetables = new ArrayList<Vegetables>();
        Vegetables tomatoes = new Vegetables();
        tomatoes.setVegetablesName("tomato");
        tomatoes.setVegetablesPrice(2.00);
        vegetables.add(tomatoes);
        Vegetables eggs = new Vegetables();
        eggs.setVegetablesName("egg");
        eggs.setVegetablesPrice(5.00);
        vegetables.add(eggs);
        System.out.println("买菜结束");
        for (Vegetables tmp : vegetables) {
            System.out.println("买到的菜都有:" + tmp.toString());
        }
        washVegetables(vegetables);
    }
    
    public static void washVegetables(List<Vegetables> vegetables) {
        // 洗菜
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");
        for (Vegetables tmp : vegetables) {
            tmp.setVegetablesState("菜已清洗结束");
        }
    }

修改后:

public static void main(String[] args) {
        List<Vegetables> vegetables = buyVegetables();
        for (Vegetables tmp : vegetables) {
            System.out.println("买到的菜都有:" + tmp.toString());
        }
        washVegetables(vegetables);
    }

    public static List<Vegetables> buyVegetables() {
        // 买菜
        System.out.println("买菜开始");
        List<Vegetables> vegetables = new ArrayList<Vegetables>();
        Vegetables tomatoes = new Vegetables();
        tomatoes.setVegetablesName("tomato");
        tomatoes.setVegetablesPrice(2.00);
        vegetables.add(tomatoes);
        Vegetables eggs = new Vegetables();
        eggs.setVegetablesName("egg");
        eggs.setVegetablesPrice(5.00);
        vegetables.add(eggs);
        System.out.println("买菜结束");
        return vegetables;
    }

    public static void washVegetables(List<Vegetables> vegetables) {
        // 洗菜
        System.out.println("洗菜开始");
        System.out.println("洗菜逻辑");
        System.out.println("洗菜结束");
        for (Vegetables tmp : vegetables) {
            tmp.setVegetablesState("菜已清洗结束");
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值