代码的复用问题简明引入

443 阅读5分钟

——Everything that kills me make me feel alive

如果我们写一个程序算3+5的值:

class JavaDemo{
    pubic static void main(String[] args){
        int a = 3;			//这程序太蠢了,其实一句话就搞定,不用浪费两个变量的内存空间:
        int b = 5;			//System.out.println("3+5="+ 3+5);
        System.out.println("3+5="+ a+b );
    }
}

但是这个程序编译出来就只能计算3+5的值,就连让它算1+1都不行,因为我们把a和b的值定死了,如果这样设计软件的话,就算只实现计算整形数据的加法都可以把一台计算机的内存耗尽吧。这是不合适的。

所以我们现在提出了新的需求,一个程序就可以解决计算两个整形数相加,为了解决这个问题,我们可以采用从外部输入要计算的数据的模式:

import java.util.Scanner;
class JavaDemo{
    pubic static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        System.out.println("请输入a 和 b的值:");
    	int a = sc.nextInt();
        int b = sc.nextInt();
        System.out.println(a + "+" + b +" = " + a+b );
    }
}

这样在程序编译后,我们就可以每次运行的时候输入我们所要计算的整形数据进行运算,但是这个程序只能处理两个整形数据相加的情况,我们现在的需求又又变化了,那就是要实现一个程序可以进行整形数据的四则运算,那么这时候我们怎么处理才合适呢?

还是要利用外部输入达到任意两个数的运算,然后可以用条件判断语句来进行判断要计算的是四则运算的哪一种:

class JavaDemo{
    pubic static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        System.out.println("请输入a 和 b的值:");
    	int a = sc.nextInt();
        int b = sc.nextInt();
        
        System.out.prinln("请输入要进行的运算方式:(add,substract,multiple,divide):");
        //这样的程序每次运行的时候都要输入较长的英文单词,这里为了解决输入运算方式复杂的问题,
        //也可以把输入简化为1234或者首字母简写,当然也可以用枚举类进行输入限定。
        sc.nextLine(); //nextLine()会读入执行nextInt()所输入的换行符(Enter),如果不进行处理就无法为calculate赋值了,这里再次执行nextLine()用于消除以上nextInt()的影响
        String calculate = sc.nextLine();
        if(calculate = "add"){
            System.out.println("a + b = "+ a + b);
        }else if(calculate = "substract"){
            System.out.println("a - b = "+ a - b);
        }else if (calculate = "multiple"){
            System.out.println("a * b = "+ a * b);
        }else if (calculate = "divide"){
            System.out.println("a / b = "+ a / b);
        }else{
            System.out.println("input is invalid");
        }

    }
}

可是现在我们就发现了一个问题,如果我们现在想要扩充新功能,就只有重写一个新的函数,一个函数里的代码量越来越大,如果要实现的功能很多,那么可以想象当你打开后第一眼看见这个类的代码的样子:眼睛遭到了精神虐待+悲伤逆流成河,为了你的眼睛和心理健康考虑,这个时候我们把部分代码抽离出来,生成一个新的独立的静态函数,(我写的比较极端一点,能抽离的都抽离)如:把输入a和b的值抽取出来:

public static void inputValue(int a, int b){ //因为Java中的默认传值是引用传递,所以可以这样,C/C++是值传递,要使用取地址符号&才行;
		Scanner sc = new Scanner(System.in);        
        System.out.println("请输入a 和 b的值:");
    	a = sc.nextInt();
        b = sc.nextInt();    
}

再把 a 和 b 运算的部分抽离出来:

public static void calculate(int a, int b){
   		System.out.prinln("请输入要进行的运算方式:(add,substract,multiple,divide):");
        sc.nextLine(); 
        String calculate = sc.nextLine();
        if(calculate = "add"){
            System.out.println("a + b = "+ a + b);
        }else if(calculate = "substract"){
            System.out.println("a - b = "+ a - b);
        }else if (calculate = "multiple"){
            System.out.println("a * b = "+ a * b);
        }else if (calculate = "divide"){
            System.out.println("a / b = "+ a / b);
        }else{
            System.out.println("input is invalid");
        }
}

这个时候,我们的主方法里面就是这个样子了:

public static void main(String[] args){
	int a,b;
	inputValue(a,b);
	calculate(a,b);
}

瞬间感觉世界都清净了!眼睛也有神采了,心情也high起来了。这中处理就是代码的复用,代码复用可以有效的减少我们的代码量,也有利于我们的思考和检查,尤其是当程序复杂起来了之后,我们就必须使用这种方法(不过代码复用要满足代码复用原则:这里)。

现在我们用代码复用的方法来写一个程序吧:

class Person{
    private String id;
    private String name;
    private int age;
    private String sex;
    private String address;
    
    //constractor构造器
    //无参构造函数
    public Person(){}
    //带有id的构造函数
    public Person(String id){
        this();        //this()调用的是无参构造函数
        this.setId(id);
    }
    //带有id和name的构造函数
    public Person(String id,String name){
        this(id);
        this.setName(name);
    }
    //带有id、name、age的构造函数
    public Person(String id,String name,int age){
        this(id,name);
        this.setAge(age);
    }
    //带有id、name、age、sex的构造函数
    public Person(String id,String name,int age,String sex){
        this(id,name,age);
        this.setSex(sex);
    }
    //全参构造函数
    public Person(String id,String name,int age,String sex,String address){
        this(id,name,age,sex);
        this.setAddress(address);
    }
    
    //setter and getter
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

从以上程序可以看出,我们每一个构造方法充分利用了比自身少一个参数的构造方法和一个setter方法。如果按照传统的方式,我们会在构造方法体里面写上15遍的this.xxx = xxx;,代码复用以后,甚至一个都不用写了,这就是可复用带来的便利,我们的Java源码和其他编程语言源码都是把可复用的理念发挥到极致的。复用是我们技术路上开头的一个小阶梯,掌握它之后你就可以省下来一些时间,而时间是十分宝贵的,你的时间可以用来创造出很高的价值,就算“十年磨一剑”,等到出世之日,它的剑锋也能震荡江湖。而在技术的江湖中,没有腥风血雨,没有仗剑天涯,有的只是追求极致和坐而论道。

谢谢观看,希望这篇文章能对你有所帮助。