《面向对象》读书笔记4
第四章 面向对象编程技术:去除冗余、进行整理
4.1 OOP具有结构化语言所没有的三种结构
类、多态和继承。
打个比方,哪些让人无法着手,难以理解的程序就像一个乱七八糟的房间。由于无法马上再这样的房间里找到需要的东西,所以我们很有可能会再次购买,或者即使将房间的某一处打扫整理干净,周围也依然是乱作一团。如果要保持清洁,平时就要多加注意,此外还需要使用清理不必要的物品(去除冗余)的吸尘器和规整 物品(整理)的收纳架。
OOp的三种结构为程序员提供了去除冗余逻辑、进行整理的功能结构。
类结构将紧密管理的子程序(函数)和全局变量汇总到一起,创建大粒度的软件构件。通过该结构,我们能够将之前分散的子程序和变量加以整理。多态和继承能够将公用子程序无法很好地处理的重复代码进行整合,彻底消除源代码的冗余。如果我们能够使用这些结构开发出通用性较高的功能,那么就可以实现多个应用程序之间的大规模重用了。
4.2 OOP的结构会根据编程语言的不同而略有差异
4.3 三大要素之一:类具有的三种功能
首先介绍三大要素中的第一个要素——类。
这里我们将类的功能总结为汇总(子程序和变量)、
隐藏(只在类内部使用的变量和子程序)和
“创建多个”(一个类创建多个实例)。
4.4 类的功能之一:汇总
//采用结构化编程的文件访问处理
//存储正在访问的文件编号的全局变量
int fileNo;
//打开文件的子程序
//通过参数接收路径名
void openFile(String pathName){
/*省略逻辑处理*/
}
//关闭文件的子程序
void closeFile(){
/*省略逻辑处理*/
}
//从文件读取一个字符的子程序
char readFile(){
/*省逻辑处理*/
}
类能汇总变量和子程序。这里所说的变量是指比如C语言中的全局变量。OOP中将类汇总的子程序称为方法,将全局变量称为实例变量(又称为“属性”字段),之后我们会根据情况使用这些术语。
//使用类进行汇总
class TextFileReader{
// 存储正在访问的文件编号的变量
int fileNo;
//打开文件()通过参数接收路径名
void open(String pathName){
...
}
//关闭文件
void close(){
...
}
//从文件读取一个字符
char read(){
...
}
}
虽然只是将子程序和变量汇总在一起而已,但汇总和整理操作本身就是有价值的。打个比方,收拾乱七八糟的屋子时,与其准备一个大箱子,不如准备多个向子分别存放衣服、CD、文具和小物件等,这样会更方便拿取物品,两者时同样的道理。
可以想像以下企业基础系统中使用的大规模应用程序,其代码往往有几十甚至几百万行。如果使用C语言平均为每个子程序编写50到100行代码,那么子程序就有几千到几万个。如果使用OOP平均再每个类中汇总10个子程序,那么类总数就会比子程序总数少一位,为几百到几千个。当然即便数量依然庞大,但所有构件的数量消减1位的效果是不容小觑的(另外,关于为了进一步整理大规模的软件而将多个类进行分组的“包”功能,后文介绍)
汇总的效果不只是减少整体构件数量。在汇总到类中时我们还略微对子程序的名称进行了修改。
为汇总后的类起合适的名称也便于查找子程序。虽然这个步骤看起来并不起眼,但它却是促进可重用的重要功能之一。无论编写的子程序质量有多高,如果因为数量太多而难以查找和调用,那么也是没有任何意义的。反之如果编写的子程序便于查找,那么对其进行重用的机会也会增加。
我们来总结以下汇总功能:
能够将紧密联系的(多个)子程序和(多个)全局变量汇总到一个类中。
优点如下
- 构件的数量会减少
- 方法(子程序)的命名变得轻松
- 方法(子程序)变得容易查找
4.5 类的功能之二:隐藏
接下来我们看看隐藏功能。
TextFileReader类中的open、close、read方法会访问fileNo变量,但其他处理则无需访问,因此最好限定够为只有这三个方法能访问该变量。
class TestFileReader{
private int fileNo;
public void open(String pathName){
...
}
public void close(){
...
}
public void read(){
...
}
}
能对其他类隐藏类中定义的变量和方法。这样一来,我们在写程序时就可已不使用全局变量了。