19.1 抽象化

首先我们来看看什么是抽象化,它有什么好处。
1.变量是数据的抽象。有了变量,我们可以更容易面对数据的变化。 假设有这样一段代码,用来计算一个班学生的花费,学生人数是30,要求每个人买8元的练习本,150元的校服,30元的班费。
double sum=30*8+30*150+30*30;
……
这段代码很少,但想象一下,整个程序用到学生人数的地方很多,全部都用了30这个数字,可能涉及到几十个类。在这里30就是重复代码,虽然它只是一个值。
突然变化来了,学生人数是31。现在的维护任务就是把所有涉及学生人数的30换成31!这实在不是一个让人喜欢的任务,而且还要小心,不能把别的本来就是30的数据替换成了31,例如上面的30元班费。 如果上面使用的是变量,那么一切都容易处理了。
int stuNum=30;
double books=8;
double suits=150;
double fee=30;
double sum=stuNum*books+stuNum*suits+stuNum*fee;
……
这样,你就把变化限定在了开头的变量定义的地方,有数据上的变化,都能轻松改变。stuNum=31就可以实现改变。
2.函数是功能的抽象。函数可以把一些反复使用的代码提取出来,某些会变化的数据抽象成参数,然后给这段代码一个名字(函数名),这段代码最后如果有计算结果,那就有返回值。
例如计算两个数字最大公约数,如果别的地方需要使用,第一反应就是复制这段代码过来用。如果应用的场景比较少没什么问题,如果使用的场景多了,那就容易出问题:万一这段代码需要修改,那岂不是所有复制粘贴过的地方都要改一遍?这个和上面的变量的情形其实是一样的。所以要使用函数,尽量减少冗余的代码。函数定义好名字,以及它需要的参数,最后调用函数可以得到结果。
3.类是类型的抽象。类是一类事物的抽象,这类事物应有的属性被抽象为成员变量,它们的功能或者说行为被抽象成了方法。
4.接口是功能的集合。接口类似于类,但它没有变量,它规定了各种方法,而且没有实现。这是更高级的一种抽象。在某些开发框架里例如SpringBoot,它的JPA接口不需要实现,由框架来实现。
5.开源项目。
Java兴盛的一大原因是开源框架的流行,各个领域的人才将他们的解决方案免费提供给所有人使用,使用者只需要引用若干个jar,就能使用强大的功能,不用写重复的代码。例如著名的Spring框架的作者Rod Johnson说过:不要重复发明轮子