【软件重构】软件代码坏味道之滥用临时字段

举报
huahua.Dr 发表于 2022/09/03 11:29:59 2022/09/03
【摘要】 一、什么是临时字段就是临时字段的值只有在特性环境或者特性情况或者特性范围之内等条件下才有意义,没有了这些条件,这些临时字段就没用了。二、临时字段能带来什么影响1)在类中,为了满足需求临时增加的字段属性,并且增加的临时字段只是存在临时关联性,只在某些场景会使用到时,这些临时字段就会令人产生费解,应为它跟其他字段格格不入(因为它是临时加进来的),使用时不清楚是否必填,字段的输入和输出的上下文来源...

一、什么是临时字段

就是临时字段的值只有在特性环境或者特性情况或者特性范围之内等条件下才有意义,没有了这些条件,这些临时字段就没用了。

二、临时字段能带来什么影响

1)在类中,为了满足需求临时增加的字段属性,并且增加的临时字段只是存在临时关联性,只在某些场景会使用到时,这些临时字段就会令人产生费解,应为它跟其他字段格格不入(因为它是临时加进来的),使用时不清楚是否必填,字段的输入和输出的上下文来源也会令人产生误解,存在很大的误用可能。

2)在函数中,为了满足一个函数的实现需要很多参数辅助时,但又为了避免函数入参传入过多的参数;往往为了方便在改函数的类中使用很多的临时字段变量来实现这个函数功能,而这些临时字段只有在使用该函数时才会用到,却跟该类直接耦合在一起,其他情况完全无用。影响了高内聚和代码阅读的困难性。

3)临时字段是针对某些特定场景而存在的,如果误用了临时字段,可能会导致某些场景的异常。

例如:

public class exClass {

    private String filed1A;

    private String filed2A;

    private String filed1B;

    private String filed2B;

    public exClass(String filed1A, String filed2A, String filed1B, String filed2B) {

        this.filed1A = filed1A;

        this.filed2A = filed2A;

        this.filed1B = filed1B;

        this.filed2B = filed2B;

    }

    // 存在 临时filedB字段,该字段与filedA完全无关

    public void methodA(String type) {

        System.out.println("filed1A:" +filed1A);

        System.out.println("filed2A:"+filed2A);

        if (type.equals("filedB")) {

            System.out.println("filed2B:"+filed1B);

            System.out.println("filed2B:"+filed2B);

        }

    }

}

 

三、如果解决这些临时字段的问题

1)提炼类重构手法解决。当一个类做的不止一件事,存在各种不用功能函数,使用到不同的临时字段、局部变量时。果断提取类进行重构:

建立新的类,将相关的字段、局部变量和函数从旧类中迁移到新的类中,局部变量变成类的字段,若过长函数分割成这个类的多个函数,让一个类只干一件事,符合单一职责。

// classA 只做与classA相关的事情

class  classA {

    private String filed1;

    private String filed2;

    public void classA(String filed1,String filed2) {

        this.filed1 = filed1;

        this.filed2 = filed2;

    }

    public void methodA() {

        System.out.println("filed1:" +filed1);

        System.out.println("filed2:"+filed2);

    }

}

// classB 只做与classB相关的事情

class  classB {

    private String filed1;

    private String filed2;

    public void classB(String filed1,String filed2) {

        this.filed1 = filed1;

        this.filed2 = filed2;

    }

    public void method1B() {

        System.out.println("filed1:" +filed1);

    }

    public void method2B() {

        System.out.println("filed2:"+filed2);

    }

}

 

2)将临时字段作为参数进行传递。如果在一个函数中使用到了大量的临时字段,可以考虑使用传参的形式,将临时字段替换掉,若临时字段过多,需要将这些临时字段提炼到一个类中,通过对象进行传参。

class filedClass {

    private String temp1;

    private String temp2;

    private String temp3;

   

    public filedClass() {

    }

    // setting方法

    public void setTemp1(String temp1) {

        this.temp1 = temp1;

    }

    public void setTemp2(String temp2) {

        this.temp2 = temp2;

    }

    public void setTemp3(String temp3) {

        this.temp3 = temp3;

    }

    // getting方法

    public String getTemp1() {

        return temp1;

    }

    public String getTemp2() {

        return temp2;

    }

    public String getTemp3() {

        return temp3;

    }

   

}

 

class usedClass {

     // 方法:filedClass 对象作为函数入参

    public void method1(filedClass filed) {

        System.out.println(filed.getTemp1());

        System.out.println(filed.getTemp2());

        System.out.println(filed.getTemp3());

    }

}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。